diff -Nru a/CREDITS b/CREDITS
--- a/CREDITS	Thu Jan  8 23:00:24 2004
+++ b/CREDITS	Thu Jan  8 23:00:24 2004
@@ -1567,7 +1567,7 @@
 E: mk@isl.rdc.toshiba.co.jp
 E: mk@karaba.org
 W: http://www.karaba.org/~mk/
-P: 1024D/2EC7E30D 9A35 D378 F084 9EA4 EFBA  925B 1C93 B376 F0EF BE59
+P: 1024D/2EC7E30D 4DC3 949B 5A6C F0D6 375F  4472 8888 A8E1 2EC7 E30D
 D: IPsec, IPv6
 D: USAGI/WIDE Project, TOSHIBA CORPORATION
 S: 2-47-8, Takinogawa,
@@ -2669,6 +2669,13 @@
 S: 70110 Kuopio
 S: Finland
 
+N: Luca Risolia
+E: luca_ing@libero.it
+D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chip
+S: Via LibertÃ  41/a
+S: Osio Sotto, 24046, Bergamo
+S: Italy
+
 N: William E. Roadcap
 E: roadcapw@cfw.com
 W: http://www.cfw.com/~roadcapw
@@ -3569,4 +3576,4 @@
 # alphabetically. Leonard used to be very proud of being the 
 # last entry, and he'll get positively pissed if he can't even
 # be second-to-last.  (and this file really _is_ supposed to be
-# in alphabetic order) 
+# in alphabetic order)
diff -Nru a/Documentation/Changes b/Documentation/Changes
--- a/Documentation/Changes	Thu Jan  8 23:00:24 2004
+++ b/Documentation/Changes	Thu Jan  8 23:00:24 2004
@@ -56,7 +56,7 @@
 o  e2fsprogs              1.29                    # tune2fs
 o  jfsutils               1.1.3                   # fsck.jfs -V
 o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
-o  xfsprogs               2.1.0                   # xfs_db -V
+o  xfsprogs               2.6.0                   # xfs_db -V
 o  pcmcia-cs              3.1.21                  # cardmgr -V
 o  quota-tools            3.09                    # quota -V
 o  PPP                    2.4.0                   # pppd --version
@@ -183,9 +183,8 @@
 The latest version of xfsprogs contains mkfs.xfs, xfs_db, and the
 xfs_repair utilities, among others, for the XFS filesystem.  It is
 architecture independent and any version from 2.0.0 onward should
-work correctly with this version of the XFS kernel code.  For the new
-(v2) log format that has better support for stripe-size aligning on
-LVM and MD devices at least xfsprogs 2.1.0 is needed.
+work correctly with this version of the XFS kernel code (2.6.0 or
+later is recommended, due to some significant improvements).
 
 
 Pcmcia-cs
@@ -359,7 +358,7 @@
 
 Xfsprogs
 --------
-o  <ftp://oss.sgi.com/projects/xfs/download/cmd_tars/xfsprogs-2.1.0.src.tar.gz>
+o  <ftp://oss.sgi.com/projects/xfs/download/>
 
 Pcmcia-cs
 ---------
diff -Nru a/Documentation/DocBook/kernel-locking.tmpl b/Documentation/DocBook/kernel-locking.tmpl
--- a/Documentation/DocBook/kernel-locking.tmpl	Thu Jan  8 23:00:23 2004
+++ b/Documentation/DocBook/kernel-locking.tmpl	Thu Jan  8 23:00:23 2004
@@ -6,8 +6,7 @@
   
   <authorgroup>
    <author>
-    <firstname>Paul</firstname>
-    <othername>Rusty</othername>
+    <firstname>Rusty</firstname>
     <surname>Russell</surname>
     <affiliation>
      <address>
@@ -18,8 +17,8 @@
   </authorgroup>
 
   <copyright>
-   <year>2000</year>
-   <holder>Paul Russell</holder>
+   <year>2003</year>
+   <holder>Rusty Russell</holder>
   </copyright>
 
   <legalnotice>
@@ -58,16 +57,17 @@
    <para>
      Welcome, to Rusty's Remarkably Unreliable Guide to Kernel
      Locking issues.  This document describes the locking systems in
-     the Linux Kernel as we approach 2.4.
+     the Linux Kernel in 2.6.
    </para>
    <para>
-     It looks like <firstterm linkend="gloss-smp"><acronym>SMP</acronym>
-     </firstterm> is here to stay; so everyone hacking on the kernel 
-     these days needs to know the fundamentals of concurrency and locking 
-     for SMP.
+     With the wide availability of HyperThreading, and <firstterm
+     linkend="gloss-preemption">preemption </firstterm> in the Linux
+     Kernel, everyone hacking on the kernel needs to know the
+     fundamentals of concurrency and locking for
+     <firstterm linkend="gloss-smp"><acronym>SMP</acronym></firstterm>.
    </para>
 
-   <sect1 id="races">
+   <chapter id="races">
     <title>The Problem With Concurrency</title>
     <para>
       (Skip this if you know what a Race Condition is).
@@ -169,15 +169,23 @@
      </tgroup>
     </table>
 
+    <sect1 id="race-condition">
+    <title>Race Conditions and Critical Regions</title>
     <para>
-      This overlap, where what actually happens depends on the
-      relative timing of multiple tasks, is called a race condition.
+      This overlap, where the result depends on the
+      relative timing of multiple tasks, is called a <firstterm>race condition</firstterm>.
       The piece of code containing the concurrency issue is called a
-      critical region.  And especially since Linux starting running
+      <firstterm>critical region</firstterm>.  And especially since Linux starting running
       on SMP machines, they became one of the major issues in kernel
       design and implementation.
     </para>
     <para>
+      Preemption can have the same effect, even if there is only one
+      CPU: by preempting one task during the critical region, we have
+      exactly the same race condition.  In this case the thread which
+      preempts might run the critical region itself.
+    </para>
+    <para>
       The solution is to recognize when these simultaneous accesses
       occur, and use locks to make sure that only one instance can
       enter the critical region at any time.  There are many
@@ -185,10 +193,28 @@
       And then there are the unfriendly primitives, but I'll pretend
       they don't exist.
     </para>
-   </sect1>
   </chapter>
 
   <chapter id="locks">
+   <title>Locking in the Linux Kernel</title>
+
+   <para>
+     If I could give you one piece of advice: never sleep with anyone
+     crazier than yourself.  But if I had to give you advice on
+     locking: <emphasis>keep it simple</emphasis>.
+   </para>
+
+   <para>
+     Be reluctant to introduce new locks.
+   </para>
+
+   <para>
+     Strangely enough, this last one is the exact reverse of my advice when
+     you <emphasis>have</emphasis> slept with someone crazier than yourself.
+     And you should think about getting a big dog.
+   </para>
+
+   <sect1 id="lock-intro">
    <title>Two Main Types of Kernel Locks: Spinlocks and Semaphores</title>
 
    <para>
@@ -213,23 +239,32 @@
    </para>
    <para>
      Neither type of lock is recursive: see
-     <xref linkend="techniques-deadlocks">.
+     <xref linkend="deadlock">.
    </para>
+   </sect1>
  
    <sect1 id="uniprocessor">
     <title>Locks and Uniprocessor Kernels</title>
 
     <para>
-      For kernels compiled without <symbol>CONFIG_SMP</symbol>, spinlocks 
-      do not exist at all.  This is an excellent design decision: when
-      no-one else can run at the same time, there is no reason to
-      have a lock at all.
+      For kernels compiled without <symbol>CONFIG_SMP</symbol>, and
+      without <symbol>CONFIG_PREEMPT</symbol> spinlocks do not exist at
+      all.  This is an excellent design decision: when no-one else can
+      run at the same time, there is no reason to have a lock.
+    </para>
+
+    <para>
+      If the kernel is compiled without <symbol>CONFIG_SMP</symbol>,
+      but <symbol>CONFIG_PREEMPT</symbol> is set, then spinlocks
+      simply disable preemption, which is sufficient to prevent any
+      races.  For most purposes, we can think of preemption as
+      equivalent to SMP, and not worry about it separately.
     </para>
 
     <para>
       You should always test your locking code with <symbol>CONFIG_SMP</symbol>
-      enabled, even if you don't have an SMP test box, because it
-      will still catch some (simple) kinds of deadlock.
+      and <symbol>CONFIG_PREEMPT</symbol> enabled, even if you don't have an SMP test box, because it
+      will still catch some kinds of locking bugs.
     </para>
 
     <para>
@@ -239,25 +274,6 @@
     </para>
    </sect1>
 
-   <sect1 id="rwlocks">
-    <title>Read/Write Lock Variants</title>
-
-    <para>
-      Both spinlocks and semaphores have read/write variants:
-      <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>. 
-      These divide users into two classes: the readers and the writers.  If 
-      you are only reading the data, you can get a read lock, but to write to 
-      the data you need the write lock.  Many people can hold a read lock,
-      but a writer must be sole holder.
-    </para>
-
-    <para>
-      This means much smoother locking if your code divides up
-      neatly along reader/writer lines.  All the discussions below
-      also apply to read/write variants.
-    </para>
-   </sect1>
-
     <sect1 id="usercontextlocking">
      <title>Locking Only In User Context</title>
 
@@ -289,17 +305,26 @@
    </sect1>
 
    <sect1 id="lock-user-bh">
-    <title>Locking Between User Context and BHs</title>
+    <title>Locking Between User Context and Softirqs</title>
 
     <para>
-      If a <firstterm linkend="gloss-bh">bottom half</firstterm> shares 
+      If a <firstterm linkend="gloss-softirq">softirq</firstterm> shares
       data with user context, you have two problems.  Firstly, the current 
-      user context can be interrupted by a bottom half, and secondly, the 
+      user context can be interrupted by a softirq, and secondly, the
       critical region could be entered from another CPU.  This is where
       <function>spin_lock_bh()</function> 
       (<filename class=headerfile>include/linux/spinlock.h</filename>) is 
-      used.  It disables bottom halves on that CPU, then grabs the lock.
-      <function>spin_unlock_bh()</function> does the reverse.
+      used.  It disables softirqs on that CPU, then grabs the lock.
+      <function>spin_unlock_bh()</function> does the reverse.  (The
+      '_bh' suffix is a historical reference to "Bottom Halves", the
+      old name for software interrupts.  It should really be
+      called spin_lock_softirq()' in a perfect world).
+    </para>
+
+    <para>
+      Note that you can also use <function>spin_lock_irq()</function>
+      or <function>spin_lock_irqsave()</function> here, which stop
+      hardware interrupts as well: see <xref linkend="hardirq-context">.
     </para>
 
     <para>
@@ -307,70 +332,41 @@
       </acronym></firstterm> as well: the spin lock vanishes, and this macro 
       simply becomes <function>local_bh_disable()</function>
       (<filename class=headerfile>include/linux/interrupt.h</filename>), which
-      protects you from the bottom half being run.
+      protects you from the softirq being run.
     </para>
    </sect1>
 
    <sect1 id="lock-user-tasklet">
-    <title>Locking Between User Context and Tasklets/Soft IRQs</title>
+    <title>Locking Between User Context and Tasklets</title>
 
     <para>
-      This is exactly the same as above, because
-      <function>local_bh_disable()</function> actually disables all 
-      softirqs and <firstterm linkend="gloss-tasklet">tasklets</firstterm>
-      on that CPU as well.  It should really be 
-      called `local_softirq_disable()', but the name has been preserved 
-      for historical reasons.  Similarly,
-      <function>spin_lock_bh()</function> would now be called 
-      spin_lock_softirq() in a perfect world.
+      This is exactly the same as above, because <firstterm
+      linkend="gloss-tasklet">tasklets</firstterm> are actually run
+      from a softirq.
     </para>
    </sect1>
 
-   <sect1 id="lock-bh">
-    <title>Locking Between Bottom Halves</title>
+   <sect1 id="lock-user-timers">
+    <title>Locking Between User Context and Timers</title>
 
     <para>
-      Sometimes a bottom half might want to share data with
-      another bottom half (especially remember that timers are run
-      off a bottom half).
+      This, too, is exactly the same as above, because <firstterm
+      linkend="gloss-timers">timers</firstterm> are actually run from
+      a softirq.  From a locking point of view, tasklets and timers
+      are identical.
     </para>
-
-    <sect2 id="lock-bh-same">
-     <title>The Same BH</title>
-
-     <para>
-       Since a bottom half is never run on two CPUs at once, you
-       don't need to worry about your bottom half being run twice
-       at once, even on SMP.
-     </para>
-    </sect2>
-
-    <sect2 id="lock-bh-different">
-     <title>Different BHs</title>
-
-     <para>
-       Since only one bottom half ever runs at a time once, you
-       don't need to worry about race conditions with other bottom
-       halves.  Beware that things might change under you, however,
-       if someone changes your bottom half to a tasklet.  If you
-       want to make your code future-proof, pretend you're already
-       running from a tasklet (see below), and doing the extra
-       locking.  Of course, if it's five years before that happens,
-       you're gonna look like a damn fool.
-     </para>
-    </sect2>
    </sect1>
 
    <sect1 id="lock-tasklets">
-    <title>Locking Between Tasklets</title>
+    <title>Locking Between Tasklets/Timers</title>
 
     <para>
-      Sometimes a tasklet might want to share data with another
-      tasklet, or a bottom half.
+      Sometimes a tasklet or timer might want to share data with
+      another tasklet or timer.
     </para>
 
     <sect2 id="lock-tasklets-same">
-     <title>The Same Tasklet</title>
+     <title>The Same Tasklet/Timer</title>
      <para>
        Since a tasklet is never run on two CPUs at once, you don't
        need to worry about your tasklet being reentrant (running
@@ -379,10 +375,10 @@
     </sect2>
 
     <sect2 id="lock-tasklets-different">
-     <title>Different Tasklets</title>
+     <title>Different Tasklets/Timers</title>
      <para>
-       If another tasklet (or bottom half, such as a timer) wants
-       to share data with your tasklet, you will both need to use
+       If another tasklet/timer wants
+       to share data with your tasklet or timer , you will both need to use
        <function>spin_lock()</function> and
        <function>spin_unlock()</function> calls.  
        <function>spin_lock_bh()</function> is
@@ -396,8 +392,8 @@
     <title>Locking Between Softirqs</title>
 
     <para>
-      Often a <firstterm linkend="gloss-softirq">softirq</firstterm> might 
-      want to share data with itself, a tasklet, or a bottom half.
+      Often a softirq might
+      want to share data with itself or a tasklet/timer.
     </para>
 
     <sect2 id="lock-softirqs-same">
@@ -421,10 +417,10 @@
      <title>Different Softirqs</title>
 
      <para>
-       You'll need to use <function>spin_lock()</function> and 
-       <function>spin_unlock()</function> for shared data, whether it 
-       be a timer (which can be running on a different CPU), bottom half, 
-       tasklet or the same or another softirq.
+       You'll need to use <function>spin_lock()</function> and
+       <function>spin_unlock()</function> for shared data, whether it
+       be a timer, tasklet, different softirq or the same or another
+       softirq: any of them could be running on a different CPU.
      </para>
     </sect2>
    </sect1>
@@ -434,13 +430,13 @@
    <title>Hard IRQ Context</title>
 
    <para>
-     Hardware interrupts usually communicate with a bottom half,
+     Hardware interrupts usually communicate with a
      tasklet or softirq.  Frequently this involves putting work in a
-     queue, which the BH/softirq will take out.
+     queue, which the softirq will take out.
    </para>
 
    <sect1 id="hardirq-softirq">
-    <title>Locking Between Hard IRQ and Softirqs/Tasklets/BHs</title>
+    <title>Locking Between Hard IRQ and Softirqs/Tasklets</title>
 
     <para>
       If a hardware irq handler shares data with a softirq, you have
@@ -453,6 +449,16 @@
     </para>
 
     <para>
+      The irq handler does not to use
+      <function>spin_lock_irq()</function>, because the softirq cannot
+      run while the irq handler is running: it can use
+      <function>spin_lock()</function>, which is slightly faster.  The
+      only exception would be if a different hardware irq handler uses
+      the same lock: <function>spin_lock_irq()</function> will stop
+      that from interrupting us.
+    </para>
+
+    <para>
       This works perfectly for UP as well: the spin lock vanishes,
       and this macro simply becomes <function>local_irq_disable()</function>
       (<filename class=headerfile>include/asm/smp.h</filename>), which 
@@ -468,60 +474,766 @@
       interrupts are already off) and in softirqs (where the irq
       disabling is required).
     </para>
+
+    <para>
+      Note that softirqs (and hence tasklets and timers) are run on
+      return from hardware interrupts, so
+      <function>spin_lock_irq()</function> also stops these.  In that
+      sense, <function>spin_lock_irqsave()</function> is the most
+      general and powerful locking function.
+    </para>
+
+   </sect1>
+   <sect1 id="hardirq-hardirq">
+    <title>Locking Between Two Hard IRQ Handlers</title>
+    <para>
+      It is rare to have to share data between two IRQ handlers, but
+      if you do, <function>spin_lock_irqsave()</function> should be
+      used: it is architecture-specific whether all interrupts are
+      disabled inside irq handlers themselves.
+    </para>
    </sect1>
-  </chapter>
 
-  <chapter id="common-techniques">
-   <title>Common Techniques</title>
+  </chapter>
 
+  <chapter id="cheatsheet">
+   <title>Cheat Sheet For Locking</title>
    <para>
-     This section lists some common dilemmas and the standard
-     solutions used in the Linux kernel code.  If you use these,
-     people will find your code simpler to understand.
+     Pete Zaitcev gives the following summary:
    </para>
+   <itemizedlist>
+      <listitem>
+	<para>
+          If you are in a process context (any syscall) and want to
+	lock other process out, use a semaphore.  You can take a semaphore
+	and sleep (<function>copy_from_user*(</function> or
+	<function>kmalloc(x,GFP_KERNEL)</function>).
+      </para>
+      </listitem>
+      <listitem>
+	<para>
+	Otherwise (== data can be touched in an interrupt), use
+	<function>spin_lock_irqsave()</function> and
+	<function>spin_unlock_irqrestore()</function>.
+	</para>
+      </listitem>
+      <listitem>
+	<para>
+	Avoid holding spinlock for more than 5 lines of code and
+	across any function call (except accessors like
+	<function>readb</function>).
+	</para>
+      </listitem>
+    </itemizedlist>
 
-   <para>
-     If I could give you one piece of advice: never sleep with anyone
-     crazier than yourself.  But if I had to give you advice on
-     locking: <emphasis>keep it simple</emphasis>.
-   </para>
+   <sect1 id="minimum-lock-reqirements">
+   <title>Table of Minimum Requirements</title>
 
-   <para>
-     Lock data, not code.
+   <para> The following table lists the <emphasis>minimum</emphasis>
+	locking requirements between various contexts.  In some cases,
+	the same context can only be running on one CPU at a time, so
+	no locking is required for that context (eg. a particular
+	thread can only run on one CPU at a time, but if it needs
+	shares data with another thread, locking is required).
    </para>
-
    <para>
-     Be reluctant to introduce new locks.
+	Remember the advice above: you can always use
+	<function>spin_lock_irqsave()</function>, which is a superset
+	of all other spinlock primitives.
    </para>
+   <table>
+<title>Table of Locking Requirements</title>
+<TGROUP COLS=11>
+<TBODY>
+<ROW>
+<ENTRY></ENTRY>
+<ENTRY>IRQ Handler A</ENTRY>
+<ENTRY>IRQ Handler B</ENTRY>
+<ENTRY>Softirq A</ENTRY>
+<ENTRY>Softirq B</ENTRY>
+<ENTRY>Tasklet A</ENTRY>
+<ENTRY>Tasklet B</ENTRY>
+<ENTRY>Timer A</ENTRY>
+<ENTRY>Timer B</ENTRY>
+<ENTRY>User Context A</ENTRY>
+<ENTRY>User Context B</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>IRQ Handler A</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>IRQ Handler B</ENTRY>
+<ENTRY>spin_lock_irqsave</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Softirq A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Softirq B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Tasklet A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Tasklet B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Timer A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>Timer B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>spin_lock</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>User Context A</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+<ROW>
+<ENTRY>User Context B</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_irq</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>spin_lock_bh</ENTRY>
+<ENTRY>down_interruptible</ENTRY>
+<ENTRY>None</ENTRY>
+</ROW>
+
+</TBODY>
+</TGROUP>
+</TABLE>
+</chapter>
+
+  <chapter id="Examples">
+   <title>Common Examples</title>
+    <para>
+Let's step through a simple example: a cache of number to name
+mappings.  The cache keeps a count of how often each of the objects is
+used, and when it gets full, throws out the least used one.
+
+    </para>
+
+   <sect1 id="examples-usercontext">
+    <title>All In User Context</title>
+    <para>
+For our first example, we assume that all operations are in user
+context (ie. from system calls), so we can sleep.  This means we can
+use a semaphore to protect the cache and all the objects within
+it.  Here's the code:
+    </para>
 
-   <para>
-     Strangely enough, this is the exact reverse of my advice when
-     you <emphasis>have</emphasis> slept with someone crazier than yourself.
-   </para>
+    <programlisting>
+#include &lt;linux/list.h&gt;
+#include &lt;linux/slab.h&gt;
+#include &lt;linux/string.h&gt;
+#include &lt;asm/semaphore.h&gt;
+#include &lt;asm/errno.h&gt;
+
+struct object
+{
+        struct list_head list;
+        int id;
+        char name[32];
+        int popularity;
+};
+
+/* Protects the cache, cache_num, and the objects within it */
+static DECLARE_MUTEX(cache_lock);
+static LIST_HEAD(cache);
+static unsigned int cache_num = 0;
+#define MAX_CACHE_SIZE 10
+
+/* Must be holding cache_lock */
+static struct object *__cache_find(int id)
+{
+        struct object *i;
+
+        list_for_each_entry(i, &amp;cache, list)
+                if (i-&gt;id == id) {
+                        i-&gt;popularity++;
+                        return i;
+                }
+        return NULL;
+}
 
-   <sect1 id="techniques-no-writers">
-    <title>No Writers in Interrupt Context</title>
+/* Must be holding cache_lock */
+static void __cache_delete(struct object *obj)
+{
+        BUG_ON(!obj);
+        list_del(&amp;obj-&gt;list);
+        kfree(obj);
+        cache_num--;
+}
+
+/* Must be holding cache_lock */
+static void __cache_add(struct object *obj)
+{
+        list_add(&amp;obj-&gt;list, &amp;cache);
+        if (++cache_num > MAX_CACHE_SIZE) {
+                struct object *i, *outcast = NULL;
+                list_for_each_entry(i, &amp;cache, list) {
+                        if (!outcast || i-&gt;popularity &lt; outcast-&gt;popularity)
+                                outcast = i;
+                }
+                __cache_delete(outcast);
+        }
+}
 
-    <para>
-      There is a fairly common case where an interrupt handler needs
-      access to a critical region, but does not need write access.
-      In this case, you do not need to use
-      <function>read_lock_irq()</function>, but only
-      <function>read_lock()</function> everywhere (since if an interrupt 
-      occurs, the irq handler will only try to grab a read lock, which 
-      won't deadlock).  You will still need to use 
-      <function>write_lock_irq()</function>.
+int cache_add(int id, const char *name)
+{
+        struct object *obj;
+
+        if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
+                return -ENOMEM;
+
+        strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+        obj-&gt;id = id;
+        obj-&gt;popularity = 0;
+
+        down(&amp;cache_lock);
+        __cache_add(obj);
+        up(&amp;cache_lock);
+        return 0;
+}
+
+void cache_delete(int id)
+{
+        down(&amp;cache_lock);
+        __cache_delete(__cache_find(id));
+        up(&amp;cache_lock);
+}
+
+int cache_find(int id, char *name)
+{
+        struct object *obj;
+        int ret = -ENOENT;
+
+        down(&amp;cache_lock);
+        obj = __cache_find(id);
+        if (obj) {
+                ret = 0;
+                strcpy(name, obj-&gt;name);
+        }
+        up(&amp;cache_lock);
+        return ret;
+}
+</programlisting>
+
+    <para>
+Note that we always make sure we have the cache_lock when we add,
+delete, or look up the cache: both the cache infrastructure itself and
+the contents of the objects are protected by the lock.  In this case
+it's easy, since we copy the data for the user, and never let them
+access the objects directly.
+    </para>
+    <para>
+There is a slight (and common) optimization here: in
+<function>cache_add</function> we set up the fields of the object
+before grabbing the lock.  This is safe, as no-one else can access it
+until we put it in cache.
+    </para>
+    </sect1>
+
+   <sect1 id="examples-interrupt">
+    <title>Accessing From Interrupt Context</title>
+    <para>
+Now consider the case where <function>cache_find</function> can be
+called from interrupt context: either a hardware interrupt or a
+softirq.  An example would be a timer which deletes object from the
+cache.
+    </para>
+    <para>
+The change is shown below, in standard patch format: the
+<symbol>-</symbol> are lines which are taken away, and the
+<symbol>+</symbol> are lines which are added.
+    </para>
+<programlisting>
+--- cache.c.usercontext	2003-12-09 13:58:54.000000000 +1100
++++ cache.c.interrupt	2003-12-09 14:07:49.000000000 +1100
+@@ -12,7 +12,7 @@
+         int popularity;
+ };
+
+-static DECLARE_MUTEX(cache_lock);
++static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
+ static LIST_HEAD(cache);
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+@@ -55,6 +55,7 @@
+ int cache_add(int id, const char *name)
+ {
+         struct object *obj;
++        unsigned long flags;
+
+         if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
+                 return -ENOMEM;
+@@ -63,30 +64,33 @@
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+
+-        down(&amp;cache_lock);
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return 0;
+ }
+
+ void cache_delete(int id)
+ {
+-        down(&amp;cache_lock);
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_delete(__cache_find(id));
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+ }
+
+ int cache_find(int id, char *name)
+ {
+         struct object *obj;
+         int ret = -ENOENT;
++        unsigned long flags;
+
+-        down(&amp;cache_lock);
++        spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+         if (obj) {
+                 ret = 0;
+                 strcpy(name, obj-&gt;name);
+         }
+-        up(&amp;cache_lock);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return ret;
+ }
+</programlisting>
+
+    <para>
+Note that the <function>spin_lock_irqsave</function> will turn off
+interrupts if they are on, otherwise does nothing (if we are already
+in an interrupt handler), hence these functions are safe to call from
+any context.
+    </para>
+    <para>
+Unfortunately, <function>cache_add</function> calls
+<function>kmalloc</function> with the <symbol>GFP_KERNEL</symbol>
+flag, which is only legal in user context.  I have assumed that
+<function>cache_add</function> is still only called in user context,
+otherwise this should become a parameter to
+<function>cache_add</function>.
+    </para>
+  </sect1>
+   <sect1 id="examples-refcnt">
+    <title>Exposing Objects Outside This File</title>
+    <para>
+If our objects contained more information, it might not be sufficient
+to copy the information in and out: other parts of the code might want
+to keep pointers to these objects, for example, rather than looking up
+the id every time.  This produces two problems.
+    </para>
+    <para>
+The first problem is that we use the <symbol>cache_lock</symbol> to
+protect objects: we'd need to make this non-static so the rest of the
+code can use it.  This makes locking trickier, as it is no longer all
+in one place.
+    </para>
+    <para>
+The second problem is the lifetime problem: if another structure keeps
+a pointer to an object, it presumably expects that pointer to remain
+valid.  Unfortunately, this is only guaranteed while you hold the
+lock, otherwise someone might call <function>cache_delete</function>
+and even worse, add another object, re-using the same address.
+    </para>
+    <para>
+As there is only one lock, you can't hold it forever: no-one else would
+get any work done.
+    </para>
+    <para>
+The solution to this problem is to use a reference count: everyone who
+has a pointer to the object increases it when they first get the
+object, and drops the reference count when they're finished with it.
+Whoever drops it to zero knows it is unused, and can actually delete it.
+    </para>
+    <para>
+Here is the code:
+    </para>
+
+<programlisting>
+--- cache.c.interrupt	2003-12-09 14:25:43.000000000 +1100
++++ cache.c.refcnt	2003-12-09 14:33:05.000000000 +1100
+@@ -7,6 +7,7 @@
+ struct object
+ {
+         struct list_head list;
++        unsigned int refcnt;
+         int id;
+         char name[32];
+         int popularity;
+@@ -17,6 +18,35 @@
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+
++static void __object_put(struct object *obj)
++{
++        if (--obj-&gt;refcnt == 0)
++                kfree(obj);
++}
++
++static void __object_get(struct object *obj)
++{
++        obj-&gt;refcnt++;
++}
++
++void object_put(struct object *obj)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
++        __object_put(obj);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
++}
++
++void object_get(struct object *obj)
++{
++        unsigned long flags;
++
++        spin_lock_irqsave(&amp;cache_lock, flags);
++        __object_get(obj);
++        spin_unlock_irqrestore(&amp;cache_lock, flags);
++}
++
+ /* Must be holding cache_lock */
+ static struct object *__cache_find(int id)
+ {
+@@ -35,6 +65,7 @@
+ {
+         BUG_ON(!obj);
+         list_del(&amp;obj-&gt;list);
++        __object_put(obj);
+         cache_num--;
+ }
+
+@@ -63,6 +94,7 @@
+         strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
++        obj-&gt;refcnt = 1; /* The cache holds a reference */
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -79,18 +111,15 @@
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+ }
+
+-int cache_find(int id, char *name)
++struct object *cache_find(int id)
+ {
+         struct object *obj;
+-        int ret = -ENOENT;
+         unsigned long flags;
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+-        if (obj) {
+-                ret = 0;
+-                strcpy(name, obj-&gt;name);
+-        }
++        if (obj)
++                __object_get(obj);
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+-        return ret;
++        return obj;
+ }
+</programlisting>
+
+<para>
+We encapsulate the reference counting in the standard 'get' and 'put'
+functions.  Now we can return the object itself from
+<function>cache_find</function> which has the advantage that the user
+can now sleep holding the object (eg. to
+<function>copy_to_user</function> to name to userspace).
+</para>
+<para>
+The other point to note is that I said a reference should be held for
+every pointer to the object: thus the reference count is 1 when first
+inserted into the cache.  In some versions the framework does not hold
+a reference count, but they are more complicated.
+</para>
+
+   <sect2 id="examples-refcnt-atomic">
+    <title>Using Atomic Operations For The Reference Count</title>
+<para>
+In practice, <type>atomic_t</type> would usually be used for
+<structfield>refcnt</structfield>.  There are a number of atomic
+operations defined in
+
+<filename class=headerfile>include/asm/atomic.h</filename>: these are
+guaranteed to be seen atomically from all CPUs in the system, so no
+lock is required.  In this case, it is simpler than using spinlocks,
+although for anything non-trivial using spinlocks is clearer.  The
+<function>atomic_inc</function> and
+<function>atomic_dec_and_test</function> are used instead of the
+standard increment and decrement operators, and the lock is no longer
+used to protect the reference count itself.
+</para>
+
+<programlisting>
+--- cache.c.refcnt	2003-12-09 15:00:35.000000000 +1100
++++ cache.c.refcnt-atomic	2003-12-11 15:49:42.000000000 +1100
+@@ -7,7 +7,7 @@
+ struct object
+ {
+         struct list_head list;
+-        unsigned int refcnt;
++        atomic_t refcnt;
+         int id;
+         char name[32];
+         int popularity;
+@@ -18,33 +18,15 @@
+ static unsigned int cache_num = 0;
+ #define MAX_CACHE_SIZE 10
+
+-static void __object_put(struct object *obj)
+-{
+-        if (--obj-&gt;refcnt == 0)
+-                kfree(obj);
+-}
+-
+-static void __object_get(struct object *obj)
+-{
+-        obj-&gt;refcnt++;
+-}
+-
+ void object_put(struct object *obj)
+ {
+-        unsigned long flags;
+-
+-        spin_lock_irqsave(&amp;cache_lock, flags);
+-        __object_put(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        if (atomic_dec_and_test(&amp;obj-&gt;refcnt))
++                kfree(obj);
+ }
+
+ void object_get(struct object *obj)
+ {
+-        unsigned long flags;
+-
+-        spin_lock_irqsave(&amp;cache_lock, flags);
+-        __object_get(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        atomic_inc(&amp;obj-&gt;refcnt);
+ }
+
+ /* Must be holding cache_lock */
+@@ -65,7 +47,7 @@
+ {
+         BUG_ON(!obj);
+         list_del(&amp;obj-&gt;list);
+-        __object_put(obj);
++        object_put(obj);
+         cache_num--;
+ }
+
+@@ -94,7 +76,7 @@
+         strlcpy(obj-&gt;name, name, sizeof(obj-&gt;name));
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+-        obj-&gt;refcnt = 1; /* The cache holds a reference */
++        atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -119,7 +101,7 @@
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         obj = __cache_find(id);
+         if (obj)
+-                __object_get(obj);
++                object_get(obj);
+         spin_unlock_irqrestore(&amp;cache_lock, flags);
+         return obj;
+ }
+</programlisting>
+</sect1>
+
+   <sect1 id="examples-lock-per-obj">
+    <title>Protecting The Objects Themselves</title>
+    <para>
+In these examples, we assumed that the objects (except the reference
+counts) never changed once they are created.  If we wanted to allow
+the name to change, there are three possibilities:
     </para>
+    <itemizedlist>
+      <listitem>
+	<para>
+You can make <symbol>cache_lock</symbol> non-static, and tell people
+to grab that lock before changing the name in any object.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+You can provide a <function>cache_obj_rename</function> which grabs
+this lock and changes the name for the caller, and tell everyone to
+use that function.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+You can make the <symbol>cache_lock</symbol> protect only the cache
+itself, and use another lock to protect the name.
+        </para>
+      </listitem>
+    </itemizedlist>
 
-    <para>
-      Similar logic applies to locking between softirqs/tasklets/BHs
-      which never need a write lock, and user context: 
-      <function>read_lock()</function> and
-      <function>write_lock_bh()</function>.
-    </para>
-   </sect1>
+      <para>
+Theoretically, you can make the locks as fine-grained as one lock for
+every field, for every object.  In practice, the most common variants
+are:
+</para>
+    <itemizedlist>
+      <listitem>
+	<para>
+One lock which protects the infrastructure (the <symbol>cache</symbol>
+list in this example) and all the objects.  This is what we have done
+so far.
+	</para>
+      </listitem>
+      <listitem>
+        <para>
+One lock which protects the infrastructure (including the list
+pointers inside the objects), and one lock inside the object which
+protects the rest of that object.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+Multiple locks to protect the infrastructure (eg. one lock per hash
+chain), possibly with a separate per-object lock.
+        </para>
+      </listitem>
+    </itemizedlist>
 
-   <sect1 id="techniques-deadlocks">
+<para>
+Here is the "lock-per-object" implementation:
+</para>
+<programlisting>
+--- cache.c.refcnt-atomic	2003-12-11 15:50:54.000000000 +1100
++++ cache.c.perobjectlock	2003-12-11 17:15:03.000000000 +1100
+@@ -6,11 +6,17 @@
+
+ struct object
+ {
++        /* These two protected by cache_lock. */
+         struct list_head list;
++        int popularity;
++
+         atomic_t refcnt;
++
++        /* Doesn't change once created. */
+         int id;
++
++        spinlock_t lock; /* Protects the name */
+         char name[32];
+-        int popularity;
+ };
+
+ static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
+@@ -77,6 +84,7 @@
+         obj-&gt;id = id;
+         obj-&gt;popularity = 0;
+         atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
++        spin_lock_init(&amp;obj-&gt;lock);
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+</programlisting>
+
+<para>
+Note that I decide that the <structfield>popularity</structfield>
+count should be protected by the <symbol>cache_lock</symbol> rather
+than the per-object lock: this is because it (like the
+<structname>struct list_head</structname> inside the object) is
+logically part of the infrastructure.  This way, I don't need to grab
+the lock of every object in <function>__cache_add</function> when
+seeking the least popular.
+</para>
+
+<para>
+I also decided that the <structfield>id</structfield> member is
+unchangeable, so I don't need to grab each object lock in
+<function>__cache_find()</function> to examine the
+<structfield>id</structfield>: the object lock is only used by a
+caller who wants to read or write the <structfield>name</structfield>
+field.
+</para>
+
+<para>
+Note also that I added a comment describing what data was protected by
+which locks.  This is extremely important, as it describes the runtime
+behavior of the code, and can be hard to gain from just reading.  And
+as Alan Cox says, <quote>Lock data, not code</quote>.
+</para>
+</chapter>
+
+   <chapter id="common-problems">
+    <title>Common Problems</title>
+    <sect1 id="deadlock">
     <title>Deadlock: Simple and Advanced</title>
 
     <para>
@@ -535,10 +1247,10 @@
 
     <para>
       For a slightly more complex case, imagine you have a region
-      shared by a bottom half and user context.  If you use a
+      shared by a softirq and user context.  If you use a
       <function>spin_lock()</function> call to protect it, it is 
-      possible that the user context will be interrupted by the bottom 
-      half while it holds the lock, and the bottom half will then spin 
+      possible that the user context will be interrupted by the softirq
+      while it holds the lock, and the softirq will then spin
       forever trying to get the same lock.
     </para>
 
@@ -558,7 +1270,7 @@
     </para>
 
     <para>
-      A more complex problem is the so-called `deadly embrace',
+      A more complex problem is the so-called 'deadly embrace',
       involving two or more locks.  Say you have a hash table: each
       entry in the table is a spinlock, and a chain of hashed
       objects.  Inside a softirq handler, you sometimes want to
@@ -606,7 +1318,7 @@
       their lock.  It will look, smell, and feel like a crash.
     </para>
 
-    <sect2 id="techs-deadlock-prevent">
+    <sect1 id="techs-deadlock-prevent">
      <title>Preventing Deadlock</title>
 
      <para>
@@ -634,7 +1346,6 @@
        will do?).  Remember, the other programmers are out to get
        you, so don't do this.
      </para>
-    </sect2>
 
     <sect2 id="techs-deadlock-overprevent">
      <title>Overzealous Prevention Of Deadlocks</title>
@@ -650,266 +1361,481 @@
        If you don't see why, please stay the fuck away from my code.
      </para>
     </sect2>
-   </sect1>
+    </sect1>
 
-   <sect1 id="per-cpu">
-    <title>Per-CPU Data</title>
-      
-    <para>
-      A great technique for avoiding locking which is used fairly
-      widely is to duplicate information for each CPU.  For example,
-      if you wanted to keep a count of a common condition, you could
-      use a spin lock and a single counter.  Nice and simple.
-    </para>
+   <sect1 id="racing-timers">
+    <title>Racing Timers: A Kernel Pastime</title>
 
     <para>
-      If that was too slow [it's probably not], you could instead
-      use a counter for each CPU [don't], then none of them need an
-      exclusive lock [you're wasting your time here].  To make sure
-      the CPUs don't have to synchronize caches all the time, align
-      the counters to cache boundaries by appending
-      `__cacheline_aligned' to the declaration
-      (<filename class=headerfile>include/linux/cache.h</filename>). 
-      [Can't you think of anything better to do?]
+      Timers can produce their own special problems with races.
+      Consider a collection of objects (list, hash, etc) where each
+      object has a timer which is due to destroy it.
     </para>
 
     <para>
-      They will need a read lock to access their own counters,
-      however.  That way you can use a write lock to grant exclusive
-      access to all of them at once, to tally them up.
+      If you want to destroy the entire collection (say on module
+      removal), you might do the following:
     </para>
-   </sect1>
 
-   <sect1 id="brlock">
-    <title>Big Reader Locks</title>
+    <programlisting>
+        /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
+           HUNGARIAN NOTATION */
+        spin_lock_bh(&amp;list_lock);
 
-    <para>
-      A classic example of per-CPU information is Ingo's `big
-      reader' locks 
-      (<filename class=headerfile>linux/include/brlock.h</filename>).  These 
-      use the Per-CPU Data techniques described above to create a lock which 
-      is very fast to get a read lock, but agonizingly slow for a write
-      lock.
-    </para>
+        while (list) {
+                struct foo *next = list-&gt;next;
+                del_timer(&amp;list-&gt;timer);
+                kfree(list);
+                list = next;
+        }
+
+        spin_unlock_bh(&amp;list_lock);
+    </programlisting>
 
     <para>
-      Fortunately, there are a limited number of these locks
-      available: you have to go through a strict interview process
-      to get one.
+      Sooner or later, this will crash on SMP, because a timer can
+      have just gone off before the <function>spin_lock_bh()</function>,
+      and it will only get the lock after we
+      <function>spin_unlock_bh()</function>, and then try to free
+      the element (which has already been freed!).
     </para>
-   </sect1>
-
-   <sect1 id="lock-avoidance-rw">
-    <title>Avoiding Locks: Read And Write Ordering</title>
 
     <para>
-      Sometimes it is possible to avoid locking.  Consider the
-      following case from the 2.2 firewall code, which inserted an
-      element into a single linked list in user context:
+      This can be avoided by checking the result of
+      <function>del_timer()</function>: if it returns
+      <returnvalue>1</returnvalue>, the timer has been deleted.
+      If <returnvalue>0</returnvalue>, it means (in this
+      case) that it is currently running, so we can do:
     </para>
 
     <programlisting>
-        new-&gt;next = i-&gt;next;
-        i-&gt;next = new;
-    </programlisting>
+        retry:
+                spin_lock_bh(&amp;list_lock);
 
-    <para>
-      Here the author (Alan Cox, who knows what he's doing) assumes
-      that the pointer assignments are atomic.  This is important,
-      because networking packets would traverse this list on bottom
-      halves without a lock.  Depending on their exact timing, they
-      would either see the new element in the list with a valid 
-      <structfield>next</structfield> pointer, or it would not be in the 
-      list yet.  A lock is still required against other CPUs inserting
-      or deleting from the list, of course.
-    </para>
+                while (list) {
+                        struct foo *next = list-&gt;next;
+                        if (!del_timer(&amp;list-&gt;timer)) {
+                                /* Give timer a chance to delete this */
+                                spin_unlock_bh(&amp;list_lock);
+                                goto retry;
+                        }
+                        kfree(list);
+                        list = next;
+                }
 
-    <para>
-      Of course, the writes <emphasis>must</emphasis> be in this
-      order, otherwise the new element appears in the list with an
-      invalid <structfield>next</structfield> pointer, and any other 
-      CPU iterating at the wrong time will jump through it into garbage.  
-      Because modern CPUs reorder, Alan's code actually read as follows:
-    </para>
-      
-    <programlisting>
-        new-&gt;next = i-&gt;next;
-        wmb();
-        i-&gt;next = new;
+                spin_unlock_bh(&amp;list_lock);
     </programlisting>
 
     <para>
-      The <function>wmb()</function> is a write memory barrier 
-      (<filename class=headerfile>include/asm/system.h</filename>): neither 
-      the compiler nor the CPU will allow any writes to memory after the 
-      <function>wmb()</function> to be visible to other hardware
-      before any of the writes before the <function>wmb()</function>.
+      Another common problem is deleting timers which restart
+      themselves (by calling <function>add_timer()</function> at the end
+      of their timer function).  Because this is a fairly common case
+      which is prone to races, you should use <function>del_timer_sync()</function>
+      (<filename class=headerfile>include/linux/timer.h</filename>)
+      to handle this case.  It returns the number of times the timer
+      had to be deleted before we finally stopped it from adding itself back
+      in.
     </para>
+   </sect1>
 
-    <para>
-      As i386 does not do write reordering, this bug would never
-      show up on that platform.  On other SMP platforms, however, it
-      will.
-    </para>
+   <sect1 id="sparc">
+    <title>The Fucked Up Sparc</title>
 
     <para>
-      There is also <function>rmb()</function> for read ordering: to ensure 
-      any previous variable reads occur before following reads.  The simple
-      <function>mb()</function> macro combines both 
-      <function>rmb()</function> and <function>wmb()</function>.
+      Alan Cox says <quote>the irq disable/enable is in the register
+      window on a sparc</quote>.  Andi Kleen says <quote>when you do
+      restore_flags in a different function you mess up all the
+      register windows</quote>.
     </para>
 
     <para>
-      Some atomic operations are defined to act as a memory barrier
-      (ie. as per the <function>mb()</function> macro, but if in
-      doubt, be explicit.
-      <!-- Rusty Russell 2 May 2001, 2.4.4 -->
-      Also,
-      spinlock operations act as partial barriers: operations after
-      gaining a spinlock will never be moved to precede the
-      <function>spin_lock()</function> call, and operations before
-      releasing a spinlock will never be moved after the
-      <function>spin_unlock()</function> call.
-      <!-- Manfred Spraul <manfreds@colorfullife.com>
-           24 May 2000 2.3.99-pre9 -->
+      So never pass the flags word set by
+      <function>spin_lock_irqsave()</function> and brethren to another
+      function (unless it's declared <type>inline</type>).  Usually no-one
+      does this, but now you've been warned.  Dave Miller can never do
+      anything in a straightforward manner (I can say that, because I have
+      pictures of him and a certain PowerPC maintainer in a compromising
+      position).
     </para>
    </sect1>
 
-   <sect1 id="lock-avoidance-atomic-ops">
-    <title>Avoiding Locks: Atomic Operations</title>
+  </chapter>
+
+ <chapter id="Efficiency">
+    <title>Locking Speed</title>
 
     <para>
-      There are a number of atomic operations defined in
-      <filename class=headerfile>include/asm/atomic.h</filename>: these 
-      are guaranteed to be seen atomically from all CPUs in the system, thus 
-      avoiding races. If your shared data consists of a single counter, say, 
-      these operations might be simpler than using spinlocks (although for
-      anything non-trivial using spinlocks is clearer).
+There are three main things to worry about when considering speed of
+some code which does locking.  First is concurrency: how many things
+are going to be waiting while someone else is holding a lock.  Second
+is the time taken to actually acquire and release an uncontended lock.
+Third is using fewer, or smarter locks.  I'm assuming that the lock is
+used fairly often: otherwise, you wouldn't be concerned about
+efficiency.
+</para>
+    <para>
+Concurrency depends on how long the lock is usually held: you should
+hold the lock for as long as needed, but no longer.  In the cache
+example, we always create the object without the lock held, and then
+grab the lock only when we are ready to insert it in the list.
+</para>
+    <para>
+Acquisition times depend on how much damage the lock operations do to
+the pipeline (pipeline stalls) and how likely it is that this CPU was
+the last one to grab the lock (ie. is the lock cache-hot for this
+CPU): on a machine with more CPUs, this likelihood drops fast.
+Consider a 700MHz Intel Pentium III: an instruction takes about 0.7ns,
+an atomic increment takes about 58ns, a lock which is cache-hot on
+this CPU takes 160ns, and a cacheline transfer from another CPU takes
+an additional 170 to 360ns.  (These figures from Paul McKenney's
+<ulink url="http://www.linuxjournal.com/article.php?sid=6993"> Linux
+Journal RCU article</ulink>).
+</para>
+    <para>
+These two aims conflict: holding a lock for a short time might be done
+by splitting locks into parts (such as in our final per-object-lock
+example), but this increases the number of lock acquisitions, and the
+results are often slower than having a single lock.  This is another
+reason to advocate locking simplicity.
+</para>
+    <para>
+The third concern is addressed below: there are some methods to reduce
+the amount of locking which needs to be done.
+</para>
+
+  <sect1 id="efficiency-rwlocks">
+   <title>Read/Write Lock Variants</title>
+
+   <para>
+      Both spinlocks and semaphores have read/write variants:
+      <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
+      These divide users into two classes: the readers and the writers.  If
+      you are only reading the data, you can get a read lock, but to write to
+      the data you need the write lock.  Many people can hold a read lock,
+      but a writer must be sole holder.
     </para>
 
-    <para>
-      Note that the atomic operations do in general not act as memory
-      barriers. Instead you can insert a memory barrier before or
-      after <function>atomic_inc()</function> or
-      <function>atomic_dec()</function> by inserting
-      <function>smp_mb__before_atomic_inc()</function>,
-      <function>smp_mb__after_atomic_inc()</function>,
-      <function>smp_mb__before_atomic_dec()</function> or
-      <function>smp_mb__after_atomic_dec()</function>
-      respectively. The advantage of using those macros instead of
-      <function>smp_mb()</function> is, that they are cheaper on some
-      platforms.    
-      <!-- Sebastian Wilhelmi <seppi@seppi.de> 2002-03-04 -->
+   <para>
+      If your code divides neatly along reader/writer lines (as our
+      cache code does), and the lock is held by readers for
+      significant lengths of time, using these locks can help.  They
+      are slightly slower than the normal locks though, so in practice
+      <type>rwlock_t</type> is not usually worthwhile.
     </para>
    </sect1>
 
-   <sect1 id="ref-counts">
-    <title>Protecting A Collection of Objects: Reference Counts</title>
+   <sect1 id="efficiency-read-copy-update">
+    <title>Avoiding Locks: Read Copy Update</title>
 
     <para>
-      Locking a collection of objects is fairly easy: you get a
-      single spinlock, and you make sure you grab it before
-      searching, adding or deleting an object.
+      There is a special method of read/write locking called Read Copy
+      Update.  Using RCU, the readers can avoid taking a lock
+      altogether: as we expect our cache to be read more often than
+      updated (otherwise the cache is a waste of time), it is a
+      candidate for this optimization.
     </para>
 
     <para>
-      The purpose of this lock is not to protect the individual
-      objects: you might have a separate lock inside each one for
-      that.  It is to protect the <emphasis>data structure
-      containing the objects</emphasis> from race conditions.  Often
-      the same lock is used to protect the contents of all the
-      objects as well, for simplicity, but they are inherently
-      orthogonal (and many other big words designed to confuse).
+      How do we get rid of read locks?  Getting rid of read locks
+      means that writers may be changing the list underneath the
+      readers.  That is actually quite simple: we can read a linked
+      list while an element is being added if the writer adds the
+      element very carefully.  For example, adding
+      <symbol>new</symbol> to a single linked list called
+      <symbol>list</symbol>:
     </para>
 
+    <programlisting>
+        new-&gt;next = list-&gt;next;
+        wmb();
+        list-&gt;next = new;
+    </programlisting>
+
     <para>
-      Changing this to a read-write lock will often help markedly if
-      reads are far more common that writes.  If not, there is
-      another approach you can use to reduce the time the lock is
-      held: reference counts.
+      The <function>wmb()</function> is a write memory barrier.  It
+      ensures that the first operation (setting the new element's
+      <symbol>next</symbol> pointer) is complete and will be seen by
+      all CPUs, before the second operation is (putting the new
+      element into the list).  This is important, since modern
+      compilers and modern CPUs can both reorder instructions unless
+      told otherwise: we want a reader to either not see the new
+      element at all, or see the new element with the
+      <symbol>next</symbol> pointer correctly pointing at the rest of
+      the list.
+    </para>
+    <para>
+      Fortunately, there is a function to do this for standard
+      <structname>struct list_head</structname> lists:
+      <function>list_add_rcu()</function>
+      (<filename>include/linux/list.h</filename>).
+    </para>
+    <para>
+      Removing an element from the list is even simpler: we replace
+      the pointer to the old element with a pointer to its successor,
+      and readers will either see it, or skip over it.
     </para>
+    <programlisting>
+        list-&gt;next = old-&gt;next;
+    </programlisting>
+    <para>
+      There is <function>list_del_rcu()</function>
+      (<filename>include/linux/list.h</filename>) which does this (the
+      normal version poisons the old object, which we don't want).
+    </para>
+    <para>
+      The reader must also be careful: some CPUs can look through the
+      <symbol>next</symbol> pointer to start reading the contents of
+      the next element early, but don't realize that the pre-fetched
+      contents is wrong when the <symbol>next</symbol> pointer changes
+      underneath them.  Once again, there is a
+      <function>list_for_each_entry_rcu()</function>
+      (<filename>include/linux/list.h</filename>) to help you.  Of
+      course, writers can just use
+      <function>list_for_each_entry()</function>, since there cannot
+      be two simultaneous writers.
+    </para>
+    <para>
+      Our final dilemma is this: when can we actually destroy the
+      removed element?  Remember, a reader might be stepping through
+      this element in the list right now: it we free this element and
+      the <symbol>next</symbol> pointer changes, the reader will jump
+      off into garbage and crash.  We need to wait until we know that
+      all the readers who were traversing the list when we deleted the
+      element are finished.  We use <function>call_rcu()</function> to
+      register a callback which will actually destroy the object once
+      the readers are finished.
+    </para>
+    <para>
+      But how does Read Copy Update know when the readers are
+      finished?  The method is this: firstly, the readers always
+      traverse the list inside
+      <function>rcu_read_lock()</function>/<function>rcu_read_unlock()</function>
+      pairs: these simply disable preemption so the reader won't go to
+      sleep while reading the list.
+    </para>
+    <para>
+      RCU then waits until every other CPU has slept at least once:
+      since readers cannot sleep, we know that any readers which were
+      traversing the list during the deletion are finished, and the
+      callback is triggered.  The real Read Copy Update code is a
+      little more optimized than this, but this is the fundamental
+      idea.
+    </para>
+
+<programlisting>
+--- cache.c.perobjectlock	2003-12-11 17:15:03.000000000 +1100
++++ cache.c.rcupdate	2003-12-11 17:55:14.000000000 +1100
+@@ -1,15 +1,18 @@
+ #include &lt;linux/list.h&gt;
+ #include &lt;linux/slab.h&gt;
+ #include &lt;linux/string.h&gt;
++#include &lt;linux/rcupdate.h&gt;
+ #include &lt;asm/semaphore.h&gt;
+ #include &lt;asm/errno.h&gt;
+
+ struct object
+ {
+-        /* These two protected by cache_lock. */
++        /* This is protected by RCU */
+         struct list_head list;
+         int popularity;
+
++        struct rcu_head rcu;
++
+         atomic_t refcnt;
+
+         /* Doesn't change once created. */
+@@ -40,7 +43,7 @@
+ {
+         struct object *i;
+
+-        list_for_each_entry(i, &amp;cache, list) {
++        list_for_each_entry_rcu(i, &amp;cache, list) {
+                 if (i-&gt;id == id) {
+                         i-&gt;popularity++;
+                         return i;
+@@ -49,19 +52,25 @@
+         return NULL;
+ }
+
++/* Final discard done once we know no readers are looking. */
++static void cache_delete_rcu(void *arg)
++{
++        object_put(arg);
++}
++
+ /* Must be holding cache_lock */
+ static void __cache_delete(struct object *obj)
+ {
+         BUG_ON(!obj);
+-        list_del(&amp;obj-&gt;list);
+-        object_put(obj);
++        list_del_rcu(&amp;obj-&gt;list);
+         cache_num--;
++        call_rcu(&amp;obj-&gt;rcu, cache_delete_rcu, obj);
+ }
+
+ /* Must be holding cache_lock */
+ static void __cache_add(struct object *obj)
+ {
+-        list_add(&amp;obj-&gt;list, &amp;cache);
++        list_add_rcu(&amp;obj-&gt;list, &amp;cache);
+         if (++cache_num > MAX_CACHE_SIZE) {
+                 struct object *i, *outcast = NULL;
+                 list_for_each_entry(i, &amp;cache, list) {
+@@ -85,6 +94,7 @@
+         obj-&gt;popularity = 0;
+         atomic_set(&amp;obj-&gt;refcnt, 1); /* The cache holds a reference */
+         spin_lock_init(&amp;obj-&gt;lock);
++        INIT_RCU_HEAD(&amp;obj-&gt;rcu);
+
+         spin_lock_irqsave(&amp;cache_lock, flags);
+         __cache_add(obj);
+@@ -104,12 +114,11 @@
+ struct object *cache_find(int id)
+ {
+         struct object *obj;
+-        unsigned long flags;
+
+-        spin_lock_irqsave(&amp;cache_lock, flags);
++        rcu_read_lock();
+         obj = __cache_find(id);
+         if (obj)
+                 object_get(obj);
+-        spin_unlock_irqrestore(&amp;cache_lock, flags);
++        rcu_read_unlock();
+         return obj;
+ }
+</programlisting>
+
+<para>
+Note that the reader will alter the
+<structfield>popularity</structfield> member in
+<function>__cache_find()</function>, and now it doesn't hold a lock.
+One solution would be to make it an <type>atomic_t</type>, but for
+this usage, we don't really care about races: an approximate result is
+good enough, so I didn't change it.
+</para>
+
+<para>
+The result is that <function>cache_find()</function> requires no
+synchronization with any other functions, so is almost as fast on SMP
+as it would be on UP.
+</para>
+
+<para>
+There is a furthur optimization possible here: remember our original
+cache code, where there were no reference counts and the caller simply
+held the lock whenever using the object?  This is still possible: if
+you hold the lock, noone can delete the object, so you don't need to
+get and put the reference count.
+</para>
+
+<para>
+Now, because the 'read lock' in RCU is simply disabling preemption, a
+caller which always has preemption disabled between calling
+<function>cache_find()</function> and
+<function>object_put()</function> does not need to actually get and
+put the reference count: we could expose
+<function>__cache_find()</function> by making it non-static, and
+such callers could simply call that.
+</para>
+<para>
+The benefit here is that the reference count is not written to: the
+object is not altered in any way, which is much faster on SMP
+machines due to caching.
+</para>
+  </sect1>
+
+   <sect1 id="per-cpu">
+    <title>Per-CPU Data</title>
 
     <para>
-      In this approach, an object has an owner, who sets the
-      reference count to one.  Whenever you get a pointer to the
-      object, you increment the reference count (a `get' operation).
-      Whenever you relinquish a pointer, you decrement the reference
-      count (a `put' operation).  When the owner wants to destroy
-      it, they mark it dead, and do a put.
+      Another technique for avoiding locking which is used fairly
+      widely is to duplicate information for each CPU.  For example,
+      if you wanted to keep a count of a common condition, you could
+      use a spin lock and a single counter.  Nice and simple.
     </para>
 
     <para>
-      Whoever drops the reference count to zero (usually implemented
-      with <function>atomic_dec_and_test()</function>) actually cleans 
-      up and frees the object.
+      If that was too slow (it's usually not, but if you've got a
+      really big machine to test on and can show that it is), you
+      could instead use a counter for each CPU, then none of them need
+      an exclusive lock.  See <function>DEFINE_PER_CPU()</function>,
+      <function>get_cpu_var()</function> and
+      <function>put_cpu_var()</function>
+      (<filename class=headerfile>include/linux/percpu.h</filename>).
     </para>
 
     <para>
-      This means that you are guaranteed that the object won't
-      vanish underneath you, even though you no longer have a lock
-      for the collection.
+      Of particular use for simple per-cpu counters is the
+      <type>local_t</type> type, and the
+      <function>cpu_local_inc()</function> and related functions,
+      which are more efficient than simple code on some architectures
+      (<filename class=headerfile>include/asm/local.h</filename>).
     </para>
 
     <para>
-      Here's some skeleton code:
+      Note that there is no simple, reliable way of getting an exact
+      value of such a counter, without introducing more locks.  This
+      is not a problem for some uses.
     </para>
+   </sect1>
 
-    <programlisting>
-        void create_foo(struct foo *x)
-        {
-                atomic_set(&amp;x-&gt;use, 1);
-                spin_lock_bh(&amp;list_lock);
-                ... insert in list ...
-                spin_unlock_bh(&amp;list_lock);
-        }
-
-        struct foo *get_foo(int desc)
-        {
-                struct foo *ret;
-
-                spin_lock_bh(&amp;list_lock);
-                ... find in list ...
-                if (ret) atomic_inc(&amp;ret-&gt;use);
-                spin_unlock_bh(&amp;list_lock);
-
-                return ret;
-        }
+   <sect1 id="mostly-hardirq">
+    <title>Data Which Mostly Used By An IRQ Handler</title>
 
-        void put_foo(struct foo *x)
-        {
-                if (atomic_dec_and_test(&amp;x-&gt;use))
-                        kfree(foo);
-        }
+    <para>
+      If data is always accessed from within the same IRQ handler, you
+      don't need a lock at all: the kernel already guarantees that the
+      irq handler will not run simultaneously on multiple CPUs.
+    </para>
+    <para>
+      Manfred Spraul points out that you can still do this, even if
+      the data is very occasionally accessed in user context or
+      softirqs/tasklets.  The irq handler doesn't use a lock, and
+      all other accesses are done as so:
+    </para>
+
+<programlisting>
+	spin_lock(&amp;lock);
+	disable_irq(irq);
+	...
+	enable_irq(irq);
+	spin_unlock(&amp;lock);
+</programlisting>
+    <para>
+      The <function>disable_irq()</function> prevents the irq handler
+      from running (and waits for it to finish if it's currently
+      running on other CPUs).  The spinlock prevents any other
+      accesses happening at the same time.  Naturally, this is slower
+      than just a <function>spin_lock_irq()</function> call, so it
+      only makes sense if this type of access happens extremely
+      rarely.
+    </para>
+   </sect1>
+  </chapter>
 
-        void destroy_foo(struct foo *x)
-        {
-                spin_lock_bh(&amp;list_lock);
-                ... remove from list ...
-                spin_unlock_bh(&amp;list_lock);
+ <chapter id="sleeping-things">
+    <title>What Functions Are Safe To Call From Interrupts?</title>
 
-                put_foo(x);
-        }
-    </programlisting>
+    <para>
+      Many functions in the kernel sleep (ie. call schedule())
+      directly or indirectly: you can never call them while holding a
+      spinlock, or with preemption disabled.  This also means you need
+      to be in user context: calling them from an interrupt is illegal.
+    </para>
 
-    <sect2 id="helpful-macros">
-     <title>Macros To Help You</title>
-     <para>
-       There are a set of debugging macros tucked inside
-       <filename class=headerfile>include/linux/netfilter_ipv4/lockhelp.h</filename>
-       and <filename class=headerfile>listhelp.h</filename>: these are very
-       useful for ensuring that locks are held in the right places to protect
-       infrastructure.
-     </para>
-    </sect2>
-   </sect1>
-   
-   <sect1 id="sleeping-things">
-    <title>Things Which Sleep</title>
+   <sect1 id="sleeping">
+    <title>Some Functions Which Sleep</title>
 
     <para>
-      You can never call the following routines while holding a
-      spinlock, as they may sleep.  This also means you need to be in
-      user context.
+      The most common ones are listed below, but you usually have to
+      read the code to find out if other calls are safe.  If everyone
+      else who calls it can sleep, you probably need to be able to
+      sleep, too.  In particular, registration and deregistration
+      functions usually expect to be called from user context, and can
+      sleep.
     </para>
 
     <itemizedlist>
@@ -961,106 +1887,31 @@
      </listitem>
     </itemizedlist>
 
-    <para>
-     <function>printk()</function> can be called in
-     <emphasis>any</emphasis> context, interestingly enough.
-    </para>
-   </sect1>
-
-   <sect1 id="sparc">
-    <title>The Fucked Up Sparc</title>
+   <sect1 id="dont-sleep">
+    <title>Some Functions Which Don't Sleep</title>
 
     <para>
-      Alan Cox says <quote>the irq disable/enable is in the register
-      window on a sparc</quote>.  Andi Kleen says <quote>when you do
-      restore_flags in a different function you mess up all the
-      register windows</quote>.
-    </para>
-
-    <para>
-      So never pass the flags word set by 
-      <function>spin_lock_irqsave()</function> and brethren to another 
-      function (unless it's declared <type>inline</type>.  Usually no-one 
-      does this, but now you've been warned.  Dave Miller can never do 
-      anything in a straightforward manner (I can say that, because I have
-      pictures of him and a certain PowerPC maintainer in a compromising 
-      position).
-    </para>
-   </sect1>
-
-   <sect1 id="racing-timers">
-    <title>Racing Timers: A Kernel Pastime</title>
-
-    <para>
-      Timers can produce their own special problems with races.
-      Consider a collection of objects (list, hash, etc) where each
-      object has a timer which is due to destroy it.
+     Some functions are safe to call from any context, or holding
+     almost any lock.
     </para>
 
-    <para>
-      If you want to destroy the entire collection (say on module
-      removal), you might do the following:
-    </para>
-
-    <programlisting>
-        /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
-           HUNGARIAN NOTATION */
-        spin_lock_bh(&amp;list_lock);
-
-        while (list) {
-                struct foo *next = list-&gt;next;
-                del_timer(&amp;list-&gt;timer);
-                kfree(list);
-                list = next;
-        }
-
-        spin_unlock_bh(&amp;list_lock);
-    </programlisting>
-
-    <para>
-      Sooner or later, this will crash on SMP, because a timer can
-      have just gone off before the <function>spin_lock_bh()</function>, 
-      and it will only get the lock after we 
-      <function>spin_unlock_bh()</function>, and then try to free
-      the element (which has already been freed!).
-    </para>
-
-    <para>
-      This can be avoided by checking the result of 
-      <function>del_timer()</function>: if it returns
-      <returnvalue>1</returnvalue>, the timer has been deleted.  
-      If <returnvalue>0</returnvalue>, it means (in this
-      case) that it is currently running, so we can do:
-    </para>
-
-    <programlisting>
-        retry:  
-                spin_lock_bh(&amp;list_lock);
-
-                while (list) {
-                        struct foo *next = list-&gt;next;
-                        if (!del_timer(&amp;list-&gt;timer)) {
-                                /* Give timer a chance to delete this */
-                                spin_unlock_bh(&amp;list_lock);
-                                goto retry;
-                        }
-                        kfree(list);
-                        list = next;
-                }
-
-                spin_unlock_bh(&amp;list_lock);
-    </programlisting>
-
-    <para>
-      Another common problem is deleting timers which restart
-      themselves (by calling <function>add_timer()</function> at the end 
-      of their timer function).  Because this is a fairly common case 
-      which is prone to races, you should use <function>del_timer_sync()</function> 
-      (<filename class=headerfile>include/linux/timer.h</filename>) 
-      to handle this case.  It returns the number of times the timer 
-      had to be deleted before we finally stopped it from adding itself back 
-      in.
-    </para>
+    <itemizedlist>
+     <listitem>
+      <para>
+	<function>printk()</function>
+      </para>
+     </listitem>
+     <listitem>
+      <para>
+        <function>kfree()</function>
+      </para>
+     </listitem>
+     <listitem>
+      <para>
+	<function>add_timer()</function> and <function>del_timer()</function>
+      </para>
+     </listitem>
+    </itemizedlist>
    </sect1>
   </chapter>
 
@@ -1101,8 +1952,9 @@
 
     <para>
       Thanks to Martin Pool, Philipp Rumpf, Stephen Rothwell, Paul
-      Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul and Tim
-      Waugh for proofreading, correcting, flaming, commenting.
+      Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul, Tim
+      Waugh, Pete Zaitcev, James Morris, Robert Love, Paul McKenney,
+      John Ashby for proofreading, correcting, flaming, commenting.
     </para>
 
     <para>
@@ -1113,12 +1965,27 @@
   <glossary id="glossary">
    <title>Glossary</title>
 
+   <glossentry id="gloss-preemption">
+    <glossterm>preemption</glossterm>
+     <glossdef>
+      <para>
+        Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
+        unset, processes in user context inside the kernel would not
+        preempt each other (ie. you had that CPU until you have it up,
+        except for interrupts).  With the addition of
+        <symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
+        in user context, higher priority tasks can "cut in": spinlocks
+        were changed to disable preemption, even on UP.
+     </para>
+    </glossdef>
+   </glossentry>
+
    <glossentry id="gloss-bh">
     <glossterm>bh</glossterm>
      <glossdef>
       <para>
         Bottom Half: for historical reasons, functions with
-        `_bh' in them often now refer to any software interrupt, e.g.
+        '_bh' in them often now refer to any software interrupt, e.g.
         <function>spin_lock_bh()</function> blocks any software interrupt 
         on the current CPU.  Bottom halves are deprecated, and will 
         eventually be replaced by tasklets.  Only one bottom half will be 
@@ -1132,8 +1999,7 @@
     <glossdef>
      <para>
        Hardware interrupt request.  <function>in_irq()</function> returns 
-       <returnvalue>true</returnvalue> in a hardware interrupt handler (it 
-       also returns true when interrupts are blocked).
+       <returnvalue>true</returnvalue> in a hardware interrupt handler.
      </para>
     </glossdef>
    </glossentry>
@@ -1144,8 +2010,7 @@
      <para>
        Not user context: processing a hardware irq or software irq.
        Indicated by the <function>in_interrupt()</function> macro 
-       returning <returnvalue>true</returnvalue> (although it also
-       returns true when interrupts or BHs are blocked).
+       returning <returnvalue>true</returnvalue>.
      </para>
     </glossdef>
    </glossentry>
@@ -1161,35 +2026,40 @@
    </glossentry>
 
    <glossentry id="gloss-softirq">
-    <glossterm>softirq</glossterm>
+    <glossterm>Software Interrupt / softirq</glossterm>
     <glossdef>
      <para>
-       Strictly speaking, one of up to 32 enumerated software
+       Software interrupt handler.  <function>in_irq()</function> returns
+       <returnvalue>false</returnvalue>; <function>in_softirq()</function>
+       returns <returnvalue>true</returnvalue>.  Tasklets and softirqs
+	both fall into the category of 'software interrupts'.
+     </para>
+     <para>
+       Strictly speaking a softirq is one of up to 32 enumerated software
        interrupts which can run on multiple CPUs at once.
-       Sometimes used to refer to tasklets and bottom halves as
+       Sometimes used to refer to tasklets as
        well (ie. all software interrupts).
      </para>
     </glossdef>
    </glossentry>
 
-   <glossentry id="gloss-swinterrupt">
-    <glossterm>Software Interrupt / Software IRQ</glossterm>
+   <glossentry id="gloss-tasklet">
+    <glossterm>tasklet</glossterm>
     <glossdef>
      <para>
-       Software interrupt handler.  <function>in_irq()</function> returns 
-       <returnvalue>false</returnvalue>; <function>in_softirq()</function>
-       returns <returnvalue>true</returnvalue>.  Tasklets, softirqs and 
-       bottom halves all fall into the category of `software interrupts'.
+       A dynamically-registrable software interrupt,
+       which is guaranteed to only run on one CPU at a time.
      </para>
     </glossdef>
    </glossentry>
 
-   <glossentry id="gloss-tasklet">
-    <glossterm>tasklet</glossterm>
+   <glossentry id="gloss-timers">
+    <glossterm>timer</glossterm>
     <glossdef>
      <para>
-       A dynamically-registrable software interrupt,
-       which is guaranteed to only run on one CPU at a time.
+       A dynamically-registrable software interrupt, which is run at
+       (or close to) a given time.  When running, it is just like a
+       tasklet (in fact, they are called from the TIMER_SOFTIRQ).
      </para>
     </glossdef>
    </glossentry>
@@ -1207,10 +2077,11 @@
     <glossterm>User Context</glossterm>
     <glossdef>
      <para>
-       The kernel executing on behalf of a particular
-       process or kernel thread (given by the <function>current()</function>
-       macro.)  Not to be confused with userspace.  Can be interrupted by 
-       software  or hardware interrupts.
+       The kernel executing on behalf of a particular process (ie. a
+       system call or trap) or kernel thread.  You can tell which
+       process with the <symbol>current</symbol> macro.)  Not to
+       be confused with userspace.  Can be interrupted by software or
+       hardware interrupts.
      </para>
     </glossdef>
    </glossentry>
diff -Nru a/Documentation/MSI-HOWTO.txt b/Documentation/MSI-HOWTO.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/MSI-HOWTO.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,321 @@
+		The MSI Driver Guide HOWTO
+	Tom L Nguyen tom.l.nguyen@intel.com
+			10/03/2003
+
+1. About this guide
+
+This guide describes the basics of Message Signaled Interrupts(MSI), the
+advantages of using MSI over traditional interrupt mechanisms, and how
+to enable your driver to use MSI or MSI-X. Also included is a Frequently
+Asked Questions.
+
+2. Copyright 2003 Intel Corporation
+
+3. What is MSI/MSI-X?
+
+Message Signaled Interrupt (MSI), as described in the PCI Local Bus
+Specification Revision 2.3 or latest, is an optional feature, and a
+required feature for PCI Express devices. MSI enables a device function
+to request service by sending an Inbound Memory Write on its PCI bus to
+the FSB as a Message Signal Interrupt transaction. Because MSI is
+generated in the form of a Memory Write, all transaction conditions,
+such as a Retry, Master-Abort, Target-Abort or normal completion, are
+supported.
+
+A PCI device that supports MSI must also support pin IRQ assertion
+interrupt mechanism to provide backward compatibility for systems that
+do not support MSI. In Systems, which support MSI, the bus driver is
+responsible for initializing the message address and message data of
+the device function's MSI/MSI-X capability structure during device
+initial configuration.
+
+An MSI capable device function indicates MSI support by implementing
+the MSI/MSI-X capability structure in its PCI capability list. The
+device function may implement both the MSI capability structure and
+the MSI-X capability structure; however, the bus driver should not
+enable both, but instead enable only the MSI-X capability structure.
+
+The MSI capability structure contains Message Control register,
+Message Address register and Message Data register. These registers
+provide the bus driver control over MSI. The Message Control register
+indicates the MSI capability supported by the device. The Message
+Address register specifies the target address and the Message Data
+register specifies the characteristics of the message. To request
+service, the device function writes the content of the Message Data
+register to the target address. The device and its software driver
+are prohibited from writing to these registers.
+
+The MSI-X capability structure is an optional extension to MSI. It
+uses an independent and separate capability structure. There are
+some key advantages to implementing the MSI-X capability structure
+over the MSI capability structure as described below.
+
+	- Support a larger maximum number of vectors per function.
+
+	- Provide the ability for system software to configure
+	each vector with an independent message address and message
+	data, specified by a table that resides in Memory Space.
+
+        - MSI and MSI-X both support per-vector masking. Per-vector
+	masking is an optional extension of MSI but a required
+	feature for MSI-X. Per-vector masking provides the kernel
+	the ability to mask/unmask MSI when servicing its software
+	interrupt service routing handler. If per-vector masking is
+	not supported, then the device driver should provide the
+	hardware/software synchronization to ensure that the device
+	generates MSI when the driver wants it to do so.
+
+4. Why use MSI?
+
+As a benefit the simplification of board design, MSI allows board
+designers to remove out of band interrupt routing. MSI is another
+step towards a legacy-free environment.
+
+Due to increasing pressure on chipset and processor packages to
+reduce pin count, the need for interrupt pins is expected to
+diminish over time. Devices, due to pin constraints, may implement
+messages to increase performance.
+
+PCI Express endpoints uses INTx emulation (in-band messages) instead
+of IRQ pin assertion. Using INTx emulation requires interrupt
+sharing among devices connected to the same node (PCI bridge) while
+MSI is unique (non-shared) and does not require BIOS configuration
+support. As a result, the PCI Express technology requires MSI
+support for better interrupt performance.
+
+Using MSI enables the device functions to support two or more
+vectors, which can be configure to target different CPU's to
+increase scalability.
+
+5. Configuring a driver to use MSI/MSI-X
+
+By default, the kernel will not enable MSI/MSI-X on all devices that
+support this capability once the patch is installed. A kernel
+configuration option must be selected to enable MSI/MSI-X support.
+
+5.1 Including MSI support into the kernel
+
+To include MSI support into the kernel requires users to patch the
+VECTOR-base patch first and then the MSI patch because the MSI
+support needs VECTOR based scheme. Once these patches are installed,
+setting CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
+the option for MSI-capable device drivers to selectively enable MSI
+(using pci_enable_msi as desribed below).
+
+Since the target of the inbound message is the local APIC, providing
+CONFIG_PCI_USE_VECTOR is dependent on whether CONFIG_X86_LOCAL_APIC
+is enabled or not.
+
+int pci_enable_msi(struct pci_dev *)
+
+With this new API, any existing device driver, which like to have
+MSI enabled on its device function, must call this explicitly. A
+successful call will initialize the MSI/MSI-X capability structure
+with ONE vector, regardless of whether the device function is
+capable of supporting multiple messages. This vector replaces the
+pre-assigned dev->irq with a new MSI vector. To avoid the conflict
+of new assigned vector with existing pre-assigned vector requires
+the device driver to call this API before calling request_irq(...).
+
+The below diagram shows the events, which switches the interrupt
+mode on the MSI-capable device function between MSI mode and
+PIN-IRQ assertion mode.
+
+	 ------------   pci_enable_msi 	 ------------------------
+	|	     | <===============	| 			 |
+	| MSI MODE   |	  	     	| PIN-IRQ ASSERTION MODE |
+	| 	     | ===============>	|			 |
+ 	 ------------	free_irq      	 ------------------------
+
+5.2 Configuring for MSI support
+
+Due to the non-contiguous fashion in vector assignment of the
+existing Linux kernel, this patch does not support multiple
+messages regardless of the device function is capable of supporting
+more than one vector. The bus driver initializes only entry 0 of
+this capability if pci_enable_msi(...) is called successfully by
+the device driver.
+
+5.3 Configuring for MSI-X support
+
+Both the MSI capability structure and the MSI-X capability structure
+share the same above semantics; however, due to the ability of the
+system software to configure each vector of the MSI-X capability
+structure with an independent message address and message data, the
+non-contiguous fashion in vector assignment of the existing Linux
+kernel has no impact on supporting multiple messages on an MSI-X
+capable device functions. By default, as mentioned above, ONE vector
+should be always allocated to the MSI-X capability structure at
+entry 0. The bus driver does not initialize other entries of the
+MSI-X table.
+
+Note that the PCI subsystem should have full control of a MSI-X
+table that resides in Memory Space. The software device driver
+should not access this table.
+
+To request for additional vectors, the device software driver should
+call function msi_alloc_vectors(). It is recommended that the
+software driver should call this function once during the
+initialization phase of the device driver.
+
+The function msi_alloc_vectors(), once invoked, enables either
+all or nothing, depending on the current availability of vector
+resources. If no vector resources are available, the device function
+still works with ONE vector. If the vector resources are available
+for the number of vectors requested by the driver, this function
+will reconfigure the MSI-X capability structure of the device with
+additional messages, starting from entry 1. To emphasize this
+reason, for example, the device may be capable for supporting the
+maximum of 32 vectors while its software driver usually may request
+4 vectors.
+
+For each vector, after this successful call, the device driver is
+responsible to call other functions like request_irq(), enable_irq(),
+etc. to enable this vector with its corresponding interrupt service
+handler. It is the device driver's choice to have all vectors shared
+the same interrupt service handler or each vector with a unique
+interrupt service handler.
+
+In addition to the function msi_alloc_vectors(), another function
+msi_free_vectors() is provided to allow the software driver to
+release a number of vectors back to the vector resources. Once
+invoked, the PCI subsystem disables (masks) each vector released.
+These vectors are no longer valid for the hardware device and its
+software driver to use. Like free_irq, it recommends that the
+device driver should also call msi_free_vectors to release all
+additional vectors previously requested.
+
+int msi_alloc_vectors(struct pci_dev *dev, int *vector, int nvec)
+
+This API enables the software driver to request the PCI subsystem
+for additional messages. Depending on the number of vectors
+available, the PCI subsystem enables either all or nothing.
+
+Argument dev points to the device (pci_dev) structure.
+Argument vector is a pointer of integer type. The number of
+elements is indicated in argument nvec.
+Argument nvec is an integer indicating the number of messages
+requested.
+A return of zero indicates that the number of allocated vector is
+successfully allocated. Otherwise, indicate resources not
+available.
+
+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
+
+This API enables the software driver to inform the PCI subsystem
+that it is willing to release a number of vectors back to the
+MSI resource pool. Once invoked, the PCI subsystem disables each
+MSI-X entry associated with each vector stored in the argument 2.
+These vectors are no longer valid for the hardware device and
+its software driver to use.
+
+Argument dev points to the device (pci_dev) structure.
+Argument vector is a pointer of integer type. The number of
+elements is indicated in argument nvec.
+Argument nvec is an integer indicating the number of messages
+released.
+A return of zero indicates that the number of allocated vectors
+is successfully released. Otherwise, indicates a failure.
+
+5.4 Hardware requirements for MSI support
+MSI support requires support from both system hardware and
+individual hardware device functions.
+
+5.4.1 System hardware support
+Since the target of MSI address is the local APIC CPU, enabling
+MSI support in Linux kernel is dependent on whether existing
+system hardware supports local APIC. Users should verify their
+system whether it runs when CONFIG_X86_LOCAL_APIC=y.
+
+In SMP environment, CONFIG_X86_LOCAL_APIC is automatically set;
+however, in UP environment, users must manually set
+CONFIG_X86_LOCAL_APIC. Once CONFIG_X86_LOCAL_APIC=y, setting
+CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
+the option for MSI-capable device drivers to selectively enable
+MSI (using pci_enable_msi as desribed below).
+
+Note that CONFIG_X86_IO_APIC setting is irrelevant because MSI
+vector is allocated new during runtime and MSI support does not
+depend on BIOS support. This key independency enables MSI support
+on future IOxAPIC free platform.
+
+5.4.2 Device hardware support
+The hardware device function supports MSI by indicating the
+MSI/MSI-X capability structure on its PCI capability list. By
+default, this capability structure will not be initialized by
+the kernel to enable MSI during the system boot. In other words,
+the device function is running on its default pin assertion mode.
+Note that in many cases the hardware supporting MSI have bugs,
+which may result in system hang. The software driver of specific
+MSI-capable hardware is responsible for whether calling
+pci_enable_msi or not. A return of zero indicates the kernel
+successfully initializes the MSI/MSI-X capability structure of the
+device funtion. The device function is now running on MSI mode.
+
+5.5 How to tell whether MSI is enabled on device function
+
+At the driver level, a return of zero from pci_enable_msi(...)
+indicates to the device driver that its device function is
+initialized successfully and ready to run in MSI mode.
+
+At the user level, users can use command 'cat /proc/interrupts'
+to display the vector allocated for the device and its interrupt
+mode, as shown below.
+
+           CPU0       CPU1
+  0:     324639          0    IO-APIC-edge  timer
+  1:       1186          0    IO-APIC-edge  i8042
+  2:          0          0          XT-PIC  cascade
+ 12:       2797          0    IO-APIC-edge  i8042
+ 14:       6543          0    IO-APIC-edge  ide0
+ 15:          1          0    IO-APIC-edge  ide1
+169:          0          0   IO-APIC-level  uhci-hcd
+185:          0          0   IO-APIC-level  uhci-hcd
+193:        138         10         PCI MSI  aic79xx
+201:         30          0         PCI MSI  aic79xx
+225:         30          0   IO-APIC-level  aic7xxx
+233:         30          0   IO-APIC-level  aic7xxx
+NMI:          0          0
+LOC:     324553     325068
+ERR:          0
+MIS:          0
+
+6. FAQ
+
+Q1. Are there any limitations on using the MSI?
+
+A1. If the PCI device supports MSI and conforms to the
+specification and the platform supports the APIC local bus,
+then using MSI should work.
+
+Q2. Will it work on all the Pentium processors (P3, P4, Xeon,
+AMD processors)? In P3 IPI's are transmitted on the APIC local
+bus and in P4 and Xeon they are transmitted on the system
+bus. Are there any implications with this?
+
+A2. MSI support enables a PCI device sending an inbound
+memory write (0xfeexxxxx as target address) on its PCI bus
+directly to the FSB. Since the message address has a
+redirection hint bit cleared, it should work.
+
+Q3. The target address 0xfeexxxxx will be translated by the
+Host Bridge into an interrupt message. Are there any
+limitations on the chipsets such as Intel 8xx, Intel e7xxx,
+or VIA?
+
+A3. If these chipsets support an inbound memory write with
+target address set as 0xfeexxxxx, as conformed to PCI
+specification 2.3 or latest, then it should work.
+
+Q4. From the driver point of view, if the MSI is lost because
+of the errors occur during inbound memory write, then it may
+wait for ever. Is there a mechanism for it to recover?
+
+A4. Since the target of the transaction is an inbound memory
+write, all transaction termination conditions (Retry,
+Master-Abort, Target-Abort, or normal completion) are
+supported. A device sending an MSI must abide by all the PCI
+rules and conditions regarding that inbound memory write. So,
+if a retry is signaled it must retry, etc... We believe that
+the recommendation for Abort is also a retry (refer to PCI
+specification 2.3 or latest).
diff -Nru a/Documentation/SubmittingDrivers b/Documentation/SubmittingDrivers
--- a/Documentation/SubmittingDrivers	Thu Jan  8 23:00:24 2004
+++ b/Documentation/SubmittingDrivers	Thu Jan  8 23:00:24 2004
@@ -34,14 +34,13 @@
 	maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
 
 Linux 2.4:
-	The same rules apply as 2.2 but this kernel tree is under active
-	development. The final contact point for Linux 2.4 submissions is
-	Marcelo Tosatti <marcelo@conectiva.com.br>.
+	The same rules apply as 2.2. The final contact point for Linux 2.4
+	submissions is Marcelo Tosatti <marcelo.tosatti@cyclades.com>.
 
-Linux 2.5:
+Linux 2.6:
 	The same rules apply as 2.4 except that you should follow linux-kernel
-	to track changes in API's. The final contact point for Linux 2.5
-	submissions is Linus Torvalds <torvalds@osdl.org>.
+	to track changes in API's. The final contact point for Linux 2.6
+	submissions is Andrew Morton <akpm@osdl.org>.
 
 What Criteria Determine Acceptance
 ----------------------------------
diff -Nru a/Documentation/block/biodoc.txt b/Documentation/block/biodoc.txt
--- a/Documentation/block/biodoc.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/block/biodoc.txt	Thu Jan  8 23:00:24 2004
@@ -323,7 +323,7 @@
 request->buffer, request->sector and request->nr_sectors or
 request->current_nr_sectors fields itself rather than using the block layer
 end_request or end_that_request_first completion interfaces.
-(See 2.3 or Documentation/bio/request.txt for a brief explanation of
+(See 2.3 or Documentation/block/request.txt for a brief explanation of
 the request structure fields)
 
 [TBD: end_that_request_last should be usable even in this case;
@@ -517,7 +517,7 @@
 Only some relevant fields (mainly those which changed or may be referred
 to in some of the discussion here) are listed below, not necessarily in
 the order in which they occur in the structure (see include/linux/blkdev.h)
-Refer to Documentation/bio/request.txt for details about all the request
+Refer to Documentation/block/request.txt for details about all the request
 structure fields and a quick reference about the layers which are
 supposed to use or modify those fields.
 
diff -Nru a/Documentation/dvb/bt8xx.txt b/Documentation/dvb/bt8xx.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/bt8xx.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,90 @@
+How to get the Nebula, PCTV and Twinhan DST cards working
+=========================================================
+
+This class of cards has a bt878a as the PCI interface, and
+require the bttv driver.
+
+Please pay close attention to the warning about the bttv module
+options below for the DST card.
+
+1) General informations
+=======================
+
+These drivers require the bttv driver to provide the means to access
+the i2c bus and the gpio pins of the bt8xx chipset.
+
+Because of this, you need to enable
+"Device drivers" => "Multimedia devices"
+  => "Video For Linux" => "BT848 Video For Linux"
+
+2) Loading Modules
+==================
+
+In general you need to load the bttv driver, which will handle the gpio and
+i2c communication for us. Next you need the common dvb-bt8xx device driver
+and one frontend driver.
+
+The bttv driver will HANG YOUR SYSTEM IF YOU DO NOT SPECIFY THE CORRECT 
+CARD ID!
+
+(If you don't get your card running and you suspect that the card id you're
+using is wrong, have a look at "bttv-cards.c" for a list of possible card
+ids.)
+
+Pay attention to failures when you load the frontend drivers
+(e.g. dmesg, /var/log/messages).
+
+3a) Nebula / Pinnacle PCTV
+--------------------------
+
+   $ modprobe bttv i2c_hw=1 card=0x68
+   $ modprobe dvb-bt8xx
+   
+For Nebula cards use the "nxt6000" frontend driver:
+   $ modprobe nxt6000
+
+For Pinnacle PCTV cards use the "cx24110" frontend driver:
+   $ modprobe cx24110
+
+3b) TwinHan
+-----------
+
+   $ modprobe bttv i2c_hw=1 card=0x71
+   $ modprobe dvb-bt8xx
+   $ modprobe dst
+
+The value 0x71 will override the PCI type detection for dvb-bt8xx, which 
+is necessary for TwinHan cards.#
+
+If you're having an older card (blue color circuit) and card=0x71 locks your
+machine, try using 0x68, too. If that does not work, ask on the DVB mailing list.
+
+The DST module takes a couple of useful parameters, in case the
+dst drivers fails to detect your type of card correctly.
+
+dst_type takes values 0 (satellite), 1 (terrestial TV), 2 (cable).
+
+dst_type_flags takes bit combined values:
+1 = new tuner type packets. You can use this if your card is detected
+    and you have debug and you continually see the tuner packets not
+    working (make sure not a basic problem like dish alignment etc.)
+
+2 = TS 204. If your card tunes OK, but the picture is terrible, seemingly
+    breaking up in one half continually, and crc fails a lot, then
+    this is worth a try (or trying to turn off)
+
+4 = has symdiv. Some cards, mostly without new tuner packets, require
+    a symbol division algorithm. Doesn't apply to terrestial TV.
+
+You can also specify a value to have the autodetected values turned off
+(e.g. 0). The autodected values are determined bythe cards 'response
+string' which you can see in your logs e.g.
+
+dst_check_ci: recognize DST-MOT
+
+or 
+
+dst_check_ci: unable to recognize DSTXCI or STXCI
+
+--
+Authors: Richard Walker, Jamie Honan, Michael Hunold
diff -Nru a/Documentation/dvb/cards.txt b/Documentation/dvb/cards.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/cards.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,63 @@
+Hardware supported by the linuxtv.org DVB drivers
+=================================================
+
+  Generally, the DVB hardware manufacturers frequently change the
+  frontends (i.e. tuner / demodulator units) used, usually without
+  changing the product name, revision number or specs. Some cards
+  are also available in versions with different frontends for
+  DVB-S/DVB-C/DVB-T. Thus the frontend drivers are listed seperately.
+
+  Note 1: There is no guarantee that every frontend driver works
+  out-of-the box with every card, because of different wiring.
+
+  Note 2: The demodulator chips can be used with a variety of
+  tuner/PLL chips, and not all combinations are supported. Often
+  the demodulator and tuner/PLL chip are inside a metal box for
+  shielding, and the whole metal box has its own part number.
+
+
+o Frontends drivers: 
+  - dvb_dummy_fe: for testing...
+  DVB-S:
+   - alps_bsrv2		: Alps BSRV2 (ves1893 demodulator)
+   - cx24110		: Conexant HM1221/HM1811 (cx24110 or cx24106 demod, cx24108 PLL)
+   - grundig_29504-491	: Grundig 29504-491 (Philips TDA8083 demodulator), tsa5522 PLL
+   - mt312		: Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLL
+   - stv0299		: Alps BSRU6 (tsa5059 PLL), LG TDQB-S00x (tsa5059 PLL),
+   			  LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL), 
+			  Philips SU1278SH (tsa5059 PLL)
+  DVB-C:
+   - ves1820		: various (ves1820 demodulator, sp5659c or spXXXX PLL)
+   - at76c651		: Atmel AT76c651(B) with DAT7021 PLL
+  DVB-T:
+   - alps_tdlb7		: Alps TDLB7 (sp8870 demodulator, sp5659 PLL)
+   - alps_tdmb7		: Alps TDMB7 (cx22700 demodulator)
+   - grundig_29504-401	: Grundig 29504-401 (LSI L64781 demodulator), tsa5060 PLL
+   - tda1004x		: Philips tda10045h (td1344 or tdm1316l PLL)
+   - nxt6000 		: Alps TDME7 (MITEL SP5659 PLL), Alps TDED4 (TI ALP510 PLL),
+               		  Comtech DVBT-6k07 (SP5730 PLL)
+               		  (NxtWave Communications NXT6000 demodulator)
+
+
+o Cards based on the Phillips saa7146 multimedia PCI bridge chip:
+  - TI AV7110 based cards (i.e. with hardware MPEG decoder):
+    - Siemens/Technotrend/Hauppauge PCI DVB card revision 1.1, 1.3, 1.5, 1.6, 2.1
+      (aka Hauppauge Nexus)
+  - "budget" cards (i.e. without hardware MPEG decoder):
+    - Technotrend Budget / Hauppauge WinTV-Nova PCI Cards
+    - SATELCO Multimedia PCI
+    - KNC1 DVB-S
+
+o Cards based on the B2C2 Inc. FlexCopII:
+  - Technisat SkyStar2 PCI DVB
+
+o Cards based on the Conexant Bt8xx PCI bridge:
+  - Pinnacle PCTV Sat DVB
+  - Nebula Electronics DigiTV
+
+o Technotrend / Hauppauge DVB USB devices:
+  - Nova USB
+  - DEC 2000-T
+
+o Preliminary support for the analog module of the Siemens DVB-C PCI card
+
diff -Nru a/Documentation/dvb/contributors.txt b/Documentation/dvb/contributors.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/contributors.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,62 @@
+Thanks go to the following people for patches and contributions:
+
+Michael Hunold <m.hunold@gmx.de>
+  for the initial saa7146 driver and it's recent overhaul
+
+Christian Theiss
+  for his work on the initial Linux DVB driver
+
+Marcus Metzler <mocm@metzlerbros.de>
+Ralph Metzler <rjkm@metzlerbros.de>
+  for their contining work on the DVB driver
+
+Michael Holzt <kju@debian.org>
+  for his contributions to the dvb-net driver
+
+Diego Picciani <d.picciani@novacomp.it>
+  for CyberLogin for Linux which allows logging onto EON
+  (in case you are wondering where CyberLogin is, EON changed its login 
+  procedure and CyberLogin is no longer used.)
+
+Martin Schaller <martin@smurf.franken.de>
+  for patching the cable card decoder driver
+
+Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>
+  for various fixes regarding tuning, OSD and CI stuff and his work on VDR
+
+Steve Brown <sbrown@cortland.com>
+  for his AFC kernel thread
+
+Christoph Martin <martin@uni-mainz.de>
+  for his LIRC infrared handler
+
+Andreas Oberritter <obi@linuxtv.org>
+Dennis Noermann <dennis.noermann@noernet.de>
+Felix Domke <tmbinc@elitedvb.net>
+Florian Schirmer <jolt@tuxbox.org>
+Ronny Strutz <3des@elitedvb.de>
+Wolfram Joost <dbox2@frokaschwei.de>
+...and all the other dbox2 people
+  for many bugfixes in the generic DVB Core, frontend drivers and
+  their work on the dbox2 port of the DVB driver
+
+Oliver Endriss <o.endriss@gmx.de>
+  for many bugfixes
+
+Andrew de Quincey <adq_dvb@lidskialf.net>
+  for the tda1004x frontend driver, and various bugfixes
+
+Peter Schildmann <peter.schildmann@web.de>
+  for the driver for the Technisat SkyStar2 PCI DVB card
+
+Vadim Catana <skystar@moldova.cc>
+Roberto Ragusa <r.ragusa@libero.it>
+Augusto Cardoso <augusto@carhil.net>
+  for all the work for the FlexCopII chipset by B2C2,Inc.
+
+Davor Emard <emard@softhome.net>
+  for his work on the budget drivers, the demux code,
+  the module unloading problems, ...
+  
+(If you think you should be in this list, but you are not, drop a
+ line to the DVB mailing list)
diff -Nru a/Documentation/dvb/faq.txt b/Documentation/dvb/faq.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/faq.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,109 @@
+Some very frequently asked questions about linuxtv-dvb
+
+1. The signal seems to die a few seconds after tuning.
+
+	It's not a bug, it's a feature. Because the frontends have
+	significant power requirements (and hence get very hot), they
+	are powered down if they are unused (i.e. if the frontend device
+	is closed). The dvb-core.o module paramter "dvb_shutdown_timeout"
+	allow you to change the timeout (default 5 seconds). Setting the
+	timeout to 0 disables the timeout feature.
+
+2. How can I watch TV?
+
+	The driver distribution includes some simple utilities which
+	are mainly intended for testing and to demonstrate how the
+	DVB API works.
+
+	Depending on whether you have a DVB-S, DVB-C or DVB-T card, use
+	apps/szap/szap, czap or tzap. You must supply a channel list
+	in ~/.[sct]zap/channels.conf. If you are lucky you can just copy
+	one of the supplied channel lists, or you can create a new one
+	by running apps/scan/scan. If you run scan on an unknown network
+	you might have to supply some start data in apps/scan/initial.h.
+
+	If you have a card with a built-in hardware MPEG-decoder the
+	drivers create a video4linux device (/dev/v4l/video0) which
+	you can use to watch TV with any v4l application. xawtv is known
+	to work. Note that you cannot change channels with xawtv, you
+	have to zap using [sct]zap. If you want a nice application for
+	TV watching and record/playback, have a look at VDR.
+
+	If your card does not have a hardware MPEG decoder you need
+	a software MPEG decoder. Mplayer or xine are known to work.
+	Newsflash: MythTV also has DVB support now.
+	Note: Only very recent versions of Mplayer and xine can decode.
+	MPEG2 transport streams (TS) directly. Then, run
+	'[sct]zap channelname -r' in one xterm, and keep it running,
+	and start 'mplayer - < /dev/dvb/adapter0/dvr0' or 
+	'xine stdin://mpeg2 < /dev/dvb/adapter0/dvr0' in a second xterm.
+	That's all far from perfect, but it seems no one has written
+	a nice DVB application which includes a builtin software MPEG
+	decoder yet.
+
+	Newsflash: Newest xine directly supports DVB. Just copy your
+	channels.conf to ~/.xine and start 'xine dvb://', or select
+	the DVB button in the xine GUI. Channel switching works using the
+	numpad pgup/pgdown (NP9 / NP3) keys to scroll through the channel osd
+	menu and pressing numpad-enter to switch to the selected channel.
+
+	Note: Older versions of xine and mplayer understand MPEG program
+	streams (PS) only, and can be used in conjunction with the
+	ts2ps tool from the Metzler Brother's dvb-mpegtools package.
+
+3. Which other DVB applications exist?
+
+	http://www.cadsoft.de/people/kls/vdr/
+		Klaus Schmidinger's Video Disk Recorder
+
+	http://www.metzlerbros.org/dvb/
+		Metzler Bros. DVB development; alternate drivers and
+		DVB utilities, include dvb-mpegtools and tuxzap.
+
+	http://www.linuxstb.org/
+	http://sourceforge.net/projects/dvbtools/
+		Dave Chapman's dvbtools package, including
+		dvbstream and dvbtune
+
+	http://www.linuxdvb.tv/
+		Henning Holtschneider's site with many interesting
+		links and docs
+
+	http://www.dbox2.info/
+		LinuxDVB on the dBox2
+
+	http://www.tuxbox.org/
+	http://cvs.tuxbox.org/
+		the TuxBox CVS many interesting DVB applications and the dBox2
+		DVB source
+
+	http://sourceforge.net/projects/dvbsak/
+		DVB Swiss Army Knife library and utilities
+
+	http://www.nenie.org/misc/mpsys/
+		MPSYS: a MPEG2 system library and tools
+
+	http://mplayerhq.hu/
+		mplayer
+
+	http://xine.sourceforge.net/
+	http://xinehq.de/
+		xine
+
+	http://www.mythtv.org/
+		MythTV - analog TV PVR, but now with DVB support, too
+		(with software MPEG decode)
+
+4. Can't get a signal tuned correctly
+
+	If you are using a Technotrend/Hauppauge DVB-C card *without* analog
+	module, you might have to use module parameter adac=-1 (dvb-ttpci.o).
+
+5. The dvb_net device doesn't give me any multicast packets
+
+	Check your routes if they include the multicast address range.
+	Additionally make sure that "source validation by reversed path
+	lookup" is disabled:
+	  $ "echo 0 > /proc/sys/net/ipv4/conf/dvb0/rp_filter"
+
+eof
diff -Nru a/Documentation/dvb/firmware.txt b/Documentation/dvb/firmware.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/firmware.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,116 @@
+Some DVB cards and many newer frontends require proprietary,
+binary-only firmware.
+
+The DVB drivers will be converted to use the request_firmware()
+hotplug interface (see linux/Documentation/firmware_class/).
+(CONFIG_FW_LOADER)
+
+The firmware can be loaded automatically via the hotplug manager
+or manually with the steps described below.
+
+Currently the drivers still use various different methods
+to load their firmwares, so here's just a short list of the
+current state:
+
+- dvb-ttpci: driver uses firmware hotplug interface
+- ttusb-budget: firmware is compiled in (dvb-ttusb-dspbootcode.h)
+- sp887x: firmware is compiled in (sp887x_firm.h)
+- alps_tdlb7: firmware is loaded from path specified by
+		"mcfile" module parameter; the binary must be
+		extracted from the Windows driver (Sc_main.mc).
+- tda1004x: firmware is loaded from path specified in
+		DVB_TDA1004X_FIRMWARE_FILE kernel config
+		variable (default /etc/dvb/tda1004x.bin); the
+		firmware binary must be extracted from the windows
+		driver
+- ttusb-dec: see "ttusb-dec.txt" for details
+
+1) Automatic firmware loading
+
+You need to install recent hotplug scripts if your distribution did not do it
+for you already, especially the  /etc/hotplug/firmware.agent.
+http://linux-hotplug.sourceforge.net/ (Call /sbin/hotplug without arguments
+to find out if the firmware agent is installed.)
+
+The firmware.agent script expects firmware binaries in
+/usr/lib/hotplug/firmware/. To avoid naming and versioning
+conflicts we propose the following naming scheme:
+
+  /usr/lib/hotplug/firmware/dvb-{driver}-{ver}.fw	for MPEG decoders etc.
+  /usr/lib/hotplug/firmware/dvb-fe-{driver}-{ver}.fw	for frontends
+
+  {driver} name is the basename of the driver kernel module (e.g. dvb-ttpci)
+  {ver} is a version number/name that should change only when the
+  driver/firmware internal API changes (so users are free to install the
+  latest firmware compatible with the driver).
+
+2) Manually loading the firmware into a driver
+   (currently only the dvb-ttpci / av7110 driver supports this)
+   
+Step a) Mount sysfs-filesystem.
+
+Sysfs provides a means to export kernel data structures, their attributes,
+and the linkages between them to userspace. 
+
+For detailed informations have a look at Documentation/filesystems/sysfs.txt 
+All you need to know at the moment is that firmware loading only works through
+sysfs.
+
+> mkdir /sys
+> mount -t sysfs sysfs /sys
+
+Step b) Exploring the firmware loading facilities
+
+Firmware_class support is located in
+/sys/class/firmware
+
+> dir /sys/class/firmware
+
+The "timeout" values specifies the amount of time that is waited before the
+firmware upload  process is cancelled. The default values is 10 seconds. If
+you use a hotplug script for the firmware upload, this is sufficient. If
+you want to upload the firmware by hand, however, this might be too fast.
+
+> echo "180" > /sys/class/firmware/timeout
+
+Step c) Getting a usable firmware file for the dvb-ttpci driver/av7110 card.
+
+You can download the firmware files from
+http://www.linuxtv.org/download/dvb/
+
+Please note that in case of the dvb-ttpci driver this is *not* the "Root"
+file you probably know from the 2.4 DVB releases driver.
+
+> wget http://www.linuxtv.org/download/dvb/dvb-ttpci-01.fw
+gets you the version 01 of the firmware fot the ttpci driver.
+
+Step d) Loading the dvb-ttpci driver and loading the firmware
+
+"modprobe" will take care that every needed module will be loaded
+automatically (except the frontend driver)
+
+> modprobe dvb-ttpci
+
+The "modprobe" process will hang until
+a) you upload the firmware or
+b) the timeout occurs.
+
+Change to another terminal and have a look at 
+
+> dir /sys/class/firmware/
+
+total 0
+drwxr-xr-x    2 root     root            0 Jul 29 11:00 0000:03:05.0
+-rw-r--r--    1 root     root            0 Jul 29 10:41 timeout
+
+"0000:03:05.0" is the id for my dvb-c card. It depends on the pci slot,
+so it changes if you plug the card to different slots.
+
+You can upload the firmware like that:
+
+> export DEVDIR=/sys/class/firmware/0000\:03\:05.0
+> echo 1 > $DEVDIR/loading
+> cat dvb-ttpci-01.fw > $DEVDIR/data
+> echo 0 > $DEVDIR/loading
+
+That's it. The driver should be up and running now.
diff -Nru a/Documentation/dvb/readme.txt b/Documentation/dvb/readme.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/readme.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,44 @@
+Linux Digital Video Broadcast (DVB) subsystem
+=============================================
+
+The main development site and CVS repository for these
+drivers is http://linuxtv.org/.
+
+The developer mailing list linux-dvb is also hosted there,
+see http://linuxtv.org/mailinglists.xml. Please check
+the archive http://linuxtv.org/mailinglists/linux-dvb/
+before asking newbie questions on the list.
+
+API documentation, utilities and test/example programs
+are available as part of the old driver package for Linux 2.4
+(linuxtv-dvb-1.0.x.tar.gz), or from CVS (module DVB).
+We plan to split this into separate packages, but it's not
+been done yet.
+
+http://linuxtv.org/download/dvb/
+
+What's inside this directory:
+
+"cards.txt" 
+contains a list of supported hardware.
+
+"contributors.txt"
+is the who-is-who of DVB development
+
+"faq.txt"
+contains frequently asked questions and their answers.
+
+"firmware.txt" 
+contains informations for required external firmware
+files and where to get them.
+
+"ttusb-dec.txt"
+contains detailed informations about the
+TT DEC2000/DEC3000 USB DVB hardware.
+
+"bt8xx.txt" 
+contains detailed installation instructions for the
+various bt8xx based "budget" DVB cards
+(Nebula, Pinnacle PCTV, Twinhan DST)
+
+Good luck and have fun!
diff -Nru a/Documentation/dvb/ttusb-dec.txt b/Documentation/dvb/ttusb-dec.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/dvb/ttusb-dec.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,49 @@
+TechnoTrend/Hauppauge DEC USB Driver
+====================================
+
+Driver Status
+-------------
+
+Supported:
+	DEC2000-t
+	Linux Kernels 2.4 and 2.6
+	Video Streaming
+	Audio Streaming
+	Section Filters
+	Channel Zapping
+	Hotplug firmware loader under 2.6 kernels
+
+In Progress:
+	DEC3000-s
+
+To Do:
+	Tuner status information
+	DVB network interface
+	Streaming video PC->DEC
+
+Getting the Firmware
+--------------------
+Currently, the driver only works with v2.15a of the firmware.  The firmwares
+can be obtained in this way:
+
+wget http://hauppauge.lightpath.net/de/dec215a.exe
+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_S.bin
+
+
+Compilation Notes for 2.4 kernels
+---------------------------------
+For 2.4 kernels the firmware for the DECs is compiled into the driver itself.
+The firmwares are expected to be in /etc/dvb at compilation time.
+
+mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+mv STB_PC_S.bin /etc/dvb/dec3000s.bin
+
+
+Hotplug Firmware Loading for 2.6 kernels
+----------------------------------------
+For 2.6 kernels the firmware is loaded at the point that the driver module is
+loaded.  See linux/Documentation/dvb/firmware.txt for more information.
+
+mv STB_PC_T.bin /usr/lib/hotplug/firmware/dvb-ttusb-dec-2000t-2.15a.fw
+mv STB_PC_S.bin /usr/lib/hotplug/firmware/dvb-ttusb-dec-3000s-2.15a.fw
diff -Nru a/Documentation/fb/aty128fb.txt b/Documentation/fb/aty128fb.txt
--- a/Documentation/fb/aty128fb.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/fb/aty128fb.txt	Thu Jan  8 23:00:23 2004
@@ -32,7 +32,7 @@
 You should compile in both vgacon (to boot if you remove your Rage128 from
 box) and aty128fb (for graphics mode). You should not compile-in vesafb
 unless you have primary display on non-Rage128 VBE2.0 device (see 
-Documentation/vesafb.txt for details).
+Documentation/fb/vesafb.txt for details).
 
 
 X11
diff -Nru a/Documentation/fb/matroxfb.txt b/Documentation/fb/matroxfb.txt
--- a/Documentation/fb/matroxfb.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/fb/matroxfb.txt	Thu Jan  8 23:00:24 2004
@@ -31,7 +31,7 @@
 You should compile in both vgacon (to boot if you remove you Matrox from
 box) and matroxfb (for graphics mode). You should not compile-in vesafb
 unless you have primary display on non-Matrox VBE2.0 device (see 
-Documentation/vesafb.txt for details).
+Documentation/fb/vesafb.txt for details).
 
 Currently supported video modes are (through vesa:... interface, PowerMac
 has [as addon] compatibility code):
diff -Nru a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
--- a/Documentation/filesystems/Locking	Thu Jan  8 23:00:24 2004
+++ b/Documentation/filesystems/Locking	Thu Jan  8 23:00:24 2004
@@ -420,7 +420,7 @@
 prototypes:
 	void (*open)(struct vm_area_struct*);
 	void (*close)(struct vm_area_struct*);
-	struct page *(*nopage)(struct vm_area_struct*, unsigned long, int);
+	struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
 
 locking rules:
 		BKL	mmap_sem
diff -Nru a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt
--- a/Documentation/filesystems/xfs.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/filesystems/xfs.txt	Thu Jan  8 23:00:24 2004
@@ -29,10 +29,11 @@
 	The preferred buffered I/O size can also be altered on an
 	individual file basis using the ioctl(2) system call.
 
-  ikeep
+  ikeep/noikeep
 	When inode clusters are emptied of inodes, keep them around
-	on the disk, this is the old XFS behavior. Default is now to
-	return the inode cluster to the free space pool.
+	on the disk (ikeep) - this is the traditional XFS behaviour
+	and is still the default for now.  Using the noikeep option,
+	inode clusters are returned to the free space pool.
 
   logbufs=value
 	Set the number of in-memory log buffers.  Valid numbers range
@@ -75,6 +76,10 @@
 	Filesystems mounted "norecovery" must be mounted read-only or
 	the mount will fail.
 
+  nouuid
+	Don't check for double mounted file systems using the file system uuid.
+	This is useful to mount LVM snapshot volumes.
+
   osyncisosync
 	Make O_SYNC writes implement true O_SYNC.  WITHOUT this option,
 	Linux XFS behaves as if an "osyncisdsync" option is used,
@@ -108,10 +113,6 @@
 	The "swidth" option is required if the "sunit" option has been
 	specified, and must be a multiple of the "sunit" value.
 
-  nouuid
-        Don't check for double mounted file systems using the file system uuid.
-        This is useful to mount LVM snapshot volumes.
-
 sysctls
 =======
 
@@ -139,14 +140,14 @@
 	Causes certain error conditions to call BUG(). Value is a bitmask; 
 	AND together the tags which represent errors which should cause panics:
 	
-		XFS_NO_PTAG                     0LL
-		XFS_PTAG_IFLUSH                 0x0000000000000001LL
-		XFS_PTAG_LOGRES                 0x0000000000000002LL
-		XFS_PTAG_AILDELETE              0x0000000000000004LL
-		XFS_PTAG_ERROR_REPORT           0x0000000000000008LL
-		XFS_PTAG_SHUTDOWN_CORRUPT       0x0000000000000010LL
-		XFS_PTAG_SHUTDOWN_IOERROR       0x0000000000000020LL
-		XFS_PTAG_SHUTDOWN_LOGERROR      0x0000000000000040LL
+		XFS_NO_PTAG                     0
+		XFS_PTAG_IFLUSH                 0x00000001
+		XFS_PTAG_LOGRES                 0x00000002
+		XFS_PTAG_AILDELETE              0x00000004
+		XFS_PTAG_ERROR_REPORT           0x00000008
+		XFS_PTAG_SHUTDOWN_CORRUPT       0x00000010
+		XFS_PTAG_SHUTDOWN_IOERROR       0x00000020
+		XFS_PTAG_SHUTDOWN_LOGERROR      0x00000040
 
 	This option is intended for debugging only.		
 
@@ -164,6 +165,21 @@
   fs.xfs.restrict_chown		(Min: 0  Default: 1  Max: 1)
   	Controls whether unprivileged users can use chown to "give away"
 	a file to another user.
+
+  fs.xfs.inherit_sync		(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "sync" flag set 
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
+
+  fs.xfs.inherit_nodump		(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "nodump" flag set 
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
+
+  fs.xfs.inherit_noatime	(Min: 0  Default: 1  Max 1)
+	Setting this to "1" will cause the "noatime" flag set 
+	by the chattr(1) command on a directory to be
+	inherited by files in that directory.
 
   vm.pagebuf.stats_clear	(Min: 0  Default: 0  Max: 1)
 	Setting this to "1" clears accumulated pagebuf statistics 
diff -Nru a/Documentation/i2c/i2c-velleman b/Documentation/i2c/i2c-velleman
--- a/Documentation/i2c/i2c-velleman	Thu Jan  8 23:00:24 2004
+++ b/Documentation/i2c/i2c-velleman	Thu Jan  8 23:00:24 2004
@@ -1,6 +1,6 @@
 i2c-velleman driver
 -------------------
-This is a driver for i2c-hw access for Velleman K9000 and other adapters.
+This is a driver for i2c-hw access for Velleman K8000 and other adapters.
 
 Useful links
 ------------
@@ -10,18 +10,14 @@
 Velleman K8000 Howto:
 	http://howto.htlw16.ac.at/k8000-howto.html
 
-
 K8000 and K8005 libraries
 -------------------------
-The project has lead to new libs for the Velleman K8000 and K8005..
+The project has lead to new libs for the Velleman K8000 and K8005:
 LIBK8000 v1.99.1 and LIBK8005 v0.21
 
-With these libs you can control the K8000 and K8005 with the original
-simple commands which are in the original Velleman software.
-Like SetIOchannel, ReadADchannel, SendStepCCWFull and many more.
-Via i2c kernel device /dev/velleman
+With these libs, you can control the K8000 interface card and the K8005
+stepper motor card with the simple commands which are in the original
+Velleman software, like SetIOchannel, ReadADchannel, SendStepCCWFull and
+many more, using /dev/velleman.
 
 The libs can be found on http://groups.yahoo.com/group/k8000/files/linux/
-
-The Velleman K8000 interface card on http://www.velleman.be/kits/k8000.htm
-The Velleman K8005 steppermotorcard on http://www.velleman.be/kits/k8005.htm
diff -Nru a/Documentation/i2c/porting-clients b/Documentation/i2c/porting-clients
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/i2c/porting-clients	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,121 @@
+Revision 3, 2003-10-04
+Jean Delvare <khali@linux-fr.org>
+Greg KH <greg@kroah.com>
+
+This is a guide on how to convert I2C chip drivers from Linux 2.4 to
+Linux 2.6. I have been using existing drivers (lm75, lm78) as examples.
+Then I converted a driver myself (lm83) and updated this document.
+
+There are two sets of points below. The first set concerns technical
+changes. The second set concerns coding policy. Both are mandatory.
+
+Although reading this guide will help you porting drivers, I suggest
+you keep an eye on an already ported driver while porting your own
+driver. This will help you a lot understanding what this guide
+exactly means. Choose the chip driver that is the more similar to
+yours for best results.
+
+Technical changes:
+
+* [Includes] Get rid of "version.h". Replace <linux/i2c-proc.h> with
+  <linux/i2c-sensor.h>. Includes typically look like that:
+  #include <linux/module.h>
+  #include <linux/init.h>
+  #include <linux/slab.h>
+  #include <linux/i2c.h>
+  #include <linux/i2c-sensor.h>
+  #include <linux/i2c-vid.h>     /* if you need VRM support */
+  #include <asm/io.h>            /* if you have I/O operations */
+  Some extra headers may be required for a given driver.
+
+* [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, SENSORS_ISA_END
+  becomes I2C_CLIENT_ISA_END.
+
+* [Client data] Get rid of sysctl_id. Try using standard names for
+  register values (for example, temp_os becomes temp_max). You're
+  still relatively free here, but you *have* to follow the standard
+  names for sysfs files (see the Sysctl section below).
+
+* [Function prototypes] The detect functions loses its flags
+  parameter. Sysctl (e.g. lm75_temp) and miscellaneous (e.g.
+  swap_bytes) functions are off the list of prototypes. This
+  usually leaves five prototypes:
+  static int lm75_attach_adapter(struct i2c_adapter *adapter);
+  static int lm75_detect(struct i2c_adapter *adapter, int address,
+      int kind);
+  static void lm75_init_client(struct i2c_client *client);
+  static int lm75_detach_client(struct i2c_client *client);
+  static void lm75_update_client(struct i2c_client *client);
+
+* [Sysctl] All sysctl stuff is of course gone (defines, ctl_table
+  and functions). Instead, right after the static id definition
+  line, you have to define show and set functions for each sysfs
+  file. Only define set for writable values. Take a look at an
+  existing 2.6 driver for details (lm78 for example). Don't forget
+  to define the attributes for each file (this is that step that
+  links callback functions). Use the file names specified in
+  Documentation/i2c/sysfs-interface for the individual files. Also
+  convert the units these files read and write to the specified ones.
+  If you need to add a new type of file, please discuss it on the
+  sensors mailing list <sensors@stimpy.netroedge.com> by providing a
+  patch to the Documentation/i2c/sysfs-interface file.
+
+* [Attach] For I2C drivers, the attach function should make sure
+  that the adapter's class has I2C_ADAP_CLASS_SMBUS, using the
+  following construct:
+  if (!(adapter->class & I2C_ADAP_CLASS_SMBUS))
+          return 0;
+  ISA-only drivers of course don't need this.
+
+* [Detect] As mentioned earlier, the flags parameter is gone.
+  The type_name and client_name strings are replaced by a single
+  name string, which will be filled with a lowercase, short string
+  (typically the driver name, e.g. "lm75"). The errorN labels are
+  reduced to the number needed. If that number is 2 (i2c-only
+  drivers), it is advised that the labels are named exit and
+  exit_free. For i2c+isa drivers, labels should be named ERROR0,
+  ERROR1 and ERROR2. Don't forget to properly set err before
+  jumping to error labels. By the way, labels should be
+  left-aligned.
+  Use memset to fill the client and data area with 0x00.
+  Use i2c_set_clientdata to set the client data (as opposed to
+  a direct access to client->data).
+  Use strlcpy instead of strcpy to copy the client name.
+  Replace the sysctl directory registration by calls to
+  device_create_file. Move the driver initialization before any
+  sysfs file creation.
+
+* [Detach] Get rid of data, remove the call to
+  i2c_deregister_entry.
+
+* [Update] Don't access client->data directly, use
+  i2c_get_clientdata(client) instead.
+
+* [Interface] Init function should not print anything. Make sure
+  there is a MODULE_LICENSE() line.
+
+Coding policy:
+
+* [Copyright] Use (C), not (c), for copyright.
+
+* [Debug/log] Get rid of #ifdef DEBUG/#endif constructs whenever you
+  can. Calls to printk/pr_debug for debugging purposes are replaced
+  by calls to dev_dbg. Here is an example on how to call it (taken
+  from lm75_detect):
+  dev_dbg(&adapter->dev,
+          "lm75_detect called for an ISA bus adapter?!?\n");
+  Replace other printk calls with the dev_info, dev_err or dev_warn
+  function, as appropriate.
+
+* [Constants] Constants defines (registers, conversions, initial
+  values) should be aligned. This greatly improves readability.
+  Same goes for variables declarations. Alignments are achieved by the
+  means of tabs, not spaces. Remember that tabs are set to 8 in the
+  Linux kernel code.
+
+* [Structure definition] The name field should be standardized. All
+  lowercase and as simple as the driver name itself (e.g. "lm75").
+
+* [Layout] Avoid extra empty lines between comments and what they
+  comment. Respect the coding style (see Documentation/CodingStyle),
+  in particular when it comes to placing curly braces.
diff -Nru a/Documentation/i2c/summary b/Documentation/i2c/summary
--- a/Documentation/i2c/summary	Thu Jan  8 23:00:24 2004
+++ b/Documentation/i2c/summary	Thu Jan  8 23:00:24 2004
@@ -71,5 +71,5 @@
 i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT)
 i2c-pport:       Primitive parallel port adapter (uses i2c-algo-bit)
 i2c-rpx:         RPX board Motorola 8xx I2C device (uses i2c-algo-8xx) (NOT BUILT BY DEFAULT)
-i2c-velleman:    Velleman K9000 parallel port adapter (uses i2c-algo-bit)
+i2c-velleman:    Velleman K8000 parallel port adapter (uses i2c-algo-bit)
 
diff -Nru a/Documentation/i2c/sysfs-interface b/Documentation/i2c/sysfs-interface
--- a/Documentation/i2c/sysfs-interface	Thu Jan  8 23:00:23 2004
+++ b/Documentation/i2c/sysfs-interface	Thu Jan  8 23:00:23 2004
@@ -68,9 +68,7 @@
 		Fixed point XXXXX, divide by 1000 to get Amps.
 		Read/Write.
 
-curr_min[1-n]	Current min or hysteresis value.
-		Preferably a hysteresis value, reported as a absolute
-		current, NOT a delta from the max value.
+curr_min[1-n]	Current min value.
 		Fixed point XXXXX, divide by 1000 to get Amps.
 		Read/Write.
 
@@ -144,25 +142,38 @@
 		Integers 1,2,3, or thermistor Beta value (3435)
 		Read/Write.
 
-temp_max[1-3]	Temperature max value.
+temp_max[1-4]	Temperature max value.
 		Fixed point value in form XXXXX and should be divided by
 		1000 to get degrees Celsius.
 		Read/Write value.
 
-temp_min[1-3]	Temperature min or hysteresis value.
+temp_min[1-3]	Temperature min value.
 		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.  This is preferably a
-		hysteresis value, reported as a absolute temperature,
-		NOT a delta from the max value.
+		1000 to get degrees Celsius.
 		Read/Write value.
 
-temp_input[1-3] Temperature input value.
+temp_hyst[1-3]	Temperature hysteresis value.
+		Fixed point value in form XXXXX and should be divided by
+		1000 to get degrees Celsius.  Must be reported as an
+		absolute temperature, NOT a delta from the max value.
+		Read/Write value.
+
+temp_input[1-4] Temperature input value.
+		Fixed point value in form XXXXX and should be divided by
+		1000 to get degrees Celsius.
 		Read only value.
 
+temp_crit	Temperature critical value, typically greater than all
+		temp_max values.
+		Fixed point value in form XXXXX and should be divided by
+		1000 to get degrees Celsius.
+		Common to all temperature channels.
+		Read/Write value.
+
 		If there are multiple temperature sensors, temp_*1 is
 		generally the sensor inside the chip itself, generally
-		reported as "motherboard temperature".  temp_*2 and
-		temp_*3 are generally sensors external to the chip
+		reported as "motherboard temperature".  temp_*2 to
+		temp_*4 are generally sensors external to the chip
 		itself, for example the thermal diode inside the CPU or
 		a thermistor nearby.
 
diff -Nru a/Documentation/i2c/writing-clients b/Documentation/i2c/writing-clients
--- a/Documentation/i2c/writing-clients	Thu Jan  8 23:00:23 2004
+++ b/Documentation/i2c/writing-clients	Thu Jan  8 23:00:23 2004
@@ -24,16 +24,14 @@
 routines, a client structure specific information like the actual I2C
 address.
 
-  struct i2c_driver foo_driver
-  {  
-    /* name           */  "Foo version 2.3 and later driver",
-    /* id             */  I2C_DRIVERID_FOO,
-    /* flags          */  I2C_DF_NOTIFY,
-    /* attach_adapter */  &foo_attach_adapter,
-    /* detach_client  */  &foo_detach_client,
-    /* command        */  &foo_command,   /* May be NULL */
-    /* inc_use        */  &foo_inc_use,   /* May be NULL */
-    /* dec_use        */  &foo_dec_use    /* May be NULL */
+  static struct i2c_driver foo_driver = {
+    .owner          = THIS_MODULE,
+    .name           = "Foo version 2.3 driver",
+    .id             = I2C_DRIVERID_FOO, /* usually from i2c-id.h */
+    .flags          = I2C_DF_NOTIFY,
+    .attach_adapter = &foo_attach_adapter,
+    .detach_client  = &foo_detach_client,
+    .command        = &foo_command /* may be NULL */
   }
  
 The name can be chosen freely, and may be upto 40 characters long. Please
@@ -50,43 +48,8 @@
 All other fields are for call-back functions which will be explained 
 below.
 
-
-Module usage count
-==================
-
-If your driver can also be compiled as a module, there are moments at 
-which the module can not be removed from memory. For example, when you
-are doing a lengthy transaction, or when you create a /proc directory,
-and some process has entered that directory (this last case is the
-main reason why these call-backs were introduced).
-
-To increase or decrease the module usage count, you can use the
-MOD_{INC,DEC}_USE_COUNT macros. They must be called from the module
-which needs to get its usage count changed; that is why each driver
-module has to implement its own callback.
-
-  void foo_inc_use (struct i2c_client *client)
-  {
-  #ifdef MODULE
-    MOD_INC_USE_COUNT;
-  #endif
-  }
-
-  void foo_dec_use (struct i2c_client *client)
-  {
-  #ifdef MODULE
-    MOD_DEC_USE_COUNT;
-  #endif
-  }
-
-Do not call these call-back functions directly; instead, use one of the
-following functions defined in i2c.h:
-  void i2c_inc_use_client(struct i2c_client *);
-  void i2c_dec_use_client(struct i2c_client *);
-
-You should *not* increase the module count just because a device is
-detected and a client created. This would make it impossible to remove
-an adapter driver! 
+There use to be two additional fields in this structure, inc_use et dec_use,
+for module usage count, but these fields were obsoleted and removed.
 
 
 Extra client data
diff -Nru a/Documentation/i386/zero-page.txt b/Documentation/i386/zero-page.txt
--- a/Documentation/i386/zero-page.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/i386/zero-page.txt	Thu Jan  8 23:00:23 2004
@@ -22,6 +22,7 @@
 			  0x90000 + contents of CL_OFFSET
 			(only taken, when CL_MAGIC = 0xA33F)
  0x40	20 bytes	struct apm_bios_info, APM_BIOS_INFO
+ 0x60	16 bytes	Intel SpeedStep (IST) BIOS support information
  0x80	16 bytes	hd0-disk-parameter from intvector 0x41
  0x90	16 bytes	hd1-disk-parameter from intvector 0x46
 
diff -Nru a/Documentation/input/input.txt b/Documentation/input/input.txt
--- a/Documentation/input/input.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/input/input.txt	Thu Jan  8 23:00:23 2004
@@ -255,7 +255,7 @@
 is also emulated, characters should appear if you move it.
 
   You can test the joystick emulation with the 'jstest' utility,
-available in the joystick package (see Documentation/joystick.txt).
+available in the joystick package (see Documentation/input/joystick.txt).
 
   You can test the event devices with the 'evtest' utility available
 in the LinuxConsole project CVS archive (see the URL below).
diff -Nru a/Documentation/kbuild/kconfig-language.txt b/Documentation/kbuild/kconfig-language.txt
--- a/Documentation/kbuild/kconfig-language.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/kbuild/kconfig-language.txt	Thu Jan  8 23:00:23 2004
@@ -141,8 +141,8 @@
     otherwise 'y'.
 (4) Returns the value of the expression. Used to override precedence.
 (5) Returns the result of (2-/expr/).
-(6) Returns the result of max(/expr/, /expr/).
-(7) Returns the result of min(/expr/, /expr/).
+(6) Returns the result of min(/expr/, /expr/).
+(7) Returns the result of max(/expr/, /expr/).
 
 An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
 respectively for calculations). A menu entry becomes visible when it's
diff -Nru a/Documentation/kbuild/modules.txt b/Documentation/kbuild/modules.txt
--- a/Documentation/kbuild/modules.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/kbuild/modules.txt	Thu Jan  8 23:00:24 2004
@@ -1,4 +1,4 @@
-For now this is a raw copy from the old Documentation/modules.txt,
+For now this is a raw copy from the old Documentation/kbuild/modules.txt,
 which was removed in 2.6.0-test5.
 The information herein is correct but not complete.
 
diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
--- a/Documentation/kernel-parameters.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/kernel-parameters.txt	Thu Jan  8 23:00:24 2004
@@ -24,6 +24,7 @@
 	HW	Appropriate hardware is enabled.
 	IA-32	IA-32 aka i386 architecture is enabled.
 	IA-64	IA-64 architecture is enabled.
+	IOSCHED	More than one I/O scheduler is enabled.
 	IP_PNP	IP DCHP, BOOTP, or RARP is enabled.
 	ISAPNP	ISA PnP code is enabled.
 	ISDN	Appropriate ISDN support is enabled.
@@ -303,6 +304,10 @@
 			See comment before function elanfreq_setup() in
 			arch/i386/kernel/cpu/cpufreq/elanfreq.c.
 
+	elevator=	[IOSCHED]
+			Format: {"as"|"cfq"|"deadline"|"noop"}
+			See Documentation/as-iosched.txt for details
+
 	es1370=		[HW,OSS]
 			Format: <lineout>[,<micbias>]
 			See also header of sound/oss/es1370.c.
@@ -790,7 +795,8 @@
 			before loading.
 			See Documentation/ramdisk.txt.
 
-	psmouse_noext	[HW,MOUSE] Disable probing for PS2 mouse protocol extensions
+	psmouse_proto=  [HW,MOUSE] Highest PS2 mouse protocol extension to
+			probe for (bare|imps|exps).
 
 	psmouse_resetafter=
 			[HW,MOUSE] Try to reset Synaptics Touchpad after so many
@@ -1144,7 +1150,7 @@
 			See header of drivers/scsi/wd7000.c.
 
 	wdt=		[WDT] Watchdog
-			See Documentation/watchdog.txt.
+			See Documentation/watchdog/watchdog.txt.
 
 	xd=		[HW,XT] Original XT pre-IDE (RLL encoded) disks.
 	xd_geo=		See header of drivers/block/xd.c.
diff -Nru a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
--- a/Documentation/networking/ip-sysctl.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/networking/ip-sysctl.txt	Thu Jan  8 23:00:23 2004
@@ -678,4 +678,23 @@
 Pekka Savola <pekkas@netcore.fi>
 YOSHIFUJI Hideaki / USAGI Project <yoshfuji@linux-ipv6.org>
 
+
+/proc/sys/net/bridge/* Variables:
+
+bridge-nf-call-arptables - BOOLEAN
+	1 : pass bridged ARP traffic to arptables' FORWARD chain.
+	0 : disable this.
+	Default: 1
+
+bridge-nf-call-iptables - BOOLEAN
+	1 : pass bridged IPv4 traffic to iptables' chains.
+	0 : disable this.
+	Default: 1
+
+bridge-nf-filter-vlan-tagged - BOOLEAN
+	1 : pass bridged vlan-tagged ARP/IP traffic to arptables/iptables.
+	0 : disable this.
+	Default: 1
+
+
 $Id: ip-sysctl.txt,v 1.20 2001/12/13 09:00:18 davem Exp $
diff -Nru a/Documentation/scsi/BusLogic.txt b/Documentation/scsi/BusLogic.txt
--- a/Documentation/scsi/BusLogic.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/scsi/BusLogic.txt	Thu Jan  8 23:00:23 2004
@@ -577,7 +577,7 @@
 INSMOD Loadable Kernel Module Installation Facility:
 
   insmod BusLogic.o \
-      'BusLogic_Options="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
+      'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
 
 NOTE: Module Utilities 2.1.71 or later is required for correct parsing
       of driver options containing commas.
diff -Nru a/Documentation/scsi/aic79xx.txt b/Documentation/scsi/aic79xx.txt
--- a/Documentation/scsi/aic79xx.txt	Thu Jan  8 23:00:24 2004
+++ b/Documentation/scsi/aic79xx.txt	Thu Jan  8 23:00:24 2004
@@ -1,5 +1,5 @@
 ====================================================================
-=             Adaptec Ultra320 Family Manager Set v1.3.0           =
+=             Adaptec Ultra320 Family Manager Set v1.3.11          =
 =                                                                  =
 =                            README for                            =
 =                    The Linux Operating System                    =
@@ -19,57 +19,169 @@
    The following Adaptec SCSI Host Adapters are supported by this 
    driver set. 
 
-   Ultra320 Adapters         Description
+   Ultra320 ASIC              Description
    ----------------------------------------------------------------
-   Adaptec SCSI Card 39320   Dual Channel 64-bit PCI-X 133MHz to
-                             Ultra320 SCSI Card (one external 
-                             68-pin, two internal 68-pin)
-   Adaptec SCSI Card 39320D  Dual Channel 64-bit PCI-X 133MHz to
-                             Ultra320 SCSI Card (two external VHDC
-                             and one internal 68-pin)
-   Adaptec SCSI Card 39320D  Dual Channel 64-bit PCI-X 133MHz to
-                             Ultra320 SCSI Card (two external VHDC
-                             and one internal 68-pin) based on the
-                             AIC-7902B ASIC
-   Adaptec SCSI Card 29320   Single Channel 64-bit PCI-X 133MHz to
-                             Ultra320 SCSI Card (one external 
-                             68-pin, two internal 68-pin, one
-                             internal 50-pin)
-   Adaptec SCSI Card 29320LP Single Channel 64-bit Low Profile
-                             PCI-X 133MHz to Ultra320 SCSI Card
-                             (One external VHDC, one internal
-                             68-pin)
-   AIC-7901A                 Single Channel 64-bit PCI-X 133MHz to 
-                             Ultra320 SCSI ASIC
-   AIC-7902A4                Dual Channel 64-bit PCI-X 133MHz to 
-                             Ultra320 SCSI ASIC
-   AIC-7902B                 Dual Channel 64-bit PCI-X 133MHz to
-                             Ultra320 SCSI ASIC
-
+   AIC-7901A                  Single Channel 64-bit PCI-X 133MHz to 
+                              Ultra320 SCSI ASIC
+   AIC-7901B                  Single Channel 64-bit PCI-X 133MHz to 
+                              Ultra320 SCSI ASIC with Retained Training
+   AIC-7902A4                 Dual Channel 64-bit PCI-X 133MHz to 
+                              Ultra320 SCSI ASIC
+   AIC-7902B                  Dual Channel 64-bit PCI-X 133MHz to
+                              Ultra320 SCSI ASIC with Retained Training
+
+   Ultra320 Adapters          Description                              ASIC
+   --------------------------------------------------------------------------
+   Adaptec SCSI Card 39320    Dual Channel 64-bit PCI-X 133MHz to   7902A4/7902B
+                              Ultra320 SCSI Card (one external 
+                              68-pin, two internal 68-pin)
+   Adaptec SCSI Card 39320A   Dual Channel 64-bit PCI-X 133MHz to      7902B
+                              Ultra320 SCSI Card (one external 
+                              68-pin, two internal 68-pin)
+   Adaptec SCSI Card 39320D   Dual Channel 64-bit PCI-X 133MHz to      7902A4
+                              Ultra320 SCSI Card (two external VHDC
+                              and one internal 68-pin)
+   Adaptec SCSI Card 39320D   Dual Channel 64-bit PCI-X 133MHz to      7902A4
+                              Ultra320 SCSI Card (two external VHDC
+                              and one internal 68-pin) based on the
+                              AIC-7902B ASIC
+   Adaptec SCSI Card 29320    Single Channel 64-bit PCI-X 133MHz to    7901A
+                              Ultra320 SCSI Card (one external 
+                              68-pin, two internal 68-pin, one
+                              internal 50-pin)
+   Adaptec SCSI Card 29320A   Single Channel 64-bit PCI-X 133MHz to    7901B
+                              Ultra320 SCSI Card (one external 
+                              68-pin, two internal 68-pin, one
+                              internal 50-pin)
+   Adaptec SCSI Card 29320LP  Single Channel 64-bit Low Profile        7901A
+                              PCI-X 133MHz to Ultra320 SCSI Card
+                              (One external VHDC, one internal
+                              68-pin)
+   Adaptec SCSI Card 29320ALP Single Channel 64-bit Low Profile        7901B
+                              PCI-X 133MHz to Ultra320 SCSI Card
+                              (One external VHDC, one internal
+                              68-pin)
 2. Version History
 
-   (V1.3.0, January 2003) Full regression testing for all U320 products
-   completed.
-
-   (V1.3.0 ALPHA, November 2002) Initial Alpha release.
-   Added abort and target/lun reset error recovery handler and
-   interrupt coalessing.
-
-   (V1.2.0, November 2002) Added support for Domain Validation and
-   Hewlett-Packard version of the 39320D and AIC-7902 adapters.
-   Support for previous adapters has not been fully tested and should
-   only be used at the customer's own risk.
-
-   (V1.1.1, September 2002) Added support for the Linux 2.5.X kernel series
-
-   (V1.1.0, August 2002) Added support for four additional SCSI
-   products: ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
-
-   (V1.1, August 2002) Added support for four additional SCSI
-   products: ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
+   1.3.11 (July 11, 2003)
+        - Fix several deadlock issues.
+        - Add 29320ALP and 39320B Id's.
+
+   1.3.10 (June 3rd, 2003)
+        - Align the SCB_TAG field on a 16byte boundary.  This avoids
+          SCB corruption on some PCI-33 busses.
+        - Correct non-zero luns on Rev B. hardware.
+        - Update for change in 2.5.X SCSI proc FS interface.
+        - When negotiation async via an 8bit WDTR message, send
+          an SDTR with an offset of 0 to be sure the target
+          knows we are async.  This works around a firmware defect
+          in the Quantum Atlas 10K.
+        - Implement controller susupend and resume.
+        - Clear PCI error state during driver attach so that we
+          don't disable memory mapped I/O due to a stray write
+          by some other driver probe that occurred before we
+          claimed the controller.
+
+   1.3.9 (May 22nd, 2003)
+        - Fix compiler errors.
+        - Remove S/G splitting for segments that cross a 4GB boundary.
+          This is guaranteed not to happen in Linux.
+        - Add support for scsi_report_device_reset() found in
+          2.5.X kernels.
+        - Add 7901B support.
+        - Simplify handling of the packtized lun Rev A workaround.
+        - Correct and simplify handling of the ignore wide residue
+          message.  The previous code would fail to report a residual
+          if the transaction data length was even and we received
+          an IWR message.
+
+   1.3.8 (April 29th, 2003)
+        - Fix types accessed via the command line interface code.
+        - Perform a few firmware optimizations.
+        - Fix "Unexpected PKT busfree" errors.
+        - Use a sequencer interrupt to notify the host of
+          commands with bad status.  We defer the notification
+          until there are no outstanding selections to ensure
+          that the host is interrupted for as short a time as
+          possible.
+        - Remove pre-2.2.X support.
+        - Add support for new 2.5.X interrupt API.
+        - Correct big-endian architecture support.
+
+   1.3.7 (April 16th, 2003)
+        - Use del_timer_sync() to ensure that no timeouts
+          are pending during controller shutdown.
+        - For pre-2.5.X kernels, carefully adjust our segment
+          list size to avoid SCSI malloc pool fragmentation.
+        - Cleanup channel display in our /proc output.
+        - Workaround duplicate device entries in the mid-layer
+          devlice list during add-single-device.
+
+   1.3.6 (March 28th, 2003)
+        - Correct a double free in the Domain Validation code.
+        - Correct a reference to free'ed memory during controller
+          shutdown.
+        - Reset the bus on an SE->LVD change.  This is required
+          to reset our transcievers.
+
+   1.3.5 (March 24th, 2003)
+        - Fix a few register window mode bugs.
+        - Include read streaming in the PPR flags we display in
+          diagnostics as well as /proc.
+        - Add PCI hot plug support for 2.5.X kernels.
+        - Correct default precompensation value for RevA hardware.
+        - Fix Domain Validation thread shutdown.
+        - Add a firmware workaround to make the LED blink
+          brighter during packetized operations on the H2A4.
+        - Correct /proc display of user read streaming settings.
+        - Simplify driver locking by releasing the io_request_lock
+          upon driver entry from the mid-layer.
+        - Cleanup command line parsing and move much of this code
+          to aiclib.
+
+   1.3.4 (February 28th, 2003)
+        - Correct a race condition in our error recovery handler.
+        - Allow Test Unit Ready commands to take a full 5 seconds
+          during Domain Validation.
+
+   1.3.2 (February 19th, 2003)
+        - Correct a Rev B. regression due to the GEM318
+          compatibility fix included in 1.3.1.
+          
+   1.3.1 (February 11th, 2003)
+        - Add support for the 39320A.
+        - Improve recovery for certain PCI-X errors.
+        - Fix handling of LQ/DATA/LQ/DATA for the
+          same write transaction that can occur without
+          interveining training.
+        - Correct compatibility issues with the GEM318
+          enclosure services device.
+        - Correct data corruption issue that occurred under
+          high tag depth write loads.
+        - Adapt to a change in the 2.5.X daemonize() API.
+        - Correct a "Missing case in ahd_handle_scsiint" panic.
+
+   1.3.0 (January 21st, 2003)
+        - Full regression testing for all U320 products completed.
+        - Added abort and target/lun reset error recovery handler and
+          interrupt coalessing.
+
+   1.2.0 (November 14th, 2002)
+        - Added support for Domain Validation
+        - Add support for the Hewlett-Packard version of the 39320D
+          and AIC-7902 adapters.
+        Support for previous adapters has not been fully tested and should
+        only be used at the customer's own risk.
+
+   1.1.1 (September 24th, 2002)
+        - Added support for the Linux 2.5.X kernel series
+
+   1.1.0 (September 17th, 2002)
+        - Added support for four additional SCSI products:
+          ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
 
-   (V1.0, May 2002) This is the initial release of the 
-   Ultra320 FMS.  The following is a list of supported features:
+   1.0.0 (May 30th, 2002)
+        - Initial driver release.
 
    2.1. Software/Hardware Features
         - Support for the SPI-4 "Ultra320" standard:
@@ -82,6 +194,7 @@
           supported)
         - Support for the PCI-X standard up to 133MHz
         - Support for the PCI v2.2 standard
+	- Domain Validation
 
    2.2. Operating System Support:
         - Redhat Linux 7.2, 7.3, 8.0, Advanced Server 2.1
diff -Nru a/Documentation/scsi/aic7xxx.txt b/Documentation/scsi/aic7xxx.txt
--- a/Documentation/scsi/aic7xxx.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/scsi/aic7xxx.txt	Thu Jan  8 23:00:23 2004
@@ -131,27 +131,54 @@
       SCSI "stub" effects.
 
 2. Version History
+   6.2.36 (June 3rd, 2003)
+        - Correct code that disables PCI parity error checking.
+        - Correct and simplify handling of the ignore wide residue
+          message.  The previous code would fail to report a residual
+          if the transaction data length was even and we received
+          an IWR message.
+        - Add support for the 2.5.X EISA framework.
+        - Update for change in 2.5.X SCSI proc FS interface.
+        - Correct Domain Validation command-line option parsing.
+        - When negotiation async via an 8bit WDTR message, send
+          an SDTR with an offset of 0 to be sure the target
+          knows we are async.  This works around a firmware defect
+          in the Quantum Atlas 10K.
+        - Clear PCI error state during driver attach so that we
+          don't disable memory mapped I/O due to a stray write
+          by some other driver probe that occurred before we
+          claimed the controller.
 
-        6.2.34 - Fix locking regression instroduced in 6.2.29 that
-                 could cuase a lock order reversal between the io_request_lock
-                 and our per-softc lock.  This was only possible on RH9,
-                 SuSE, and kernel.org 2.4.X kernels.
-
-        6.2.33 - Dynamically disable PCI parity error reporting after
-		 10 errors are reported to the user.  These errors are
-		 the result of some other device issuing PCI transactions
-		 with bad parity.  Once the user has been informed of the
-		 problem, continuing to report the errors just degrades
-		 our performance.
-
-        6.2.32 - Dynamically sized S/G lists to avoid SCSI malloc
-		 pool fragmentation and SCSI mid-layer deadlock.
-
-        6.2.28 - Domain Validation Fixes
-                 PCI parity error disable
-                 Enhanced Memory Mapped I/O probe
+   6.2.35 (May 14th, 2003)
+        - Fix a few GCC 3.3 compiler warnings.
+        - Correct operation on EISA Twin Channel controller.
+        - Add support for 2.5.X's scsi_report_device_reset().
 
-        6.2.20 - Added Domain Validation
+   6.2.34 (May 5th, 2003)
+        - Fix locking regression instroduced in 6.2.29 that
+          could cuase a lock order reversal between the io_request_lock
+          and our per-softc lock.  This was only possible on RH9,
+          SuSE, and kernel.org 2.4.X kernels.
+
+   6.2.33 (April 30th, 2003)
+        - Dynamically disable PCI parity error reporting after
+          10 errors are reported to the user.  These errors are
+          the result of some other device issuing PCI transactions
+          with bad parity.  Once the user has been informed of the
+          problem, continuing to report the errors just degrades
+          our performance.
+
+   6.2.32 (March 28th, 2003)
+        - Dynamically sized S/G lists to avoid SCSI malloc
+          pool fragmentation and SCSI mid-layer deadlock.
+
+   6.2.28 (January 20th, 2003)
+        - Domain Validation Fixes
+        - Add ability to disable PCI parity error checking.
+        - Enhanced Memory Mapped I/O probe
+
+   6.2.20 (November 7th, 2002)
+        - Added Domain Validation.
 
 3. Command Line Options
 
diff -Nru a/Documentation/scsi/st.txt b/Documentation/scsi/st.txt
--- a/Documentation/scsi/st.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/scsi/st.txt	Thu Jan  8 23:00:23 2004
@@ -2,7 +2,7 @@
 The driver is currently maintained by Kai Mäkisara (email
 Kai.Makisara@kolumbus.fi)
 
-Last modified: Sat Apr 12 20:26:37 2003 by makisara
+Last modified: Sun Nov  9 22:36:02 2003 by makisara
 
 
 BASICS
@@ -93,6 +93,24 @@
 device can be opened for writing even if there is a write protected
 tape in the drive (commands trying to write something return error if
 attempted).
+
+
+MINOR NUMBERS
+
+The tape driver currently supports 128 drives by default. This number
+can be increased by editing st.h and recompiling the driver if
+necessary. The upper limit is 2^17 drives if 4 modes for each drive
+are used.
+
+The minor numbers consist of the following bit fields:
+
+dev_upper non-rew mode dev-lower
+  20 -  8     7    6 5  4      0
+The non-rewind bit is always bit 7 (the uppermost bit in the lowermost
+byte). The bits defining the mode are next to the non-rewind bits. The
+remaining bits define the tape device number. This numbering is
+backward compatible with the numbering used when the minor number was
+only 8 bits wide.
 
 
 BSD AND SYS V SEMANTICS
diff -Nru a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
--- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl	Thu Jan  8 23:00:23 2004
+++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl	Thu Jan  8 23:00:23 2004
@@ -3623,7 +3623,7 @@
 
         <para>
           More precise information can be found in
-        <filename>alsa-kernel/Documentation/ControlNames.txt</filename>.
+        <filename>alsa-kernel/Documentation/sound/alsa/ControlNames.txt</filename>.
         </para>
       </section>
     </section>
diff -Nru a/Documentation/sound/oss/CMI8330 b/Documentation/sound/oss/CMI8330
--- a/Documentation/sound/oss/CMI8330	Thu Jan  8 23:00:23 2004
+++ b/Documentation/sound/oss/CMI8330	Thu Jan  8 23:00:23 2004
@@ -2,7 +2,7 @@
 -------------------------------------
 Alessandro Zummo <azummo@ita.flashnet.it>
 
-( Be sure to read Documentation/sound/SoundPro too )
+( Be sure to read Documentation/sound/oss/SoundPro too )
 
 
 This adapter is now directly supported by the sb driver.
diff -Nru a/Documentation/sound/oss/INSTALL.awe b/Documentation/sound/oss/INSTALL.awe
--- a/Documentation/sound/oss/INSTALL.awe	Thu Jan  8 23:00:24 2004
+++ b/Documentation/sound/oss/INSTALL.awe	Thu Jan  8 23:00:24 2004
@@ -114,7 +114,7 @@
 		# insmod awe_wave
 		(Be sure to load awe_wave after sb!)
 
-		See /usr/src/linux/Documentation/sound/AWE32 for
+		See /usr/src/linux/Documentation/sound/oss/AWE32 for
 		more details.
 
   9. (only for obsolete systems) If you don't have /dev/sequencer
diff -Nru a/Documentation/sound/oss/Introduction b/Documentation/sound/oss/Introduction
--- a/Documentation/sound/oss/Introduction	Thu Jan  8 23:00:24 2004
+++ b/Documentation/sound/oss/Introduction	Thu Jan  8 23:00:24 2004
@@ -24,7 +24,7 @@
 ========
 0.1.0  11/20/1998  First version, draft
 1.0.0  11/1998     Alan Cox changes, incorporation in 2.2.0
-                   as /usr/src/linux/Documentation/sound/Introduction
+                   as /usr/src/linux/Documentation/sound/oss/Introduction
 1.1.0  6/30/1999   Second version, added notes on making the drivers,
                    added info on multiple sound cards of similar types,]
                    added more diagnostics info, added info about esd.
diff -Nru a/Documentation/sound/oss/PAS16 b/Documentation/sound/oss/PAS16
--- a/Documentation/sound/oss/PAS16	Thu Jan  8 23:00:24 2004
+++ b/Documentation/sound/oss/PAS16	Thu Jan  8 23:00:24 2004
@@ -9,7 +9,7 @@
 This documentation is relevant for the PAS16 driver (pas2_card.c and
 friends) under kernel version 2.3.99 and later.  If you are
 unfamiliar with configuring sound under Linux, please read the
-Sound-HOWTO, linux/Documentation/sound/Introduction and other 
+Sound-HOWTO, linux/Documentation/sound/oss/Introduction and other
 relevant docs first.
 
 The following information is relevant information from README.OSS
@@ -73,8 +73,8 @@
   You want to read the Sound-HOWTO, available from
   http://www.tldp.org/docs.html#howto . General information
   about the modular sound system is contained in the files
-  Documentation/sound/Introduction. The file
-  Documentation/sound/README.OSS contains some slightly outdated but
+  Documentation/sound/oss/Introduction. The file
+  Documentation/sound/oss/README.OSS contains some slightly outdated but
   still useful information as well.
 
 OSS sound modules
@@ -119,7 +119,7 @@
   cards may have software (TSR) FM emulation. Enabling FM support with
   these cards may cause trouble (I don't currently know of any such
   cards, however).
-  Please read the file Documentation/sound/OPL3 if your card has an
+  Please read the file Documentation/sound/oss/OPL3 if your card has an
   OPL3 chip.
   If you compile the driver into the kernel, you have to add
   "opl3=<io>" to the kernel command line.
diff -Nru a/Documentation/sound/oss/SoundPro b/Documentation/sound/oss/SoundPro
--- a/Documentation/sound/oss/SoundPro	Thu Jan  8 23:00:24 2004
+++ b/Documentation/sound/oss/SoundPro	Thu Jan  8 23:00:24 2004
@@ -1,7 +1,7 @@
 Documentation for the SoundPro CMI8330 extensions in the WSS driver (ad1848.o)
 ------------------------------------------------------------------------------
 
-( Be sure to read Documentation/sound/CMI8330 too )
+( Be sure to read Documentation/sound/oss/CMI8330 too )
 
 Ion Badulescu, ionut@cs.columbia.edu
 February 24, 1999
diff -Nru a/Documentation/sound/oss/Wavefront b/Documentation/sound/oss/Wavefront
--- a/Documentation/sound/oss/Wavefront	Thu Jan  8 23:00:23 2004
+++ b/Documentation/sound/oss/Wavefront	Thu Jan  8 23:00:23 2004
@@ -105,7 +105,7 @@
    drivers/sound/wf_midi.c              -- the "uart401" driver 
    				              to support virtual MIDI mode.
    include/wavefront.h                  -- the header file
-   Documentation/sound/Tropez+          -- short docs on configuration
+   Documentation/sound/oss/Tropez+          -- short docs on configuration
 
 **********************************************************************
 4) How do I compile/install/use it ?
diff -Nru a/Documentation/usb/w9968cf.txt b/Documentation/usb/w9968cf.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/usb/w9968cf.txt	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,463 @@
+
+         W996[87]CF JPEG USB Dual Mode Camera Chip driver for Linux 2.6
+         ==============================================================
+
+                               - Documentation -
+
+
+Index
+=====
+1. Copyright
+2. License
+3. Overview
+4. Supported devices
+5. Kernel configuration and third-part module compilation
+6. Module loading
+7. Module paramaters
+8. Credits
+
+
+1. Copyright
+============
+Copyright (C) 2002 2003 by Luca Risolia <luca_ing@libero.it>
+
+
+2. License
+==========
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+3. Overview
+===========
+This driver supports the video streaming capabilities of the devices mounting
+Winbond W9967CF and Winbond W9968CF JPEG USB Dual Mode Camera Chips, when they
+are being commanded by USB.
+
+The driver relies on the Video4Linux, USB and I2C core modules of the Linux
+kernel, version 2.6.0 or greater, and is not compatible in any way with
+previous versions. It has been designed to run properly on SMP systems
+as well. At the moment, an additional module, "ovcamchip", is mandatory; it
+provides support for some OmniVision CMOS sensors connected to the W996[87]CF
+chips.
+
+The driver is split into two modules: the basic one, "w9968cf", is needed for
+the supported devices to work; the second one, "w9968cf-vpp", is an optional
+module, which provides some useful video post-processing functions like video
+decoding, up-scaling and colour conversions. These routines can't be included
+into official kernels for performance purposes. Once the driver is installed,
+every time an application tries to open a recognized device, "w9968cf" checks
+the presence of the "w9968cf-vpp" module and loads it automatically by default.
+
+Up to 32 cameras can be handled at the same time. They can be connected and
+disconnected from the host many times without turning off the computer, if
+your system supports the hotplug facility.
+
+To change the default settings for each camera, many paramaters can be passed
+through command line when the module is loaded into memory.
+
+The latest and full featured version of the W996[87]CF driver can be found at:
+http://go.lamarinapunto.com/
+
+The "ovcamchip" module is part of the OV511 driver, version 2.25, which can be
+downloaded from internet:
+http://alpha.dyndns.org/ov511/
+To know how to patch, compile and load it, read the paragraphs below.
+
+
+4. Supported devices
+====================
+At the moment, known W996[87]CF based devices are:
+- Aroma Digi Pen ADG-5000 Refurbished
+- AVerTV USB
+- Creative Labs Video Blaster WebCam Go
+- Creative Labs Video Blaster WebCam Go Plus
+- Die Lebon LDC-D35A Digital Kamera
+- Ezonics EZ-802 EZMega Cam
+- OPCOM Digi Pen VGA Dual Mode Pen Camera
+
+If you know any other W996[87]CF based cameras, please contact me.
+
+The list above does NOT imply that all those devices work with this driver: up
+until now only webcams that have a CMOS sensor supported by the "ovcamchip"
+module work. 
+For a list of supported CMOS sensors, please visit the module author homepage:
+http://alpha.dyndns.org/ov511/
+
+Possible external microcontrollers of those webcams are not supported: this
+means that still images can't be downloaded from the device memory.
+
+Furthermore, it's worth to note that I was only able to run tests on my
+"Creative Labs Video Blaster WebCam Go". Donations of other models, for
+additional testing and full support, would be much appreciated.
+
+
+5. Kernel configuration and third-part module compilation
+=========================================================
+As noted above, kernel 2.6.0 is the minimum for this driver; for it to work
+properly, the driver needs kernel support for Video4Linux, USB and I2C, and a
+third-part module for the CMOS sensor.
+
+The following options of the kernel configuration file must be enabled and
+corresponding modules must be compiled:
+
+	# Multimedia devices
+	#
+	CONFIG_VIDEO_DEV=m
+
+	# I2C support
+	#
+	CONFIG_I2C=m
+
+The I2C core module can be compiled statically in the kernel as well.
+
+	# USB support
+	#
+	CONFIG_USB=m
+
+In addition, depending on the hardware being used, just one of the modules
+below is necessary:
+
+	# USB Host Controller Drivers
+	#
+	CONFIG_USB_EHCI_HCD=m
+	CONFIG_USB_UHCI_HCD=m
+	CONFIG_USB_OHCI_HCD=m
+
+Also, make sure "Enforce bandwidth allocation" is NOT enabled.
+
+	# USB Multimedia devices
+	#
+	CONFIG_USB_W9968CF=m
+
+The last module we need is "ovcamchip.o". To obtain it, you have to download
+the OV511 driver, version 2.25 - don't use other versions - which is available
+at http://alpha.dyndns.org/ov511/ . Then you have to download the latest 
+version of the full featured W996[87]CF driver, which contains a patch for the
+"ovcamchip" module; it is available at http://go.lamarinapunto.com .
+Once you have obtained the packages, decompress, patch and compile the 
+"ovcamchip" module. In other words:
+
+	[user@localhost home]$ tar xvzf w9968cf-x.x.tar.gz
+	[user@localhost home]$ tar xvjf ov511-2.25.tar.bz2
+	[user@localhost home]$ cd ov511-2.25
+	[user@localhost ov511-2.25]$ patch -p1 <                              \
+	                             /path/to/w9968cf-x.x/ov511-2.25.patch
+	[user@localhost ov511-2.25]$ make
+
+It's worth to note that the full featured version of the W996[87]CF driver
+can also be installed overwriting the one in the kernel; in this case, read the
+documentation included in the package.
+
+If everything went well, the W996[87]CF driver can be immediatly used (see next
+paragraph).
+
+
+6. Module loading
+=================
+To use the driver, it is necessary to load the "w9968cf" module into memory
+after every other module required.
+
+For example, loading can be done this way, as root:
+
+	[root@localhost home]# modprobe usbcore
+	[root@localhost home]# modprobe i2c-core
+	[root@localhost ov511-x.xx]# insmod ./ovcamchip.ko
+	[root@localhost home]# modprobe w9968cf
+
+At this point the devices should be recognized: "dmesg" can be used to analyze
+kernel messages:
+
+	[user@localhost home]$ dmesg
+
+There are a lot of parameters the module can use to change the default
+settings for each device. To list every possible parameter with a brief
+explanation about them and which syntax to use, it is recommended to run the
+"modinfo" command:
+
+	[root@locahost home]# modinfo w9968cf
+
+
+7. Module paramaters
+====================
+
+Module paramaters are listed below:
+-------------------------------------------------------------------------------
+Name:           vppmod_load
+Type:           int
+Syntax:         <0|1>
+Description:    Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled.
+                If enabled, every time an application attempts to open a
+                camera, 'insmod' searches for the video post-processing module
+                in the system and loads it automatically (if present).
+                The 'w9968cf-vpp' module adds extra image manipulation 
+                capabilities to the 'w9968cf' module,like software up-scaling,
+                colour conversions and video decoding.
+Default:        1
+-------------------------------------------------------------------------------
+Name:           simcams 
+Type:           int 
+Syntax:         <n> 
+Description:    Number of cameras allowed to stream simultaneously.
+                n may vary from 0 to 32.
+Default:        32
+-------------------------------------------------------------------------------
+Name:           video_nr
+Type:           int array (min = 0, max = 32)
+Syntax:         <-1|n[,...]> 
+Description:    Specify V4L minor mode number.
+                -1 = use next available
+                 n = use minor number n
+                You can specify 32 cameras this way.
+                For example:
+                video_nr=-1,2,-1 would assign minor number 2 to the second
+                recognized camera and use auto for the first one and for every
+                other camera.
+Default:        -1
+-------------------------------------------------------------------------------
+Name:           packet_size
+Type:           int array (min = 0, max = 32)
+Syntax:         <n[,...]> 
+Description:    Specify the maximum data payload size in bytes for alternate
+                settings, for each device. n is scaled between 63 and 1023.
+Default:        1023
+-------------------------------------------------------------------------------
+Name:           max_buffers
+Type:           int array (min = 0, max = 32)
+Syntax:         <n[,...]>
+Description:    Only for advanced users.
+                Specify the maximum number of video frame buffers to allocate
+                for each device, from 2 to 32.
+Default:        2
+-------------------------------------------------------------------------------
+Name:           double_buffer
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    Hardware double buffering: 0 disabled, 1 enabled.
+                It should be enabled if you want smooth video output: if you
+                obtain out of sync. video, disable it at all, or try to
+                decrease the 'clockdiv' module paramater value.
+Default:        1 for every device.
+-------------------------------------------------------------------------------
+Name:           clamping
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    Video data clamping: 0 disabled, 1 enabled.
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           filter_type
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1|2[,...]> 
+Description:    Video filter type.
+                0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter.
+                The filter is used to reduce noise and aliasing artifacts
+                produced by the CCD or CMOS sensor.
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           largeview
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    Large view: 0 disabled, 1 enabled.
+Default:        1 for every device.
+-------------------------------------------------------------------------------
+Name:           upscaling
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    Software scaling (for non-compressed video only):
+                0 disabled, 1 enabled.
+                Disable it if you have a slow CPU or you don't have enough
+                memory.
+Default:        0 for every device.
+Note:           If 'w9968cf-vpp' is not loaded, this paramater is set to 0.
+-------------------------------------------------------------------------------
+Name:           decompression
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1|2[,...]>
+Description:    Software video decompression:
+                0 = disables decompression
+                    (doesn't allow formats needing decompression).
+                1 = forces decompression
+                    (allows formats needing decompression only).
+                2 = allows any permitted formats.
+                Formats supporting (de)compressed video are YUV422P and
+                YUV420P/YUV420 in any resolutions where width and height are
+                multiples of 16.
+Default:        2 for every device.
+Note:           If 'w9968cf-vpp' is not loaded, forcing decompression is not
+                allowed; in this case this paramater is set to 2.
+-------------------------------------------------------------------------------
+Name:           force_palette
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|9|10|13|15|8|7|1|6|3|4|5[,...]>
+Description:    Force picture palette.
+                In order:
+                 0 = Off - allows any of the following formats:
+                 9 = UYVY    16 bpp - Original video, compression disabled
+                10 = YUV420  12 bpp - Original video, compression enabled
+                13 = YUV422P 16 bpp - Original video, compression enabled
+                15 = YUV420P 12 bpp - Original video, compression enabled
+                 8 = YUVY    16 bpp - Software conversion from UYVY
+                 7 = YUV422  16 bpp - Software conversion from UYVY
+                 1 = GREY     8 bpp - Software conversion from UYVY
+                 6 = RGB555  16 bpp - Software conversion from UYVY
+                 3 = RGB565  16 bpp - Software conversion from UYVY
+                 4 = RGB24   24 bpp - Software conversion from UYVY
+                 5 = RGB32   32 bpp - Software conversion from UYVY
+                When not 0, this paramater will override 'decompression'.
+Default:        0 for every device. Initial palette is 9 (UYVY).
+Note:           If 'w9968cf-vpp' is not loaded, this paramater is set to 9.
+-------------------------------------------------------------------------------
+Name:           force_rgb
+Type:           int array (min = 0, max = 32)
+Syntax:         <0|1[,...]>
+Description:    Read RGB video data instead of BGR:
+                1 = use RGB component ordering.
+                0 = use BGR component ordering.
+                This parameter has effect when using RGBX palettes only.
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           autobright
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]>
+Description:    CMOS sensor automatically changes brightness:
+                0 = no, 1 = yes
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           autoexp
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]>
+Description:    CMOS sensor automatically changes exposure:
+                0 = no, 1 = yes
+Default:        1 for every device.
+-------------------------------------------------------------------------------
+Name:           lightfreq
+Type:           long array (min = 0, max = 32)
+Syntax:         <50|60[,...]>
+Description:    Light frequency in Hz:
+                50 for European and Asian lighting, 60 for American lighting.
+Default:        50 for every device.
+-------------------------------------------------------------------------------
+Name:           bandingfilter
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    Banding filter to reduce effects of fluorescent 
+                lighting:
+                0 disabled, 1 enabled.
+                This filter tries to reduce the pattern of horizontal
+                light/dark bands caused by some (usually fluorescent) lighting.
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           clockdiv
+Type:           long array (min = 0, max = 32)
+Syntax:         <-1|n[,...]>
+Description:    Force pixel clock divisor to a specific value (for experts):
+                n may vary from 0 to 127.
+                -1 for automatic value.
+                See also the 'double_buffer' module paramater.
+Default:        -1 for every device.
+-------------------------------------------------------------------------------
+Name:           backlight
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]>
+Description:    Objects are lit from behind:
+                0 = no, 1 = yes
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           mirror
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]>
+Description:    Reverse image horizontally:
+                0 = no, 1 = yes
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           sensor_mono
+Type:           long array (min = 0, max = 32)
+Syntax:         <0|1[,...]> 
+Description:    The CMOS sensor is monochrome:
+                0 = no, 1 = yes
+Default:        0 for every device.
+-------------------------------------------------------------------------------
+Name:           brightness
+Type:           long array (min = 0, max = 32)
+Syntax:         <n[,...]>
+Description:    Set picture brightness (0-65535).
+                This parameter has no effect if 'autobright' is enabled.
+Default:        31000 for every device.
+-------------------------------------------------------------------------------
+Name:           hue
+Type:           long array (min = 0, max = 32)
+Syntax:         <n[,...]>
+Description:    Set picture hue (0-65535).
+Default:        32768 for every device.
+-------------------------------------------------------------------------------
+Name:           colour
+Type:           long array (min = 0, max = 32)
+Syntax:         <n[,...]>
+Description:    Set picture saturation (0-65535).
+Default:        32768 for every device.
+-------------------------------------------------------------------------------
+Name:           contrast
+Type:           long array (min = 0, max = 32)
+Syntax:         <n[,...]> 
+Description:    Set picture contrast (0-65535).
+Default:        50000 for every device.
+-------------------------------------------------------------------------------
+Name:           whiteness
+Type:           long array (min = 0, max = 32)
+Syntax:         <n[,...]> 
+Description:    Set picture whiteness (0-65535).
+Default:        32768 for every device.
+-------------------------------------------------------------------------------
+Name:           debug
+Type:           int
+Syntax:         <n> 
+Description:    Debugging information level, from 0 to 6:
+                0 = none (be cautious)
+                1 = critical errors
+                2 = significant informations
+                3 = configuration or general messages
+                4 = warnings
+                5 = called functions
+                6 = function internals
+                Level 5 and 6 are useful for testing only, when just one
+                device is used.
+Default:        2
+-------------------------------------------------------------------------------
+Name:           specific_debug
+Type:           int
+Syntax:         <0|1>
+Description:    Enable or disable specific debugging messages:
+                0 = print messages concerning every level <= 'debug' level.
+                1 = print messages concerning the level indicated by 'debug'.
+Default:        0
+-------------------------------------------------------------------------------
+
+
+8. Credits
+==========
+The development would not have proceed much further without having looked at
+the source code of other drivers and without the help of several persons; in
+particular:
+
+- the I2C interface to kernel and high-level CMOS sensor control routines have
+  been taken from the OV511 driver by Mark McClelland;
+
+- memory management code has been copied from the bttv driver by Ralph Metzler,
+  Marcus Metzler and Gerd Knorr;
+
+- the low-level I2C read function has been written by FrÃ©dÃ©ric Jouault, who
+  also gave me commented logs about sniffed USB traffic taken from another
+  driver for another system;
+
+- the low-level I2C fast write function has been written by Piotr Czerczak;
diff -Nru a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt
--- a/Documentation/watchdog/watchdog-api.txt	Thu Jan  8 23:00:23 2004
+++ b/Documentation/watchdog/watchdog-api.txt	Thu Jan  8 23:00:23 2004
@@ -358,6 +358,15 @@
 
 	No bits set in GETSUPPORT
 
+w83627hf_wdt.c -- w83627hf watchdog
+
+	Timeout that defaults to 60 seconds, supports SETTIMEOUT.
+
+	Supports CONFIG_WATCHDOG_NOWAYOUT
+
+	GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
+	The GETSTATUS call returns if the device is open or not.
+
 wdt.c -- ICS WDT500/501 ISA and
 wdt_pci.c -- ICS WDT500/501 PCI
 
diff -Nru a/MAINTAINERS b/MAINTAINERS
--- a/MAINTAINERS	Thu Jan  8 23:00:24 2004
+++ b/MAINTAINERS	Thu Jan  8 23:00:24 2004
@@ -73,7 +73,7 @@
 3C359 NETWORK DRIVER
 P:	Mike Phillips
 M:	mikep@linuxtr.net
-L:	linux-net@vger.rutgers.edu
+L:	linux-net@vger.kernel.org
 L:	linux-tr@linuxtr.net
 W:	http://www.linuxtr.net
 S:	Maintained
@@ -929,8 +929,9 @@
 S:	Maintained
 
 SN-IA64 (Itanium) SUB-PLATFORM
-P:	John Hesterberg
-M:	jh@sgi.com
+P:	Jesse Barnes
+M:	jbarnes@sgi.com
+L:	linux-altix@sgi.com
 L:	linux-ia64@linuxia64.org
 W:	http://www.sgi.com/altix
 S:	Maintained
@@ -979,25 +980,28 @@
 P:	Ben Collins
 M:	bcollins@debian.org
 L:	linux1394-devel@lists.sourceforge.net
-W:	http://linux1394.sourceforge.net/
+W:	http://www.linux1394.org/
 S:	Maintained
 
 IEEE 1394 OHCI DRIVER
 P:	Ben Collins
 M:	bcollins@debian.org
 L:	linux1394-devel@lists.sourceforge.net
+W:	http://www.linux1394.org/
 S:	Maintained
 
 IEEE 1394 PCILYNX DRIVER
 P:	Andreas Bombe
 M:	andreas.bombe@munich.netsurf.de
 L:	linux1394-devel@lists.sourceforge.net
+W:	http://www.linux1394.org/
 S:	Maintained
 
 IEEE 1394 RAW I/O DRIVER
-P:	Andreas Bombe
-M:	andreas.bombe@munich.netsurf.de
+P:	Ben Collins
+M:	bcollins@debian.org
 L:	linux1394-devel@lists.sourceforge.net
+W:	http://www.linux1394.org/
 S:	Maintained
 
 IMS TWINTURBO FRAMEBUFFER DRIVER
@@ -1234,8 +1238,8 @@
 S:	Maintained
 
 LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
-P:	Gerard Roudier
-M:	groudier@free.fr
+P:	Matthew Wilcox
+M:	matthew@wil.cx
 L:	linux-scsi@vger.kernel.org
 S:	Maintained
 
@@ -1468,7 +1472,7 @@
 P:	Willem Riede
 M:	osst@riede.org
 L:	osst@linux1.onstream.nl
-L:	linux-scsi@vger.rutgers.edu
+L:	linux-scsi@vger.kernel.org
 S:	Maintained
 
 OPL3-SA2, SA3, and SAx DRIVER
@@ -1556,11 +1560,8 @@
 S:	Maintained
 
 PCMCIA SUBSYSTEM
-P:	David Hinds
-M:	dahinds@users.sourceforge.net
-L:	linux-kernel@vger.kernel.org
-W:	http://pcmcia-cs.sourceforge.net
-S:	Maintained
+L:	http://lists.infradead.org/mailman/listinfo/linux-pcmcia
+S:	Unmaintained
 
 PCNET32 NETWORK DRIVER
 P:	Thomas Bogendörfer
@@ -1852,8 +1853,10 @@
 S:	Maintained
 
 SPARC (sparc32):
+P:	Keith M. Wesolowski
+M:	wesolows@foobazco.org
 L:	sparclinux@vger.kernel.org
-S:	Unmaintained - please send patches to mailing list
+S:	Maintained
 
 SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
 P:	Roger Wolff
@@ -2216,6 +2219,13 @@
 P:	David Brownell
 M:	dbrownell@users.sourceforge.net
 L:	linux-usb-devel@lists.sourceforge.net
+S:	Maintained
+
+USB W996[87]CF DRIVER
+P:	Luca Risolia
+M:	luca_ing@libero.it
+L:	linux-usb-devel@lists.sourceforge.net
+W:	http://go.lamarinapunto.com
 S:	Maintained
 
 USER-MODE LINUX
diff -Nru a/Makefile b/Makefile
--- a/Makefile	Thu Jan  8 23:00:24 2004
+++ b/Makefile	Thu Jan  8 23:00:24 2004
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 6
-SUBLEVEL = 0
+SUBLEVEL = 1
 EXTRAVERSION =
 
 # *DOCUMENTATION*
@@ -275,7 +275,7 @@
 CPPFLAGS        := -D__KERNEL__ -Iinclude \
 		   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
 
-CFLAGS 		:= -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS 		:= -Wall -Wstrict-prototypes -Wno-trigraphs \
 	  	   -fno-strict-aliasing -fno-common
 AFLAGS		:= -D__ASSEMBLY__
 
@@ -431,6 +431,12 @@
 # ---------------------------------------------------------------------------
 
 
+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+CFLAGS		+= -Os
+else
+CFLAGS		+= -O2
+endif
+
 ifndef CONFIG_FRAME_POINTER
 CFLAGS		+= -fomit-frame-pointer
 endif
@@ -872,7 +878,7 @@
 	$(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version;\
 	mv -f $(objtree)/.tmp_version $(objtree)/.version;
 
-	$(RPM) -ta ../$(KERNELPATH).tar.gz
+	$(RPM) --target $(UTS_MACHINE) -ta ../$(KERNELPATH).tar.gz
 	rm ../$(KERNELPATH).tar.gz
 
 # Brief documentation of the typical targets used
diff -Nru a/README b/README
--- a/README	Thu Jan  8 23:00:24 2004
+++ b/README	Thu Jan  8 23:00:24 2004
@@ -119,7 +119,7 @@
    cd /usr/src/linux-2.6.N
    make O=/home/name/build/kernel menuconfig
    make O=/home/name/build/kernel
-   sudo make O=/home/name/build/kernel install_modules install
+   sudo make O=/home/name/build/kernel modules_install install
 
    Please note: If the 'O=output/dir' option is used then it must be
    used for all invocations of make.
diff -Nru a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
--- a/arch/alpha/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/alpha/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -252,9 +252,11 @@
 irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", irq_affinity[(long)data]);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static unsigned int
@@ -331,10 +333,11 @@
 prof_cpu_mask_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int
@@ -529,19 +532,21 @@
 #ifdef CONFIG_SMP
 	int j;
 #endif
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
 #ifdef CONFIG_SMP
-	seq_puts(p, "           ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 #endif
 
-	for (i = 0; i < ACTUAL_NR_IRQS; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -568,15 +573,16 @@
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == ACTUAL_NR_IRQS) {
 #ifdef CONFIG_SMP
-	seq_puts(p, "IPI: ");
-	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_online(i))
-			seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-	seq_putc(p, '\n');
+		seq_puts(p, "IPI: ");
+		for (i = 0; i < NR_CPUS; i++)
+			if (cpu_online(i))
+				seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
diff -Nru a/arch/arm/Makefile b/arch/arm/Makefile
--- a/arch/arm/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/Makefile	Thu Jan  8 23:00:23 2004
@@ -14,8 +14,6 @@
 GZFLAGS		:=-9
 #CFLAGS		+=-pipe
 
-CFLAGS		:=$(CFLAGS:-O2=-Os)
-
 ifeq ($(CONFIG_FRAME_POINTER),y)
 CFLAGS		+=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
 endif
diff -Nru a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
--- a/arch/arm/boot/compressed/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/boot/compressed/Makefile	Thu Jan  8 23:00:23 2004
@@ -23,10 +23,6 @@
 OBJS		+= head-shark.o ofw-shark.o
 endif
 
-ifeq ($(CONFIG_ARCH_INTEGRATOR),y)
-OBJS		+= head-integrator.o
-endif
-
 ifeq ($(CONFIG_ARCH_CAMELOT),y)
 OBJS		+= head-epxa10db.o
 endif
diff -Nru a/arch/arm/boot/compressed/head-integrator.S b/arch/arm/boot/compressed/head-integrator.S
--- a/arch/arm/boot/compressed/head-integrator.S	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,4 +0,0 @@
-#include <asm/mach-types.h>
-
-		.section	".start", "ax"
-		mov	r7, #MACH_TYPE_INTEGRATOR
diff -Nru a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
--- a/arch/arm/boot/compressed/head.S	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/boot/compressed/head.S	Thu Jan  8 23:00:24 2004
@@ -503,12 +503,6 @@
 
 		@ Everything from here on will be the new ID system.
 
-		.word	0x41129200		@ ARM920T
-		.word	0xff00fff0
-		b	__armv4_cache_on
-		b	__armv4_cache_off
-		b	__armv4_cache_flush
-
 		.word	0x4401a100		@ sa110 / sa1100
 		.word	0xffffffe0
 		b	__armv4_cache_on
@@ -522,6 +516,12 @@
 		b	__armv4_cache_flush
 
 		@ These match on the architecture ID
+
+		.word	0x00020000		@ ARMv4T
+		.word	0x000f0000
+		b	__armv4_cache_on
+		b	__armv4_cache_off
+		b	__armv4_cache_flush
 
 		.word	0x00050000		@ ARMv5TE
 		.word	0x000f0000
diff -Nru a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c
--- a/arch/arm/common/sa1111.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/common/sa1111.c	Thu Jan  8 23:00:24 2004
@@ -34,6 +34,8 @@
 
 #include <asm/hardware/sa1111.h>
 
+extern void __init sa1110_mb_enable(void);
+
 /*
  * We keep the following data for the overall SA1111.  Note that the
  * struct device and struct resource are "fake"; they should be supplied
@@ -561,6 +563,8 @@
 	dev->res.name    = dev->dev.bus_id;
 	dev->res.flags   = IORESOURCE_MEM;
 	dev->mapbase     = sachip->base + info->offset;
+	dev->skpcr_mask  = info->skpcr_mask;
+	memmove(dev->irq, info->irq, sizeof(dev->irq));
 
 	ret = request_resource(parent, &dev->res);
 	if (ret) {
diff -Nru a/arch/arm/configs/netwinder_defconfig b/arch/arm/configs/netwinder_defconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/configs/netwinder_defconfig	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,968 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# System Type
+#
+# CONFIG_ARCH_ADIFCC is not set
+# CONFIG_ARCH_ANAKIN is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+CONFIG_ARCH_FOOTBRIDGE=y
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SHARK is not set
+
+#
+# CLPS711X/EP721X Implementations
+#
+
+#
+# Epxa10db
+#
+
+#
+# Footbridge Implementations
+#
+# CONFIG_ARCH_CATS is not set
+# CONFIG_ARCH_PERSONAL_SERVER is not set
+# CONFIG_ARCH_EBSA285_ADDIN is not set
+# CONFIG_ARCH_EBSA285_HOST is not set
+CONFIG_ARCH_NETWINDER=y
+
+#
+# IOP3xx Implementation Options
+#
+# CONFIG_ARCH_IOP310 is not set
+# CONFIG_ARCH_IOP321 is not set
+
+#
+# IOP3xx Chipset Features
+#
+
+#
+# Intel PXA250/210 Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+CONFIG_FOOTBRIDGE=y
+CONFIG_FOOTBRIDGE_HOST=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_SA110=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4=y
+CONFIG_CPU_CACHE_V4WB=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WB=y
+
+#
+# Processor Features
+#
+
+#
+# General setup
+#
+CONFIG_PCI=y
+CONFIG_ISA=y
+CONFIG_ISA_DMA=y
+# CONFIG_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+# CONFIG_HOTPLUG is not set
+
+#
+# At least one math emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=0x301"
+CONFIG_LEDS=y
+# CONFIG_LEDS_TIMER is not set
+CONFIG_LEDS_CPU=y
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+CONFIG_PARPORT_PC_CML1=y
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+CONFIG_PARPORT_PC_SUPERIO=y
+# CONFIG_PARPORT_ARC is not set
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=y
+CONFIG_IP_NF_FTP=y
+# CONFIG_IP_NF_IRC is not set
+# CONFIG_IP_NF_TFTP is not set
+# CONFIG_IP_NF_AMANDA is not set
+CONFIG_IP_NF_QUEUE=y
+CONFIG_IP_NF_IPTABLES=y
+# CONFIG_IP_NF_MATCH_LIMIT is not set
+# CONFIG_IP_NF_MATCH_IPRANGE is not set
+# CONFIG_IP_NF_MATCH_MAC is not set
+# CONFIG_IP_NF_MATCH_PKTTYPE is not set
+# CONFIG_IP_NF_MATCH_MARK is not set
+# CONFIG_IP_NF_MATCH_MULTIPORT is not set
+# CONFIG_IP_NF_MATCH_TOS is not set
+# CONFIG_IP_NF_MATCH_RECENT is not set
+# CONFIG_IP_NF_MATCH_ECN is not set
+# CONFIG_IP_NF_MATCH_DSCP is not set
+# CONFIG_IP_NF_MATCH_AH_ESP is not set
+# CONFIG_IP_NF_MATCH_LENGTH is not set
+# CONFIG_IP_NF_MATCH_TTL is not set
+# CONFIG_IP_NF_MATCH_TCPMSS is not set
+# CONFIG_IP_NF_MATCH_HELPER is not set
+# CONFIG_IP_NF_MATCH_STATE is not set
+# CONFIG_IP_NF_MATCH_CONNTRACK is not set
+# CONFIG_IP_NF_MATCH_OWNER is not set
+# CONFIG_IP_NF_FILTER is not set
+# CONFIG_IP_NF_NAT is not set
+# CONFIG_IP_NF_MANGLE is not set
+# CONFIG_IP_NF_TARGET_LOG is not set
+# CONFIG_IP_NF_TARGET_ULOG is not set
+# CONFIG_IP_NF_TARGET_TCPMSS is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+CONFIG_IPV6_SCTP__=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_SMC91X is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+CONFIG_TULIP_MMIO=y
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_AC3200 is not set
+# CONFIG_APRICOT is not set
+# CONFIG_B44 is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_DGRS is not set
+# CONFIG_EEPRO100 is not set
+# CONFIG_E100 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+CONFIG_NE2K_PCI=y
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+# CONFIG_HOSTAP is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+# CONFIG_IDEDISK_STROKE is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_IDEPCI_SHARE_IRQ is not set
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_SL82C105=y
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# CONFIG_IDEDMA_PCI_WIP is not set
+CONFIG_BLK_DEV_ADMA=y
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_TSLIBDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2_SYNAPTICS is not set
+CONFIG_MOUSE_SERIAL=y
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_PCSPKR is not set
+CONFIG_INPUT_UINPUT=y
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_DZ is not set
+# CONFIG_SERIAL_21285 is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+# CONFIG_I2C_SENSOR is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Mice
+#
+CONFIG_BUSMOUSE=y
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_WDT is not set
+# CONFIG_WDTPCI is not set
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADVANTECH_WDT is not set
+# CONFIG_21285_WATCHDOG is not set
+CONFIG_977_WATCHDOG=y
+# CONFIG_EUROTECH_WDT is not set
+# CONFIG_IB700_WDT is not set
+# CONFIG_I810_TCO is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_SCx200_WDT is not set
+# CONFIG_60XX_WDT is not set
+# CONFIG_W83877F_WDT is not set
+# CONFIG_MACHZ_WDT is not set
+# CONFIG_SC520_WDT is not set
+# CONFIG_AMD7XX_TCO is not set
+# CONFIG_ALIM7101_WDT is not set
+# CONFIG_ALIM1535_WDT is not set
+# CONFIG_SC1200_WDT is not set
+# CONFIG_WAFER_WDT is not set
+# CONFIG_CPU5_WDT is not set
+CONFIG_DS1620=y
+CONFIG_NWBUTTON=y
+CONFIG_NWBUTTON_REBOOT=y
+CONFIG_NWFLASH=y
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=y
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_FAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SMB_FS=y
+# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_NEC98_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+CONFIG_SMB_NLS=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+CONFIG_FB_CYBER2000=y
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_PCI_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=y
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=y
+CONFIG_SOUND_TRACEINIT=y
+CONFIG_SOUND_DMAP=y
+# CONFIG_SOUND_AD1816 is not set
+# CONFIG_SOUND_AD1889 is not set
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_MAUI is not set
+CONFIG_SOUND_YM3812=y
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+CONFIG_SOUND_WAVEARTIST=y
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+
+#
+# Console Switches
+#
+# CONFIG_SWITCHES is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_WAITQ is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
diff -Nru a/arch/arm/configs/shark_defconfig b/arch/arm/configs/shark_defconfig
--- a/arch/arm/configs/shark_defconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/configs/shark_defconfig	Thu Jan  8 23:00:24 2004
@@ -10,6 +10,10 @@
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+# CONFIG_STANDALONE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
 
 #
 # General setup
@@ -19,6 +23,14 @@
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
 
 #
 # Loadable module support
@@ -35,7 +47,6 @@
 #
 # CONFIG_ARCH_ADIFCC is not set
 # CONFIG_ARCH_ANAKIN is not set
-# CONFIG_ARCH_ARCA5K is not set
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CLPS711X is not set
 # CONFIG_ARCH_CO285 is not set
@@ -44,21 +55,13 @@
 # CONFIG_ARCH_CAMELOT is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
 # CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP310 is not set
+# CONFIG_ARCH_IOP3XX is not set
 # CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 # CONFIG_ARCH_SA1100 is not set
 CONFIG_ARCH_SHARK=y
 
 #
-# Archimedes/A5000 Implementations
-#
-
-#
-# Archimedes/A5000 Implementations (select only ONE)
-#
-
-#
 # CLPS711X/EP721X Implementations
 #
 
@@ -71,11 +74,13 @@
 #
 
 #
-# IOP310 Implementation Options
+# IOP3xx Implementation Options
 #
+# CONFIG_ARCH_IOP310 is not set
+# CONFIG_ARCH_IOP321 is not set
 
 #
-# IOP310 Chipset Features
+# IOP3xx Chipset Features
 #
 
 #
@@ -92,6 +97,10 @@
 CONFIG_CPU_32=y
 CONFIG_CPU_SA110=y
 CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4=y
+CONFIG_CPU_CACHE_V4WB=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WB=y
 
 #
 # Processor Features
@@ -116,11 +125,13 @@
 #
 # CONFIG_FPE_NWFPE is not set
 CONFIG_FPE_FASTFPE=y
-CONFIG_KCORE_ELF=y
-# CONFIG_KCORE_AOUT is not set
-# CONFIG_BINFMT_AOUT is not set
 CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
 # CONFIG_BINFMT_MISC is not set
+
+#
+# Generic Driver Options
+#
 # CONFIG_PM is not set
 # CONFIG_PREEMPT is not set
 # CONFIG_ARTHUR is not set
@@ -164,6 +175,7 @@
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
@@ -185,7 +197,6 @@
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 # CONFIG_NETLINK_DEV is not set
-# CONFIG_NETFILTER is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -199,8 +210,11 @@
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
 # CONFIG_IPV6 is not set
-# CONFIG_XFRM_USER is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
@@ -209,9 +223,9 @@
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_NET_DIVERT is not set
@@ -239,13 +253,13 @@
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-# CONFIG_ETHERTAP is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
+# CONFIG_SMC91X is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
@@ -294,8 +308,14 @@
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_TIGON3 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
 # CONFIG_PLIP is not set
@@ -306,10 +326,12 @@
 # Wireless LAN (non-hamradio)
 #
 # CONFIG_NET_RADIO is not set
+# CONFIG_HOSTAP is not set
 
 #
-# Token Ring devices (depends on LLC=y)
+# Token Ring devices
 #
+# CONFIG_TR is not set
 # CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
@@ -320,47 +342,54 @@
 # CONFIG_WAN is not set
 
 #
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
 # IrDA (infrared) support
 #
 # CONFIG_IRDA is not set
 
 #
-# Amateur Radio support
+# Bluetooth support
 #
-# CONFIG_HAMRADIO is not set
+# CONFIG_BT is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
-
-#
-# IDE, ATA and ATAPI Block devices
-#
 CONFIG_BLK_DEV_IDE=y
 
 #
 # Please see Documentation/ide.txt for help/info on IDE drives
 #
-# CONFIG_BLK_DEV_HD is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
 # CONFIG_IDEDISK_STROKE is not set
 CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=y
 # CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDE_TASKFILE_IO is not set
 
 #
 # IDE chipset support/bugfixes
 #
 # CONFIG_BLK_DEV_IDEPCI is not set
 # CONFIG_IDE_CHIPSETS is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_HD is not set
 
 #
-# SCSI support
+# SCSI device support
 #
 CONFIG_SCSI=m
+CONFIG_SCSI_PROC_FS=y
 
 #
 # SCSI support type (disk, tape, CD-ROM)
@@ -395,7 +424,6 @@
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ADVANSYS is not set
 # CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_AM53C974 is not set
 # CONFIG_SCSI_MEGARAID is not set
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_CPQFCTS is not set
@@ -407,15 +435,13 @@
 # CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_GENERIC_NCR5380 is not set
 # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_PPA is not set
 # CONFIG_SCSI_IMM is not set
 # CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NCR53C7xx is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_NCR53C8XX is not set
-# CONFIG_SCSI_SYM53C8XX is not set
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
@@ -425,6 +451,7 @@
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 # CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_T128 is not set
 # CONFIG_SCSI_U14_34F is not set
@@ -486,6 +513,7 @@
 # CONFIG_KEYBOARD_NEWTON is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2_SYNAPTICS is not set
 # CONFIG_MOUSE_SERIAL is not set
 # CONFIG_MOUSE_INPORT is not set
 # CONFIG_MOUSE_LOGIBM is not set
@@ -497,7 +525,9 @@
 #
 # Character devices
 #
-# CONFIG_VT is not set
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
@@ -505,6 +535,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
 # CONFIG_SERIAL_8250_EXTENDED is not set
 
 #
@@ -526,12 +557,17 @@
 # CONFIG_I2C is not set
 
 #
-# I2C Hardware Sensors Mainboard support
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
 #
 
 #
 # I2C Hardware Sensors Chip support
 #
+# CONFIG_I2C_SENSOR is not set
 
 #
 # L3 serial bus support
@@ -566,7 +602,6 @@
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # Multimedia devices
@@ -574,6 +609,16 @@
 # CONFIG_VIDEO_DEV is not set
 
 #
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
 # File systems
 #
 CONFIG_EXT2_FS=y
@@ -581,6 +626,7 @@
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 # CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
 CONFIG_JBD=y
 # CONFIG_JBD_DEBUG is not set
 CONFIG_FS_MBCACHE=y
@@ -618,6 +664,8 @@
 # CONFIG_DEVFS_DEBUG is not set
 # CONFIG_DEVPTS_FS is not set
 # CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
 
 #
@@ -642,6 +690,7 @@
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
@@ -740,9 +789,24 @@
 # CONFIG_FB_VIRTUAL is not set
 
 #
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_PCI_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
 # Logo configuration
 #
-# CONFIG_LOGO is not set
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
 
 #
 # Sound
@@ -769,7 +833,6 @@
 # CONFIG_SOUND_MAESTRO is not set
 # CONFIG_SOUND_MAESTRO3 is not set
 # CONFIG_SOUND_ICH is not set
-# CONFIG_SOUND_RME96XX is not set
 # CONFIG_SOUND_SONICVIBES is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
@@ -779,6 +842,7 @@
 # CONFIG_SOUND_TRACEINIT is not set
 # CONFIG_SOUND_DMAP is not set
 # CONFIG_SOUND_AD1816 is not set
+# CONFIG_SOUND_AD1889 is not set
 # CONFIG_SOUND_SGALAXY is not set
 CONFIG_SOUND_ADLIB=m
 # CONFIG_SOUND_ACI_MIXER is not set
@@ -803,6 +867,11 @@
 # CONFIG_SOUND_YMFPCI is not set
 # CONFIG_SOUND_UART6850 is not set
 # CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_KAHLUA is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
 
 #
 # Misc devices
@@ -822,11 +891,7 @@
 # USB support
 #
 # CONFIG_USB is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
+# CONFIG_USB_GADGET is not set
 
 #
 # Kernel hacking
diff -Nru a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
--- a/arch/arm/kernel/armksyms.c	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/kernel/armksyms.c	Thu Jan  8 23:00:23 2004
@@ -68,8 +68,8 @@
 extern void __udivmoddi4(void);
 extern void __udivsi3(void);
 extern void __umodsi3(void);
+extern void __do_div64(void);
 extern void abort(void);
-extern void do_div64(void);
 
 extern void ret_from_exception(void);
 extern void fpundefinstr(void);
@@ -223,7 +223,7 @@
 EXPORT_SYMBOL_NOVERS(__udivmoddi4);
 EXPORT_SYMBOL_NOVERS(__udivsi3);
 EXPORT_SYMBOL_NOVERS(__umodsi3);
-EXPORT_SYMBOL_NOVERS(do_div64);
+EXPORT_SYMBOL_NOVERS(__do_div64);
 
 	/* bitops */
 EXPORT_SYMBOL(_set_bit_le);
diff -Nru a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
--- a/arch/arm/kernel/calls.S	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/kernel/calls.S	Thu Jan  8 23:00:24 2004
@@ -271,6 +271,20 @@
 		.long	sys_ni_syscall	/* sys_set_thread_area */
 /* 255 */	.long	sys_ni_syscall	/* sys_get_thread_area */
  		.long	sys_ni_syscall	/* sys_set_tid_address */
+		.long	sys_timer_create
+		.long	sys_timer_settime
+		.long	sys_timer_gettime
+/* 260 */	.long	sys_timer_getoverrun
+		.long	sys_timer_delete
+		.long	sys_clock_settime
+		.long	sys_clock_gettime
+		.long	sys_clock_getres
+/* 265 */	.long	sys_clock_nanosleep
+		.long	sys_statfs64
+		.long	sys_fstatfs64
+		.long	sys_tgkill
+		.long	sys_utimes
+/* 270 */	.long	sys_fadvise64_64
 __syscall_end:
 
 		.rept	NR_syscalls - (__syscall_end - __syscall_start) / 4
diff -Nru a/arch/arm/kernel/dma-isa.c b/arch/arm/kernel/dma-isa.c
--- a/arch/arm/kernel/dma-isa.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/kernel/dma-isa.c	Thu Jan  8 23:00:24 2004
@@ -85,6 +85,7 @@
 			break;
 
 		default:
+			direction = PCI_DMA_NONE;
 			break;
 		}
 
diff -Nru a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c
--- a/arch/arm/kernel/fiq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/kernel/fiq.c	Thu Jan  8 23:00:24 2004
@@ -112,12 +112,12 @@
 {
 	register unsigned long tmp, tmp2;
 	__asm__ volatile (
-	"mrs	%0, cpsr
-	mov	%1, %3
-	msr	cpsr_c, %1	@ select FIQ mode
-	mov	r0, r0
-	ldmia	%2, {r8 - r14}
-	msr	cpsr_c, %0	@ return to SVC mode
+	"mrs	%0, cpsr\n\
+	mov	%1, %3\n\
+	msr	cpsr_c, %1	@ select FIQ mode\n\
+	mov	r0, r0\n\
+	ldmia	%2, {r8 - r14}\n\
+	msr	cpsr_c, %0	@ return to SVC mode\n\
 	mov	r0, r0"
 	: "=&r" (tmp), "=&r" (tmp2)
 	: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)
@@ -132,12 +132,12 @@
 {
 	register unsigned long tmp, tmp2;
 	__asm__ volatile (
-	"mrs	%0, cpsr
-	mov	%1, %3
-	msr	cpsr_c, %1	@ select FIQ mode
-	mov	r0, r0
-	stmia	%2, {r8 - r14}
-	msr	cpsr_c, %0	@ return to SVC mode
+	"mrs	%0, cpsr\n\
+	mov	%1, %3\n\
+	msr	cpsr_c, %1	@ select FIQ mode\n\
+	mov	r0, r0\n\
+	stmia	%2, {r8 - r14}\n\
+	msr	cpsr_c, %0	@ return to SVC mode\n\
 	mov	r0, r0"
 	: "=&r" (tmp), "=&r" (tmp2)
 	: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)
diff -Nru a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
--- a/arch/arm/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -169,11 +169,11 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_controller_lock, flags);
 	    	action = irq_desc[i].action;
 		if (!action)
@@ -187,12 +187,12 @@
 		seq_putc(p, '\n');
 unlock:
 		spin_unlock_irqrestore(&irq_controller_lock, flags);
-	}
-
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_ARCH_ACORN
-	show_fiq_list(p, v);
+		show_fiq_list(p, v);
 #endif
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
+	}
 	return 0;
 }
 
diff -Nru a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
--- a/arch/arm/kernel/module.c	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/kernel/module.c	Thu Jan  8 23:00:23 2004
@@ -123,9 +123,10 @@
 			if (offset & 3 ||
 			    offset <= (s32)0xfc000000 ||
 			    offset >= (s32)0x04000000) {
-				printk(KERN_ERR "%s: unable to fixup "
-				       "relocation: out of range\n",
-				       module->name);
+				printk(KERN_ERR
+				       "%s: relocation out of range, section "
+				       "%d reloc %d sym '%s'\n", module->name,
+				       relindex, i, strtab + sym->st_name);
 				return -ENOEXEC;
 			}
 
diff -Nru a/arch/arm/lib/div64.S b/arch/arm/lib/div64.S
--- a/arch/arm/lib/div64.S	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/lib/div64.S	Thu Jan  8 23:00:24 2004
@@ -1,59 +1,200 @@
+/*
+ *  linux/arch/arm/lib/div64.S
+ *
+ *  Optimized computation of 64-bit dividend / 32-bit divisor
+ *
+ *  Author:	Nicolas Pitre
+ *  Created:	Oct 5, 2003
+ *  Copyright:	Monta Vista Software, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
 #include <linux/linkage.h>
 
-#ifndef __ARMEB__
-ql	.req	r0			@ quotient low
-qh	.req	r1			@ quotient high
-onl	.req	r0			@ original dividend low
-onh	.req	r1			@ original dividend high
-nl	.req	r4			@ dividend low
-nh	.req	r5			@ dividend high
-res	.req	r4			@ result
+#ifdef __ARMEB__
+#define xh r0
+#define xl r1
+#define yh r2
+#define yl r3
+#else
+#define xl r0
+#define xh r1
+#define yl r2
+#define yh r3
+#endif
+
+/*
+ * __do_div64: perform a division with 64-bit dividend and 32-bit divisor.
+ *
+ * Note: Calling convention is totally non standard for optimal code.
+ *       This is meant to be used by do_div() from include/asm/div64.h only.
+ *
+ * Input parameters:
+ * 	xh-xl	= dividend (clobbered)
+ * 	r4	= divisor (preserved)
+ *
+ * Output values:
+ * 	yh-yl	= result
+ * 	xh	= remainder
+ *
+ * Clobbered regs: xl, ip
+ */
+
+ENTRY(__do_div64)
+
+	@ Test for easy paths first.
+	subs	ip, r4, #1
+	bls	9f			@ divisor is 0 or 1
+	tst	ip, r4
+	beq	8f			@ divisor is power of 2
+
+	@ See if we need to handle upper 32-bit result.
+	cmp	xh, r4
+	mov	yh, #0
+	blo	3f
+
+	@ Align divisor with upper part of dividend.
+	@ The aligned divisor is stored in yl preserving the original.
+	@ The bit position is stored in ip.
+
+#if __LINUX_ARM_ARCH__ >= 5
+
+	clz	yl, r4
+	clz	ip, xh
+	sub	yl, yl, ip
+	mov	ip, #1
+	mov	ip, ip, lsl yl
+	mov	yl, r4, lsl yl
+
+#else
+
+	mov	yl, r4
+	mov	ip, #1
+1:	cmp	yl, #0x80000000
+	cmpcc	yl, xh
+	movcc	yl, yl, lsl #1
+	movcc	ip, ip, lsl #1
+	bcc	1b
+
+#endif
+
+	@ The division loop for needed upper bit positions.
+ 	@ Break out early if dividend reaches 0.
+2:	cmp	xh, yl
+	orrcs	yh, yh, ip
+	subcss	xh, xh, yl
+	movnes	ip, ip, lsr #1
+	mov	yl, yl, lsr #1
+	bne	2b
+
+	@ See if we need to handle lower 32-bit result.
+3:	cmp	xh, #0
+	mov	yl, #0
+	cmpeq	xl, r4
+	movlo	xh, xl
+	movlo	pc, lr
+
+	@ The division loop for lower bit positions.
+	@ Here we shift remainer bits leftwards rather than moving the
+	@ divisor for comparisons, considering the carry-out bit as well.
+	mov	ip, #0x80000000
+4:	movs	xl, xl, lsl #1
+	adcs	xh, xh, xh
+	beq	6f
+	cmpcc	xh, r4
+5:	orrcs	yl, yl, ip
+	subcs	xh, xh, r4
+	movs	ip, ip, lsr #1
+	bne	4b
+	mov	pc, lr
+
+	@ The top part of remainder became zero.  If carry is set
+	@ (the 33th bit) this is a false positive so resume the loop.
+	@ Otherwise, if lower part is also null then we are done.
+6:	bcs	5b
+	cmp	xl, #0
+	moveq	pc, lr
+
+	@ We still have remainer bits in the low part.  Bring them up.
+
+#if __LINUX_ARM_ARCH__ >= 5
+
+	clz	xh, xl			@ we know xh is zero here so...
+	add	xh, xh, #1
+	mov	xl, xl, lsl xh
+	mov	ip, ip, lsr xh
+
 #else
-ql	.req	r1
-qh	.req	r0
-onl	.req	r1
-onh	.req	r0
-nl	.req	r5
-nh	.req	r4
-res	.req	r5
+
+7:	movs	xl, xl, lsl #1
+	mov	ip, ip, lsr #1
+	bcc	7b
+
 #endif
 
-dl	.req	r3			@ divisor low
-dh	.req	r2			@ divsor high
+	@ Current remainder is now 1.  It is worthless to compare with
+	@ divisor at this point since divisor can not be smaller than 3 here.
+	@ If possible, branch for another shift in the division loop.
+	@ If no bit position left then we are done.
+	movs	ip, ip, lsr #1
+	mov	xh, #1
+	bne	4b
+	mov	pc, lr
+
+8:	@ Division by a power of 2: determine what that divisor order is
+	@ then simply shift values around
+
+#if __LINUX_ARM_ARCH__ >= 5
 
+	clz	ip, r4
+	rsb	ip, ip, #31
+
+#else
+
+	mov	yl, r4
+	cmp	r4, #(1 << 16)
+	mov	ip, #0
+	movhs	yl, yl, lsr #16
+	movhs	ip, #16
+
+	cmp	yl, #(1 << 8)
+	movhs	yl, yl, lsr #8
+	addhs	ip, ip, #8
+
+	cmp	yl, #(1 << 4)
+	movhs	yl, yl, lsr #4
+	addhs	ip, ip, #4
+
+	cmp	yl, #(1 << 2)
+	addhi	ip, ip, #3
+	addls	ip, ip, yl, lsr #1
+
+#endif
 
-ENTRY(do_div64)
-	stmfd	sp!, {r4, r5, lr}
-	mov	nl, onl
-	movs	nh, onh			@ if high bits are zero
-	movne	lr, #33
-	moveq	lr, #1			@ only divide low bits
-	moveq	nh, onl
-
-	tst	dh, #0x80000000
-	bne	2f
-1:	cmp	nh, dh
-	bls	2f
-	add	lr, lr, #1
-	movs	dh, dh, lsl #1		@ left justify disor
-	bpl	1b
-
-2:	movs	nh, onh
-	moveq	dl, dh
-	moveq	dh, #0
-	movne	dl, #0
-	mov	ql, #0
-	mov	qh, #0
-3:	subs	ip, nl, dl		@ trial subtraction
-	sbcs	ip, nh, dh
-	movcs	nh, ip			@ only update if successful
-	subcs	nl, nl, dl		@ (repeat the subtraction)
-	adcs	ql, ql, ql		@ C=1 if successful, shift into
-	adc	qh, qh, qh		@ quotient
-	movs	dh, dh, lsr #1		@ shift base high part right
-	mov	dl, dl, rrx		@ shift base low part right
-	subs	lr, lr, #1
-	bne	3b
+	mov	yh, xh, lsr ip
+	mov	yl, xl, lsr ip
+	rsb	ip, ip, #32
+	orr	yl, yl, xh, lsl ip
+	mov	xh, xl, lsl ip
+	mov	xh, xh, lsr ip
+	mov	pc, lr
+
+	@ eq -> division by 1: obvious enough...
+9:	moveq	yl, xl
+	moveq	yh, xh
+	moveq	xh, #0
+	moveq	pc, lr
+
+	@ Division by 0:
+	str	lr, [sp, #-4]!
+	bl	__div0
+
+	@ as wrong as it could be...
+	mov	yl, #0
+	mov	yh, #0
+	mov	xh, #0
+	ldr	pc, [sp], #4
 
-	mov	r2, res
-	ldmfd	sp!, {r4, r5, pc}
diff -Nru a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c
--- a/arch/arm/mach-clps711x/time.c	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/mach-clps711x/time.c	Thu Jan  8 23:00:23 2004
@@ -40,6 +40,7 @@
 
 void __init clps711x_setup_timer(void)
 {
+	struct timespec tv;
 	unsigned int syscon;
 
 	gettimeoffset = clps711x_gettimeoffset;
@@ -50,5 +51,7 @@
 
 	clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */
 
-	xtime.tv_sec = clps_readl(RTCDR);
+	tv.tv_nsec = 0;
+	tv.tv_sec = clps_readl(RTCDR);
+	do_settimeofday(&tv);
 }
diff -Nru a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c
--- a/arch/arm/mach-integrator/cpu.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mach-integrator/cpu.c	Thu Jan  8 23:00:24 2004
@@ -172,7 +172,7 @@
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
 	policy->cpuinfo.max_freq = 160000;
 	policy->cpuinfo.min_freq = 12000;
-	policy->cpuinfo.transition_latency = 1000; /* 1 ms, assumed */
+	policy->cpuinfo.transition_latency = 1000000; /* 1 ms, assumed */
 	policy->cur = policy->min = policy->max =
 		icst525_khz(&cclk_params, vco); /* current freq */
 
diff -Nru a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c
--- a/arch/arm/mach-integrator/integrator_ap.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mach-integrator/integrator_ap.c	Thu Jan  8 23:00:24 2004
@@ -126,7 +126,7 @@
 	writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
 
 	for (i = 0; i < NR_IRQS; i++) {
-		if (((1 << i) && INTEGRATOR_SC_VALID_INT) != 0) {
+		if (((1 << i) & INTEGRATOR_SC_VALID_INT) != 0) {
 			set_irq_chip(i, &sc_chip);
 			set_irq_handler(i, do_level_IRQ);
 			set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
diff -Nru a/arch/arm/mach-sa1100/Kconfig b/arch/arm/mach-sa1100/Kconfig
--- a/arch/arm/mach-sa1100/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mach-sa1100/Kconfig	Thu Jan  8 23:00:24 2004
@@ -304,7 +304,7 @@
 	depends on ARCH_SA1100
 	help
 	  Say Y here to support the Yopy PDA.  Product information at
-	  <http://www.yopy.com/>.  See Documentation/arm/SA110/Yopy
+	  <http://www.yopy.com/>.  See Documentation/arm/SA1100/Yopy
 	  for more.
 
 config SA1100_STORK
diff -Nru a/arch/arm/mm/cache-v3.S b/arch/arm/mm/cache-v3.S
--- a/arch/arm/mm/cache-v3.S	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mm/cache-v3.S	Thu Jan  8 23:00:24 2004
@@ -32,14 +32,14 @@
 	/* FALLTHROUGH */
 
 /*
- *	flush_user_cache_range(start, end, vm_flags)
+ *	flush_user_cache_range(start, end, flags)
  *
  *	Invalidate a range of cache entries in the specified
  *	address space.
  *
  *	- start - start address (may not be aligned)
  *	- end	- end address (exclusive, may not be aligned)
- *	- vma	- vma_area_struct describing address space
+ *	- flags	- vma_area_struct flags describing address space
  */
 ENTRY(v3_flush_user_cache_range)
 	mov	ip, #0
diff -Nru a/arch/arm/mm/cache-v4.S b/arch/arm/mm/cache-v4.S
--- a/arch/arm/mm/cache-v4.S	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/mm/cache-v4.S	Thu Jan  8 23:00:23 2004
@@ -34,14 +34,14 @@
 	mov	pc, lr
 
 /*
- *	flush_user_cache_range(start, end, vma)
+ *	flush_user_cache_range(start, end, flags)
  *
  *	Invalidate a range of cache entries in the specified
  *	address space.
  *
  *	- start - start address (may not be aligned)
  *	- end	- end address (exclusive, may not be aligned)
- *	- vma	- vma_area_struct describing address space
+ *	- flags	- vma_area_struct flags describing address space
  */
 ENTRY(v4_flush_user_cache_range)
 	mov	ip, #0
diff -Nru a/arch/arm/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S
--- a/arch/arm/mm/cache-v4wb.S	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mm/cache-v4wb.S	Thu Jan  8 23:00:24 2004
@@ -72,14 +72,14 @@
 	mov	pc, lr
 
 /*
- *	flush_user_cache_range(start, end, vm_flags)
+ *	flush_user_cache_range(start, end, flags)
  *
  *	Invalidate a range of cache entries in the specified
  *	address space.
  *
  *	- start - start address (inclusive, page aligned)
  *	- end	- end address (exclusive, page aligned)
- *	- vma	- vma_area_struct describing address space
+ *	- flags	- vma_area_struct flags describing address space
  */
 ENTRY(v4wb_flush_user_cache_range)
 	sub	r3, r1, r0			@ calculate total size
diff -Nru a/arch/arm/mm/cache-v4wt.S b/arch/arm/mm/cache-v4wt.S
--- a/arch/arm/mm/cache-v4wt.S	Thu Jan  8 23:00:23 2004
+++ b/arch/arm/mm/cache-v4wt.S	Thu Jan  8 23:00:23 2004
@@ -64,14 +64,14 @@
 	mov	pc, lr
 
 /*
- *	flush_user_cache_range(start, end, vm_flags)
+ *	flush_user_cache_range(start, end, flags)
  *
  *	Clean and invalidate a range of cache entries in the specified
  *	address space.
  *
  *	- start - start address (inclusive, page aligned)
  *	- end	- end address (exclusive, page aligned)
- *	- vma	- vma_area_struct describing address space
+ *	- flags	- vma_area_struct flags describing address space
  */
 ENTRY(v4wt_flush_user_cache_range)
 	sub	r3, r1, r0			@ calculate total size
diff -Nru a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c
--- a/arch/arm/mm/mm-armv.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm/mm/mm-armv.c	Thu Jan  8 23:00:24 2004
@@ -10,6 +10,7 @@
  *  Page table sludge for ARM v3 and v4 processor architectures.
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/bootmem.h>
@@ -25,23 +26,52 @@
 
 #include <asm/mach/map.h>
 
-static unsigned int cachepolicy __initdata = PMD_SECT_WB;
+#define CPOLICY_UNCACHED	0
+#define CPOLICY_BUFFERED	1
+#define CPOLICY_WRITETHROUGH	2
+#define CPOLICY_WRITEBACK	3
+#define CPOLICY_WRITEALLOC	4
+
+static unsigned int cachepolicy __initdata = CPOLICY_WRITEBACK;
 static unsigned int ecc_mask __initdata = 0;
+pgprot_t pgprot_kernel;
+
+EXPORT_SYMBOL(pgprot_kernel);
 
 struct cachepolicy {
-	char		*policy;
+	const char	policy[16];
 	unsigned int	cr_mask;
 	unsigned int	pmd;
+	unsigned int	pte;
 };
 
 static struct cachepolicy cache_policies[] __initdata = {
-	{ "uncached",		CR_W|CR_C,	PMD_SECT_UNCACHED },
-	{ "buffered",		CR_C,		PMD_SECT_BUFFERED },
-	{ "writethrough",	0,		PMD_SECT_WT       },
-#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
-	{ "writeback",		0,		PMD_SECT_WB       },
-	{ "writealloc",		0,		PMD_SECT_WBWA     }
-#endif
+	{
+		.policy		= "uncached",
+		.cr_mask	= CR_W|CR_C,
+		.pmd		= PMD_SECT_UNCACHED,
+		.pte		= 0,
+	}, {
+		.policy		= "buffered",
+		.cr_mask	= CR_C,
+		.pmd		= PMD_SECT_BUFFERED,
+		.pte		= PTE_BUFFERABLE,
+	}, {
+		.policy		= "writethrough",
+		.cr_mask	= 0,
+		.pmd		= PMD_SECT_WT,
+		.pte		= PTE_CACHEABLE,
+	}, {
+		.policy		= "writeback",
+		.cr_mask	= 0,
+		.pmd		= PMD_SECT_WB,
+		.pte		= PTE_BUFFERABLE|PTE_CACHEABLE,
+	}, {
+		.policy		= "writealloc",
+		.cr_mask	= 0,
+		.pmd		= PMD_SECT_WBWA,
+		.pte		= PTE_BUFFERABLE|PTE_CACHEABLE,
+	}
 };
 
 /*
@@ -58,7 +88,7 @@
 		int len = strlen(cache_policies[i].policy);
 
 		if (memcmp(*p, cache_policies[i].policy, len) == 0) {
-			cachepolicy = cache_policies[i].pmd;
+			cachepolicy = i;
 			cr_alignment &= ~cache_policies[i].cr_mask;
 			cr_no_alignment &= ~cache_policies[i].cr_mask;
 			*p += len;
@@ -306,9 +336,23 @@
  */
 static void __init build_mem_type_table(void)
 {
+	struct cachepolicy *cp;
 	unsigned int cr = get_cr();
 	int cpu_arch = cpu_architecture();
-	const char *policy;
+	int i;
+
+#if defined(CONFIG_CPU_DCACHE_DISABLE)
+	if (cachepolicy > CPOLICY_BUFFERED)
+		cachepolicy = CPOLICY_BUFFERED;
+#elif defined(CONFIG_CPU_DCACHE_WRITETHROUGH)
+	if (cachepolicy > CPOLICY_WRITETHROUGH)
+		cachepolicy = CPOLICY_WRITETHROUGH;
+#endif
+	if (cpu_arch < CPU_ARCH_ARMv5) {
+		if (cachepolicy >= CPOLICY_WRITEALLOC)
+			cachepolicy = CPOLICY_WRITEBACK;
+		ecc_mask = 0;
+	}
 
 	/*
 	 * ARMv6 and above have extended page tables.
@@ -327,56 +371,39 @@
 		mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
 	}
 
-	/*
-	 * ARMv6 can map the vectors as write-through.
-	 */
-	if (cpu_arch >= CPU_ARCH_ARMv6)
-		mem_types[MT_VECTORS].prot_pte |= PTE_CACHEABLE;
-	else
-		mem_types[MT_VECTORS].prot_pte |= PTE_BUFFERABLE|PTE_CACHEABLE;
+	cp = &cache_policies[cachepolicy];
 
-	/*
-	 * ARMv5 and higher can use ECC memory.
-	 */
 	if (cpu_arch >= CPU_ARCH_ARMv5) {
-		mem_types[MT_VECTORS].prot_l1 |= ecc_mask;
-		mem_types[MT_MEMORY].prot_sect |= ecc_mask;
+		mem_types[MT_VECTORS].prot_pte |= cp->pte & PTE_CACHEABLE;
 	} else {
+		mem_types[MT_VECTORS].prot_pte |= cp->pte;
 		mem_types[MT_MINICLEAN].prot_sect &= ~PMD_SECT_TEX(1);
-		if (cachepolicy == PMD_SECT_WBWA)
-			cachepolicy = PMD_SECT_WB;
-		ecc_mask = 0;
 	}
 
-	mem_types[MT_MEMORY].prot_sect |= cachepolicy;
+	mem_types[MT_VECTORS].prot_l1 |= ecc_mask;
+	mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd;
 
-	switch (cachepolicy) {
-	default:
-	case PMD_SECT_UNCACHED:
-		policy = "uncached";
-		break;
-	case PMD_SECT_BUFFERED:
-		mem_types[MT_VECTORS].prot_pte |= PTE_BUFFERABLE;
-		policy = "buffered";
-		break;
+	for (i = 0; i < 16; i++) {
+		unsigned long v = pgprot_val(protection_map[i]);
+		v &= (~(PTE_BUFFERABLE|PTE_CACHEABLE)) | cp->pte;
+		protection_map[i] = __pgprot(v);
+	}
+
+	pgprot_kernel = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG |
+				 L_PTE_DIRTY | L_PTE_WRITE |
+				 L_PTE_EXEC | cp->pte);
+
+	switch (cp->pmd) {
 	case PMD_SECT_WT:
-		mem_types[MT_VECTORS].prot_pte |= PTE_BUFFERABLE|PTE_CACHEABLE;
 		mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WT;
-		policy = "write through";
 		break;
 	case PMD_SECT_WB:
-		mem_types[MT_VECTORS].prot_pte |= PTE_BUFFERABLE|PTE_CACHEABLE;
-		mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WB;
-		policy = "write back";
-		break;
 	case PMD_SECT_WBWA:
-		mem_types[MT_VECTORS].prot_pte |= PTE_BUFFERABLE|PTE_CACHEABLE;
 		mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WB;
-		policy = "write back, write allocate";
 		break;
 	}
 	printk("Memory policy: ECC %sabled, Data cache %s\n",
-		ecc_mask ? "en" : "dis", policy);
+		ecc_mask ? "en" : "dis", cp->policy);
 }
 
 /*
diff -Nru a/arch/arm26/kernel/irq.c b/arch/arm26/kernel/irq.c
--- a/arch/arm26/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/arm26/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -135,10 +135,10 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 	    	action = irq_desc[i].action;
 		if (!action)
 			continue;
@@ -148,10 +148,10 @@
 			seq_printf(p, ", %s", action->name);
 		}
 		seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		show_fiq_list(p, v);
+		seq_printf(p, "Err: %10lu\n", irq_err_count);
 	}
-
-	show_fiq_list(p, v);
-	seq_printf(p, "Err: %10lu\n", irq_err_count);
 	return 0;
 }
 
diff -Nru a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c
--- a/arch/cris/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/cris/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -89,11 +89,11 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 		action = irq_action[i];
 		if (!action) 
diff -Nru a/arch/h8300/Kconfig b/arch/h8300/Kconfig
--- a/arch/h8300/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/h8300/Kconfig	Thu Jan  8 23:00:24 2004
@@ -5,6 +5,10 @@
 
 mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"
 
+config H8300
+	bool
+	default y
+
 config MMU
 	bool
 	default n
diff -Nru a/arch/h8300/Makefile b/arch/h8300/Makefile
--- a/arch/h8300/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/h8300/Makefile	Thu Jan  8 23:00:23 2004
@@ -34,7 +34,7 @@
 ldflags-$(CONFIG_CPU_H8S)	:= -mh8300self
 
 CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
 CFLAGS += -g
 CFLAGS += -D__linux__
 CFLAGS += -DUTS_SYSNAME=\"uClinux\"
diff -Nru a/arch/h8300/platform/h8300h/ints.c b/arch/h8300/platform/h8300h/ints.c
--- a/arch/h8300/platform/h8300h/ints.c	Thu Jan  8 23:00:23 2004
+++ b/arch/h8300/platform/h8300h/ints.c	Thu Jan  8 23:00:23 2004
@@ -228,9 +228,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
diff -Nru a/arch/h8300/platform/h8s/ints.c b/arch/h8300/platform/h8s/ints.c
--- a/arch/h8300/platform/h8s/ints.c	Thu Jan  8 23:00:23 2004
+++ b/arch/h8300/platform/h8s/ints.c	Thu Jan  8 23:00:23 2004
@@ -280,9 +280,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i]) {
 			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
 			seq_printf(p, "%s\n", irq_list[i]->devname);
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/Kconfig	Thu Jan  8 23:00:23 2004
@@ -115,10 +115,15 @@
 	default y
 	depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
 
+config X86_SUMMIT_NUMA
+	bool
+	default y
+	depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
+
 config X86_CYCLONE_TIMER
-       bool 
-       default y
-       depends on X86_SUMMIT || X86_GENERICARCH
+	bool
+	default y
+	depends on X86_SUMMIT || X86_GENERICARCH
 
 config ES7000_CLUSTERED_APIC
 	bool
@@ -784,6 +789,25 @@
 
 	  See <file:Documentation/mtrr.txt> for more information.
 
+config EFI
+	bool "Boot from EFI support (EXPERIMENTAL)"
+	depends on ACPI
+	default n
+	---help---
+
+	This enables the the kernel to boot on EFI platforms using
+	system configuration information passed to it from the firmware.
+	This also enables the kernel to use any EFI runtime services that are
+	available (such as the EFI variable services).
+
+	This option is only useful on systems that have EFI firmware
+	and will result in a kernel image that is ~8k larger.  In addition,
+	you must use the latest ELILO loader available at
+	ftp.hpl.hp.com/pub/linux-ia64/ in order to take advantage of kernel
+	initialization using EFI information (neither GRUB nor LILO know
+	anything about EFI).  However, even with this option, the resultant
+	kernel should continue to boot on existing non-EFI platforms.
+
 config HAVE_DEC_LOCK
 	bool
 	depends on (SMP || PREEMPT) && X86_CMPXCHG
@@ -793,7 +817,7 @@
 # Summit needs it only when NUMA is on
 config BOOT_IOREMAP
 	bool
-	depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
+	depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
 	default y
 
 endmenu
@@ -1029,6 +1053,25 @@
 	bool
  	depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
 	default y
+
+config PCI_USE_VECTOR
+	bool "Vector-based interrupt indexing"
+	depends on X86_LOCAL_APIC && X86_IO_APIC
+	default n
+	help
+	   This replaces the current existing IRQ-based index interrupt scheme
+	   with the vector-base index scheme. The advantages of vector base
+	   over IRQ base are listed below:
+	   1) Support MSI implementation.
+	   2) Support future IOxAPIC hotplug
+
+	   Note that this enables MSI, Message Signaled Interrupt, on all
+	   MSI capable device functions detected if users also install the
+	   MSI patch. Message Signal Interrupt enables an MSI-capable
+	   hardware device to send an inbound Memory Write on its PCI bus
+	   instead of asserting IRQ signal on device IRQ pin.
+
+	   If you don't know what to do here, say N.
 
 source "drivers/pci/Kconfig"
 
diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile
--- a/arch/i386/kernel/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/Makefile	Thu Jan  8 23:00:23 2004
@@ -24,12 +24,13 @@
 obj-$(CONFIG_X86_LOCAL_APIC)	+= apic.o nmi.o
 obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o
 obj-$(CONFIG_X86_NUMAQ)		+= numaq.o
-obj-$(CONFIG_X86_SUMMIT)	+= summit.o
+obj-$(CONFIG_X86_SUMMIT_NUMA)	+= summit.o
 obj-$(CONFIG_EDD)             	+= edd.o
 obj-$(CONFIG_MODULES)		+= module.o
 obj-y				+= sysenter.o vsyscall.o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat.o
 obj-$(CONFIG_HPET_TIMER) 	+= time_hpet.o
+obj-$(CONFIG_EFI) 		+= efi.o efi_stub.o
 
 EXTRA_AFLAGS   := -traditional
 
diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
--- a/arch/i386/kernel/acpi/boot.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/acpi/boot.c	Thu Jan  8 23:00:24 2004
@@ -26,6 +26,7 @@
 #include <linux/init.h>
 #include <linux/config.h>
 #include <linux/acpi.h>
+#include <linux/efi.h>
 #include <asm/pgalloc.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
@@ -331,6 +332,12 @@
 {
 	unsigned long		rsdp_phys = 0;
 
+	if (efi_enabled) {
+		if (efi.acpi20)
+			return __pa(efi.acpi20);
+		else if (efi.acpi)
+			return __pa(efi.acpi);
+	}
 	/*
 	 * Scan memory looking for the RSDP signature. First search EBDA (low
 	 * memory) paragraphs and then search upper memory (E0000-FFFFF).
diff -Nru a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
--- a/arch/i386/kernel/cpu/common.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/common.c	Thu Jan  8 23:00:23 2004
@@ -510,7 +510,7 @@
 		BUG();
 	enter_lazy_tlb(&init_mm, current);
 
-	load_esp0(t, thread->esp0);
+	load_esp0(t, thread);
 	set_tss_desc(cpu,t);
 	cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
 	load_TR_desc();
diff -Nru a/arch/i386/kernel/cpu/cpufreq/acpi.c b/arch/i386/kernel/cpu/cpufreq/acpi.c
--- a/arch/i386/kernel/cpu/cpufreq/acpi.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/acpi.c	Thu Jan  8 23:00:23 2004
@@ -578,8 +578,8 @@
 	/* detect transition latency */
 	policy->cpuinfo.transition_latency = 0;
 	for (i=0;i<perf->state_count;i++) {
-		if (perf->states[i].transition_latency > policy->cpuinfo.transition_latency)
-			policy->cpuinfo.transition_latency = perf->states[i].transition_latency;
+		if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
+			policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
 	}
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
 	policy->cur = perf->states[pr->limit.state.px].core_frequency * 1000;
diff -Nru a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c
--- a/arch/i386/kernel/cpu/cpufreq/longhaul.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c	Thu Jan  8 23:00:23 2004
@@ -170,6 +170,9 @@
  * between that value multiplied by possible FSBs and cpu_mhz which
  * was calculated at boot time. Really ugly, but no other way to do this.
  */
+
+#define ROUNDING	0xf
+
 static int _guess (int guess, int maxmult)
 {
 	int target;
@@ -177,15 +180,19 @@
 	target = ((maxmult/10)*guess);
 	if (maxmult%10 != 0)
 		target += (guess/2);
-	target &= ~0xf;
+	target += ROUNDING/2;
+	target &= ~ROUNDING;
 	return target;
 }
 
 static int guess_fsb(int maxmult)
 {
-	int speed = (cpu_khz/1000) & ~0xf;
+	int speed = (cpu_khz/1000);
 	int i;
 	int speeds[3] = { 66, 100, 133 };
+
+	speed += ROUNDING/2;
+	speed &= ~ROUNDING;
 
 	for (i=0; i<3; i++) {
 		if (_guess(speeds[i],maxmult) == speed)
diff -Nru a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
--- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	Thu Jan  8 23:00:24 2004
@@ -48,8 +48,7 @@
 
 
 static int has_N44_O17_errata[NR_CPUS];
-static int stock_freq;
-
+static unsigned int stock_freq;
 
 static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
 {
@@ -175,6 +174,54 @@
 	return cpufreq_frequency_table_verify(policy, &p4clockmod_table[0]);
 }
 
+/* copied from speedstep_lib, made SMP-compatible */
+static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c)
+{
+	u32 msr_lo, msr_hi, mult;
+	unsigned int fsb = 0;
+
+	if (c->x86 != 0xF) {
+		printk(KERN_DEBUG PFX "Unknown P4. Please send an e-mail to <linux@brodo.de>\n");
+		return 0;
+	}
+
+	rdmsr(0x2c, msr_lo, msr_hi);
+
+	/* printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); */
+	/* decode the FSB: see IA-32 Intel (C) Architecture Software 
+	 * Developer's Manual, Volume 3: System Prgramming Guide,
+	 * revision #12 in Table B-1: MSRs in the Pentium 4 and
+	 * Intel Xeon Processors, on page B-4 and B-5.
+	 */
+	if (c->x86_model < 2)
+		fsb = 100 * 1000;
+	else {
+		u8 fsb_code = (msr_lo >> 16) & 0x7;
+		switch (fsb_code) {
+		case 0:
+			fsb = 100 * 1000;
+			break;
+		case 1:
+			fsb = 13333 * 10;
+			break;
+		case 2:
+			fsb = 200 * 1000;
+			break;
+		}
+	}
+
+	if (!fsb) {
+		printk(KERN_DEBUG PFX "couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n");
+		printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi);
+	}
+
+	/* Multiplier. */
+	mult = msr_lo >> 24;
+
+	return (fsb * mult);
+}
+
+ 
 
 static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
 {
@@ -192,15 +239,10 @@
 		has_N44_O17_errata[policy->cpu] = 1;
 	}
 	
-	/* get frequency */
-	if (!stock_freq) {
-		if (cpu_khz)
-			stock_freq = cpu_khz;
-		else {
-			printk(KERN_INFO PFX "unknown core frequency - please use module parameter 'stock_freq'\n");
-			return -EINVAL;
-		}
-	}
+	/* get max frequency */
+	stock_freq = cpufreq_p4_get_frequency(c);
+	if (!stock_freq)
+		return -EINVAL;
 
 	/* table init */
 	for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
@@ -213,7 +255,7 @@
 	
 	/* cpuinfo and default policy values */
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
-	policy->cpuinfo.transition_latency = 1000;
+	policy->cpuinfo.transition_latency = 1000000; /* assumed */
 	policy->cur = stock_freq;
 
 	return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0]);
@@ -268,8 +310,6 @@
 	cpufreq_unregister_driver(&p4clockmod_driver);
 }
 
-
-MODULE_PARM(stock_freq, "i");
 
 MODULE_AUTHOR ("Zwane Mwaikambo <zwane@commfireservices.com>");
 MODULE_DESCRIPTION ("cpufreq driver for Pentium(TM) 4/Xeon(TM)");
diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c
--- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c	Thu Jan  8 23:00:23 2004
@@ -337,7 +337,8 @@
 				}
 			}
 			printk (KERN_INFO PFX "No PST tables match this cpuid (0x%x)\n", etuple);
-			printk ("This is indicative of a broken BIOS. Email davej@redhat.com\n");
+			printk (KERN_INFO PFX "This is indicative of a broken BIOS.\n");
+			printk (KERN_INFO PFX "See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.shtml\n");
 			return -EINVAL;
 		}
 		p++;
@@ -386,7 +387,11 @@
 				minimum_speed, maximum_speed);
 
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
-	policy->cpuinfo.transition_latency = latency;
+
+	/* latency is in 10 ns (look for SGTC above) for each VID
+	 * and FID transition, so multiply that value with 20 */
+	policy->cpuinfo.transition_latency = latency * 20;
+
 	policy->cur = maximum_speed;
 
 	return cpufreq_frequency_table_cpuinfo(policy, powernow_table);
diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
--- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c	Thu Jan  8 23:00:24 2004
@@ -687,11 +687,13 @@
 			if (ppst[j].vid < rvo) {	/* vid+rvo >= 0 */
 				printk(KERN_ERR BFX
 				       "0 vid exceeded with pstate %d\n", j);
+				kfree(ppst);
 				return -ENODEV;
 			}
 			if (ppst[j].vid < maxvid+rvo) { /* vid+rvo >= maxvid */
 				printk(KERN_ERR BFX
 				       "maxvid exceeded with pstate %d\n", j);
+				kfree(ppst);
 				return -ENODEV;
 			}
 		}
@@ -706,7 +708,7 @@
 
 		for (j = 0; j < numps; j++)
 			if ((ppst[j].fid==currfid) && (ppst[j].vid==currvid))
-				return (0);
+				return 0;
 
 		printk(KERN_ERR BFX "currfid/vid do not match PST, ignoring\n");
 		return 0;
@@ -935,10 +937,7 @@
 		return -ENODEV;
 	}
 
-#warning pol->policy is in undefined state here
-	res = find_match(&targ, &min, &max,
-			 pol->policy == CPUFREQ_POLICY_POWERSAVE ?
-			 SEARCH_DOWN : SEARCH_UP, 0, 0);
+	res = find_match(&targ, &min, &max, SEARCH_DOWN, 0, 0);
 	if (!res) {
 		pol->min = min * 1000;
 		pol->max = max * 1000;
@@ -957,9 +956,10 @@
 
 	pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
 
-	/* Take a crude guess here. */
-	pol->cpuinfo.transition_latency = ((rvo + 8) * vstable * VST_UNITS_20US)
-	    + (3 * (1 << irt) * 10);
+	/* Take a crude guess here. 
+	 * That guess was in microseconds, so multply with 1000 */
+	pol->cpuinfo.transition_latency = (((rvo + 8) * vstable * VST_UNITS_20US)
+	    + (3 * (1 << irt) * 10)) * 1000;
 
 	if (query_current_values_with_pending_wait())
 		return -EIO;
diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	Thu Jan  8 23:00:23 2004
@@ -73,6 +73,16 @@
 	{ .frequency = CPUFREQ_TABLE_END }
 };
 
+/* Ultra Low Voltage Intel Pentium M processor 1000MHz */
+static struct cpufreq_frequency_table op_1000[] =
+{
+	OP(600,  844),
+	OP(800,  972),
+	OP(900,  988),
+	OP(1000, 1004),
+	{ .frequency = CPUFREQ_TABLE_END }
+};
+
 /* Low Voltage Intel Pentium M processor 1.10GHz */
 static struct cpufreq_frequency_table op_1100[] =
 {
@@ -165,6 +175,7 @@
 static const struct cpu_model models[] = 
 {
        _CPU( 900, " 900"),
+	CPU(1000),
 	CPU(1100),
 	CPU(1200),
 	CPU(1300),
diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c	Thu Jan  8 23:00:24 2004
@@ -106,14 +106,45 @@
 
 static unsigned int pentium4_get_frequency(void)
 {
-	u32 msr_lo, msr_hi;
+	struct cpuinfo_x86 *c = &boot_cpu_data;
+	u32 msr_lo, msr_hi, mult;
+	unsigned int fsb = 0;
 
 	rdmsr(0x2c, msr_lo, msr_hi);
 
 	dprintk(KERN_DEBUG "speedstep-lib: P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi);
 
-	msr_lo >>= 24;
-	return (msr_lo * 100000);
+	/* decode the FSB: see IA-32 Intel (C) Architecture Software 
+	 * Developer's Manual, Volume 3: System Prgramming Guide,
+	 * revision #12 in Table B-1: MSRs in the Pentium 4 and
+	 * Intel Xeon Processors, on page B-4 and B-5.
+	 */
+	if (c->x86_model < 2)
+		fsb = 100 * 1000;
+	else {
+		u8 fsb_code = (msr_lo >> 16) & 0x7;
+		switch (fsb_code) {
+		case 0:
+			fsb = 100 * 1000;
+			break;
+		case 1:
+			fsb = 13333 * 10;
+			break;
+		case 2:
+			fsb = 200 * 1000;
+			break;
+		}
+	}
+
+	if (!fsb)
+		printk(KERN_DEBUG "speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n");
+
+	/* Multiplier. */
+	mult = msr_lo >> 24;
+
+	dprintk(KERN_DEBUG "speedstep-lib: P4 - FSB %u kHz; Multiplier %u\n", fsb, mult);
+
+	return (fsb * mult);
 }
 
  
diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h	Thu Jan  8 23:00:23 2004
@@ -15,7 +15,7 @@
 #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY	0x00000001  /* Coppermine core */
 #define SPEEDSTEP_PROCESSOR_PIII_C		0x00000002  /* Coppermine core */
 #define SPEEDSTEP_PROCESSOR_PIII_T 		0x00000003  /* Tualatin core */
-#define SPEEDSTEP_PROCESSOR_P4M			0x00000004  /* P4-M with 100 MHz FSB */
+#define SPEEDSTEP_PROCESSOR_P4M			0x00000004  /* P4-M  */
 
 /* speedstep states -- only two of them */
 
diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c	Thu Jan  8 23:00:23 2004
@@ -19,6 +19,7 @@
 #include <linux/cpufreq.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/delay.h>
 #include <asm/ist.h>
 
 #include "speedstep-lib.h"
@@ -51,10 +52,14 @@
 #define SET_SPEEDSTEP_STATE 2
 #define GET_SPEEDSTEP_FREQS 4
 
+/* how often shall the SMI call be tried if it failed, e.g. because
+ * of DMA activity going on? */
+#define SMI_TRIES 5
+
 /* DEBUG
  *   Define it if you want verbose debug output, e.g. for bug reporting
  */
-#define SPEEDSTEP_DEBUG
+//#define SPEEDSTEP_DEBUG
 
 #ifdef SPEEDSTEP_DEBUG
 #define dprintk(msg...) printk(msg)
@@ -85,6 +90,9 @@
 
 /**
  * speedstep_smi_get_freqs - get SpeedStep preferred & current freq.
+ * Only available on later SpeedStep-enabled systems, returns false results or
+ * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing
+ * shows that the latter occurs if !(ist_info.event & 0xFFFF).
  *
  */
 static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
@@ -93,6 +101,9 @@
 	u32 state=0;
 	u32 function = GET_SPEEDSTEP_FREQS;
 
+	if (!(ist_info.event & 0xFFFF))
+		return -ENODEV;
+
 	command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff);
 
 	__asm__ __volatile__("movl $0, %%edi\n"
@@ -134,10 +145,11 @@
  */
 static void speedstep_set_state (unsigned int state, unsigned int notify)
 {
-	unsigned int old_state, result, command, new_state;
+	unsigned int old_state, result = 0, command, new_state;
 	unsigned long flags;
 	struct cpufreq_freqs freqs;
 	unsigned int function=SET_SPEEDSTEP_STATE;
+	unsigned int retry = 0;
 
 	if (state > 0x1)
 		return;
@@ -157,20 +169,28 @@
 	local_irq_save(flags);
 
 	command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff);
-	__asm__ __volatile__(
-		"movl $0, %%edi\n"
-		"out %%al, (%%dx)\n"
-		: "=b" (new_state), "=D" (result)
-		: "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0)
-	);
+
+	do {
+		if (retry) {
+			dprintk(KERN_INFO "cpufreq: retry %u, previous result %u\n", retry, result);
+			mdelay(retry * 50);
+		}
+		retry++;
+		__asm__ __volatile__(
+			"movl $0, %%edi\n"
+			"out %%al, (%%dx)\n"
+			: "=b" (new_state), "=D" (result)
+			: "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0)
+			);
+	} while ((new_state != state) && (retry <= SMI_TRIES));
 
 	/* enable IRQs */
 	local_irq_restore(flags);
 
 	if (new_state == state) {
-		dprintk(KERN_INFO "cpufreq: change to %u MHz succeded\n", (freqs.new / 1000));
+		dprintk(KERN_INFO "cpufreq: change to %u MHz succeeded after %u tries with result %u\n", (freqs.new / 1000), retry, result);
 	} else {
-		printk(KERN_ERR "cpufreq: change failed\n");
+		printk(KERN_ERR "cpufreq: change failed with new_state %u and result %u\n", new_state, result);
 	}
 
 	if (notify)
@@ -225,9 +245,10 @@
 		return -ENODEV;
 
 	result = speedstep_smi_ownership();
-
-	if (result)
+	if (result) {
 		dprintk(KERN_INFO "cpufreq: fails an aquiring ownership of a SMI interface.\n");
+		return -EINVAL;
+	}
 
 	/* detect low and high frequency */
 	result = speedstep_smi_get_freqs(&speedstep_freqs[SPEEDSTEP_LOW].frequency,
@@ -286,6 +307,7 @@
 	.target 	= speedstep_target,
 	.init		= speedstep_cpu_init,
 	.resume		= speedstep_resume,
+	.owner		= THIS_MODULE,
 };
 
 /**
diff -Nru a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/i386/kernel/efi.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,645 @@
+/*
+ * Extensible Firmware Interface
+ *
+ * Based on Extensible Firmware Interface Specification version 1.0
+ *
+ * Copyright (C) 1999 VA Linux Systems
+ * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
+ * Copyright (C) 1999-2002 Hewlett-Packard Co.
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *
+ * All EFI Runtime Services are not implemented yet as EFI only
+ * supports physical mode addressing on SoftSDV. This is to be fixed
+ * in a future version.  --drummond 1999-07-20
+ *
+ * Implemented EFI runtime services and virtual mode calls.  --davidm
+ *
+ * Goutham Rao: <goutham.rao@intel.com>
+ *	Skip non-WB memory and ignore empty memory ranges.
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/types.h>
+#include <linux/time.h>
+#include <linux/spinlock.h>
+#include <linux/bootmem.h>
+#include <linux/ioport.h>
+#include <linux/proc_fs.h>
+#include <linux/efi.h>
+
+#include <asm/setup.h>
+#include <asm/io.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/processor.h>
+#include <asm/desc.h>
+#include <asm/pgalloc.h>
+#include <asm/tlbflush.h>
+
+#define EFI_DEBUG	0
+#define PFX 		"EFI: "
+
+extern efi_status_t asmlinkage efi_call_phys(void *, ...);
+
+struct efi efi;
+struct efi efi_phys __initdata;
+struct efi_memory_map memmap __initdata;
+
+/*
+ * We require an early boot_ioremap mapping mechanism initially
+ */
+extern void * boot_ioremap(unsigned long, unsigned long);
+
+/*
+ * efi_dir is allocated here, but the directory isn't created
+ * here, as proc_mkdir() doesn't work this early in the bootup
+ * process.  Therefore, each module, like efivars, must test for
+ *    if (!efi_dir) efi_dir = proc_mkdir("efi", NULL);
+ * prior to creating their own entries under /proc/efi.
+ */
+#ifdef CONFIG_PROC_FS
+struct proc_dir_entry *efi_dir;
+#endif
+
+
+/*
+ * To make EFI call EFI runtime service in physical addressing mode we need
+ * prelog/epilog before/after the invocation to disable interrupt, to
+ * claim EFI runtime service handler exclusively and to duplicate a memory in
+ * low memory space say 0 - 3G.
+ */
+
+static unsigned long efi_rt_eflags;
+static spinlock_t efi_rt_lock = SPIN_LOCK_UNLOCKED;
+static pgd_t efi_bak_pg_dir_pointer[2];
+
+static void efi_call_phys_prelog(void)
+{
+	unsigned long cr4;
+	unsigned long temp;
+
+	spin_lock(&efi_rt_lock);
+	local_irq_save(efi_rt_eflags);
+
+	/*
+	 * If I don't have PSE, I should just duplicate two entries in page
+	 * directory. If I have PSE, I just need to duplicate one entry in
+	 * page directory.
+	 */
+	__asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
+
+	if (cr4 & X86_CR4_PSE) {
+		efi_bak_pg_dir_pointer[0].pgd =
+		    swapper_pg_dir[pgd_index(0)].pgd;
+		swapper_pg_dir[0].pgd =
+		    swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
+	} else {
+		efi_bak_pg_dir_pointer[0].pgd =
+		    swapper_pg_dir[pgd_index(0)].pgd;
+		efi_bak_pg_dir_pointer[1].pgd =
+		    swapper_pg_dir[pgd_index(0x400000)].pgd;
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
+		temp = PAGE_OFFSET + 0x400000;
+		swapper_pg_dir[pgd_index(0x400000)].pgd =
+		    swapper_pg_dir[pgd_index(temp)].pgd;
+	}
+
+	/*
+	 * After the lock is released, the original page table is restored.
+	 */
+	local_flush_tlb();
+
+	cpu_gdt_descr[0].address = __pa(cpu_gdt_descr[0].address);
+	__asm__ __volatile__("lgdt %0":"=m"
+			    (*(struct Xgt_desc_struct *) __pa(&cpu_gdt_descr[0])));
+}
+
+static void efi_call_phys_epilog(void)
+{
+	unsigned long cr4;
+
+	cpu_gdt_descr[0].address =
+		(unsigned long) __va(cpu_gdt_descr[0].address);
+	__asm__ __volatile__("lgdt %0":"=m"(cpu_gdt_descr));
+	__asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
+
+	if (cr4 & X86_CR4_PSE) {
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    efi_bak_pg_dir_pointer[0].pgd;
+	} else {
+		swapper_pg_dir[pgd_index(0)].pgd =
+		    efi_bak_pg_dir_pointer[0].pgd;
+		swapper_pg_dir[pgd_index(0x400000)].pgd =
+		    efi_bak_pg_dir_pointer[1].pgd;
+	}
+
+	/*
+	 * After the lock is released, the original page table is restored.
+	 */
+	local_flush_tlb();
+
+	local_irq_restore(efi_rt_eflags);
+	spin_unlock(&efi_rt_lock);
+}
+
+static efi_status_t
+phys_efi_set_virtual_address_map(unsigned long memory_map_size,
+				 unsigned long descriptor_size,
+				 u32 descriptor_version,
+				 efi_memory_desc_t *virtual_map)
+{
+	efi_status_t status;
+
+	efi_call_phys_prelog();
+	status = efi_call_phys(efi_phys.set_virtual_address_map,
+				     memory_map_size, descriptor_size,
+				     descriptor_version, virtual_map);
+	efi_call_phys_epilog();
+	return status;
+}
+
+efi_status_t
+phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
+{
+	efi_status_t status;
+
+	efi_call_phys_prelog();
+	status = efi_call_phys(efi_phys.get_time, tm, tc);
+	efi_call_phys_epilog();
+	return status;
+}
+
+int inline efi_set_rtc_mmss(unsigned long nowtime)
+{
+	int real_seconds, real_minutes;
+	efi_status_t 	status;
+	efi_time_t 	eft;
+	efi_time_cap_t 	cap;
+
+	spin_lock(&efi_rt_lock);
+	status = efi.get_time(&eft, &cap);
+	spin_unlock(&efi_rt_lock);
+	if (status != EFI_SUCCESS)
+		panic("Ooops, efitime: can't read time!\n");
+	real_seconds = nowtime % 60;
+	real_minutes = nowtime / 60;
+
+	if (((abs(real_minutes - eft.minute) + 15)/30) & 1)
+		real_minutes += 30;
+	real_minutes %= 60;
+
+	eft.minute = real_minutes;
+	eft.second = real_seconds;
+
+	if (status != EFI_SUCCESS) {
+		printk("Ooops: efitime: can't read time!\n");
+		return -1;
+	}
+	return 0;
+}
+/*
+ * This should only be used during kernel init and before runtime
+ * services have been remapped, therefore, we'll need to call in physical
+ * mode.  Note, this call isn't used later, so mark it __init.
+ */
+unsigned long inline __init efi_get_time(void)
+{
+	efi_status_t status;
+	efi_time_t eft;
+	efi_time_cap_t cap;
+
+	status = phys_efi_get_time(&eft, &cap);
+	if (status != EFI_SUCCESS)
+		printk("Oops: efitime: can't read time status: 0x%lx\n",status);
+
+	return mktime(eft.year, eft.month, eft.day, eft.hour,
+			eft.minute, eft.second);
+}
+
+int is_available_memory(efi_memory_desc_t * md)
+{
+	if (!(md->attribute & EFI_MEMORY_WB))
+		return 0;
+
+	switch (md->type) {
+		case EFI_LOADER_CODE:
+		case EFI_LOADER_DATA:
+		case EFI_BOOT_SERVICES_CODE:
+		case EFI_BOOT_SERVICES_DATA:
+		case EFI_CONVENTIONAL_MEMORY:
+			return 1;
+	}
+	return 0;
+}
+
+/*
+ * We need to map the EFI memory map again after paging_init().
+ */
+void __init efi_map_memmap(void)
+{
+	memmap.map = NULL;
+
+	memmap.map = (efi_memory_desc_t *)
+		bt_ioremap((unsigned long) memmap.phys_map,
+			(memmap.nr_map * sizeof(efi_memory_desc_t)));
+
+	if (memmap.map == NULL)
+		printk(KERN_ERR PFX "Could not remap the EFI memmap!\n");
+}
+
+void __init print_efi_memmap(void)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		printk(KERN_INFO "mem%02u: type=%u, attr=0x%llx, "
+			"range=[0x%016llx-0x%016llx) (%lluMB)\n",
+			i, md->type, md->attribute, md->phys_addr,
+			md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
+			(md->num_pages >> (20 - EFI_PAGE_SHIFT)));
+	}
+}
+
+/*
+ * Walks the EFI memory map and calls CALLBACK once for each EFI
+ * memory descriptor that has memory that is available for kernel use.
+ */
+void efi_memmap_walk(efi_freemem_callback_t callback, void *arg)
+{
+	int prev_valid = 0;
+	struct range {
+		unsigned long start;
+		unsigned long end;
+	} prev, curr;
+	efi_memory_desc_t *md;
+	unsigned long start, end;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if ((md->num_pages == 0) || (!is_available_memory(md)))
+			continue;
+
+		curr.start = md->phys_addr;
+		curr.end = curr.start + (md->num_pages << EFI_PAGE_SHIFT);
+
+		if (!prev_valid) {
+			prev = curr;
+			prev_valid = 1;
+		} else {
+			if (curr.start < prev.start)
+				printk(KERN_INFO PFX "Unordered memory map\n");
+			if (prev.end == curr.start)
+				prev.end = curr.end;
+			else {
+				start =
+				    (unsigned long) (PAGE_ALIGN(prev.start));
+				end = (unsigned long) (prev.end & PAGE_MASK);
+				if ((end > start)
+				    && (*callback) (start, end, arg) < 0)
+					return;
+				prev = curr;
+			}
+		}
+	}
+	if (prev_valid) {
+		start = (unsigned long) PAGE_ALIGN(prev.start);
+		end = (unsigned long) (prev.end & PAGE_MASK);
+		if (end > start)
+			(*callback) (start, end, arg);
+	}
+}
+
+void __init efi_init(void)
+{
+	efi_config_table_t *config_tables;
+	efi_runtime_services_t *runtime;
+	efi_char16_t *c16;
+	char vendor[100] = "unknown";
+	unsigned long num_config_tables;
+	int i = 0;
+
+	memset(&efi, 0, sizeof(efi) );
+	memset(&efi_phys, 0, sizeof(efi_phys));
+
+	efi_phys.systab = EFI_SYSTAB;
+	memmap.phys_map = EFI_MEMMAP;
+	memmap.nr_map = EFI_MEMMAP_SIZE/EFI_MEMDESC_SIZE;
+	memmap.desc_version = EFI_MEMDESC_VERSION;
+
+	efi.systab = (efi_system_table_t *)
+		boot_ioremap((unsigned long) efi_phys.systab,
+			sizeof(efi_system_table_t));
+	/*
+	 * Verify the EFI Table
+	 */
+	if (efi.systab == NULL)
+		printk(KERN_ERR PFX "Woah! Couldn't map the EFI system table.\n");
+	if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
+		printk(KERN_ERR PFX "Woah! EFI system table signature incorrect\n");
+	if ((efi.systab->hdr.revision ^ EFI_SYSTEM_TABLE_REVISION) >> 16 != 0)
+		printk(KERN_ERR PFX
+		       "Warning: EFI system table major version mismatch: "
+		       "got %d.%02d, expected %d.%02d\n",
+		       efi.systab->hdr.revision >> 16,
+		       efi.systab->hdr.revision & 0xffff,
+		       EFI_SYSTEM_TABLE_REVISION >> 16,
+		       EFI_SYSTEM_TABLE_REVISION & 0xffff);
+	/*
+	 * Grab some details from the system table
+	 */
+	num_config_tables = efi.systab->nr_tables;
+	config_tables = (efi_config_table_t *)efi.systab->tables;
+	runtime = efi.systab->runtime;
+
+	/*
+	 * Show what we know for posterity
+	 */
+	c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2);
+	if (c16) {
+		for (i = 0; i < sizeof(vendor) && *c16; ++i)
+			vendor[i] = *c16++;
+		vendor[i] = '\0';
+	} else
+		printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
+
+	printk(KERN_INFO PFX "EFI v%u.%.02u by %s \n",
+	       efi.systab->hdr.revision >> 16,
+	       efi.systab->hdr.revision & 0xffff, vendor);
+
+	/*
+	 * Let's see what config tables the firmware passed to us.
+	 */
+	config_tables = (efi_config_table_t *)
+				boot_ioremap((unsigned long) config_tables,
+			        num_config_tables * sizeof(efi_config_table_t));
+
+	if (config_tables == NULL)
+		printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n");
+
+	for (i = 0; i < num_config_tables; i++) {
+		if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
+			efi.mps = (void *)config_tables[i].table;
+			printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) {
+			efi.acpi20 = __va(config_tables[i].table);
+			printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) {
+			efi.acpi = __va(config_tables[i].table);
+			printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) {
+			efi.smbios = (void *) config_tables[i].table;
+			printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
+			efi.hcdp = (void *)config_tables[i].table;
+			printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table);
+		} else
+		    if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) {
+			efi.uga = (void *)config_tables[i].table;
+			printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table);
+		}
+	}
+	printk("\n");
+
+	/*
+	 * Check out the runtime services table. We need to map
+	 * the runtime services table so that we can grab the physical
+	 * address of several of the EFI runtime functions, needed to
+	 * set the firmware into virtual mode.
+	 */
+
+	runtime = (efi_runtime_services_t *) boot_ioremap((unsigned long)
+						runtime,
+				      		sizeof(efi_runtime_services_t));
+	if (runtime != NULL) {
+		/*
+	 	 * We will only need *early* access to the following
+		 * two EFI runtime services before set_virtual_address_map
+		 * is invoked.
+ 	 	 */
+		efi_phys.get_time = (efi_get_time_t *) runtime->get_time;
+		efi_phys.set_virtual_address_map =
+			(efi_set_virtual_address_map_t *)
+				runtime->set_virtual_address_map;
+	} else
+		printk(KERN_ERR PFX "Could not map the runtime service table!\n");
+
+	/* Map the EFI memory map for use until paging_init() */
+
+	memmap.map = (efi_memory_desc_t *)
+		boot_ioremap((unsigned long) EFI_MEMMAP, EFI_MEMMAP_SIZE);
+
+	if (memmap.map == NULL)
+		printk(KERN_ERR PFX "Could not map the EFI memory map!\n");
+
+	if (EFI_MEMDESC_SIZE != sizeof(efi_memory_desc_t)) {
+		printk(KERN_WARNING PFX "Warning! Kernel-defined memdesc doesn't "
+			   "match the one from EFI!\n");
+	}
+#if EFI_DEBUG
+	print_efi_memmap();
+#endif
+}
+
+/*
+ * This function will switch the EFI runtime services to virtual mode.
+ * Essentially, look through the EFI memmap and map every region that
+ * has the runtime attribute bit set in its memory descriptor and update
+ * that memory descriptor with the virtual address obtained from ioremap().
+ * This enables the runtime services to be called without having to
+ * thunk back into physical mode for every invocation.
+ */
+
+void __init efi_enter_virtual_mode(void)
+{
+	efi_memory_desc_t *md;
+	efi_status_t status;
+	int i;
+
+	efi.systab = NULL;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if (md->attribute & EFI_MEMORY_RUNTIME) {
+			md->virt_addr =
+				(unsigned long)ioremap(md->phys_addr,
+					md->num_pages << EFI_PAGE_SHIFT);
+			if (!(unsigned long)md->virt_addr) {
+				printk(KERN_ERR PFX "ioremap of 0x%lX failed\n",
+					(unsigned long)md->phys_addr);
+			}
+
+			if (((unsigned long)md->phys_addr <=
+					(unsigned long)efi_phys.systab) &&
+				((unsigned long)efi_phys.systab <
+					md->phys_addr +
+					((unsigned long)md->num_pages <<
+						EFI_PAGE_SHIFT))) {
+				unsigned long addr;
+
+				addr = md->virt_addr - md->phys_addr +
+						(unsigned long)efi_phys.systab;
+				efi.systab = (efi_system_table_t *)addr;
+			}
+		}
+	}
+
+	if (!efi.systab)
+		BUG();
+
+	status = phys_efi_set_virtual_address_map(
+			sizeof(efi_memory_desc_t) * memmap.nr_map,
+			sizeof(efi_memory_desc_t),
+			memmap.desc_version,
+		       	memmap.phys_map);
+
+	if (status != EFI_SUCCESS) {
+		printk (KERN_ALERT "You are screwed! "
+			"Unable to switch EFI into virtual mode "
+			"(status=%lx)\n", status);
+		panic("EFI call to SetVirtualAddressMap() failed!");
+	}
+
+	/*
+	 * Now that EFI is in virtual mode, update the function
+	 * pointers in the runtime service table to the new virtual addresses.
+	 */
+
+	efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
+	efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
+	efi.get_wakeup_time = (efi_get_wakeup_time_t *)
+					efi.systab->runtime->get_wakeup_time;
+	efi.set_wakeup_time = (efi_set_wakeup_time_t *)
+					efi.systab->runtime->set_wakeup_time;
+	efi.get_variable = (efi_get_variable_t *)
+					efi.systab->runtime->get_variable;
+	efi.get_next_variable = (efi_get_next_variable_t *)
+					efi.systab->runtime->get_next_variable;
+	efi.set_variable = (efi_set_variable_t *)
+					efi.systab->runtime->set_variable;
+	efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
+					efi.systab->runtime->get_next_high_mono_count;
+	efi.reset_system = (efi_reset_system_t *)
+					efi.systab->runtime->reset_system;
+}
+
+void __init
+efi_initialize_iomem_resources(struct resource *code_resource,
+			       struct resource *data_resource)
+{
+	struct resource *res;
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+
+		if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >
+		    0x100000000ULL)
+			continue;
+		res = alloc_bootmem_low(sizeof(struct resource));
+		switch (md->type) {
+		case EFI_RESERVED_TYPE:
+			res->name = "Reserved Memory";
+			break;
+		case EFI_LOADER_CODE:
+			res->name = "Loader Code";
+			break;
+		case EFI_LOADER_DATA:
+			res->name = "Loader Data";
+			break;
+		case EFI_BOOT_SERVICES_DATA:
+			res->name = "BootServices Data";
+			break;
+		case EFI_BOOT_SERVICES_CODE:
+			res->name = "BootServices Code";
+			break;
+		case EFI_RUNTIME_SERVICES_CODE:
+			res->name = "Runtime Service Code";
+			break;
+		case EFI_RUNTIME_SERVICES_DATA:
+			res->name = "Runtime Service Data";
+			break;
+		case EFI_CONVENTIONAL_MEMORY:
+			res->name = "Conventional Memory";
+			break;
+		case EFI_UNUSABLE_MEMORY:
+			res->name = "Unusable Memory";
+			break;
+		case EFI_ACPI_RECLAIM_MEMORY:
+			res->name = "ACPI Reclaim";
+			break;
+		case EFI_ACPI_MEMORY_NVS:
+			res->name = "ACPI NVS";
+			break;
+		case EFI_MEMORY_MAPPED_IO:
+			res->name = "Memory Mapped IO";
+			break;
+		case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
+			res->name = "Memory Mapped IO Port Space";
+			break;
+		default:
+			res->name = "Reserved";
+			break;
+		}
+		res->start = md->phys_addr;
+		res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1);
+		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+		if (request_resource(&iomem_resource, res) < 0)
+			printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n",
+				res->name, res->start, res->end);
+		/*
+		 * We don't know which region contains kernel data so we try
+		 * it repeatedly and let the resource manager test it.
+		 */
+		if (md->type == EFI_CONVENTIONAL_MEMORY) {
+			request_resource(res, code_resource);
+			request_resource(res, data_resource);
+		}
+	}
+}
+
+/*
+ * Convenience functions to obtain memory types and attributes
+ */
+
+u32 efi_mem_type(unsigned long phys_addr)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		if ((md->phys_addr <= phys_addr) && (phys_addr <
+			(md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
+			return md->type;
+	}
+	return 0;
+}
+
+u64 efi_mem_attributes(unsigned long phys_addr)
+{
+	efi_memory_desc_t *md;
+	int i;
+
+	for (i = 0; i < memmap.nr_map; i++) {
+		md = &memmap.map[i];
+		if ((md->phys_addr <= phys_addr) && (phys_addr <
+			(md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
+			return md->attribute;
+	}
+	return 0;
+}
diff -Nru a/arch/i386/kernel/efi_stub.S b/arch/i386/kernel/efi_stub.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/i386/kernel/efi_stub.S	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,124 @@
+/*
+ * EFI call stub for IA32.
+ *
+ * This stub allows us to make EFI calls in physical mode with interrupts
+ * turned off.
+ */
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+
+/*
+ * efi_call_phys(void *, ...) is a function with variable parameters.
+ * All the callers of this function assure that all the parameters are 4-bytes.
+ */
+
+/*
+ * In gcc calling convention, EBX, ESP, EBP, ESI and EDI are all callee save.
+ * So we'd better save all of them at the beginning of this function and restore
+ * at the end no matter how many we use, because we can not assure EFI runtime
+ * service functions will comply with gcc calling convention, too.
+ */
+
+.text
+ENTRY(efi_call_phys)
+	/*
+	 * 0. The function can only be called in Linux kernel. So CS has been
+	 * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found
+	 * the values of these registers are the same. And, the corresponding
+	 * GDT entries are identical. So I will do nothing about segment reg
+	 * and GDT, but change GDT base register in prelog and epilog.
+	 */
+
+	/*
+	 * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET.
+	 * But to make it smoothly switch from virtual mode to flat mode.
+	 * The mapping of lower virtual memory has been created in prelog and
+	 * epilog.
+	 */
+	movl	$1f, %edx
+	subl	$__PAGE_OFFSET, %edx
+	jmp	*%edx
+1:
+
+	/*
+	 * 2. Now on the top of stack is the return
+	 * address in the caller of efi_call_phys(), then parameter 1,
+	 * parameter 2, ..., param n. To make things easy, we save the return
+	 * address of efi_call_phys in a global variable.
+	 */
+	popl	%edx
+	movl	%edx, saved_return_addr
+	/* get the function pointer into ECX*/
+	popl	%ecx
+	movl	%ecx, efi_rt_function_ptr
+	movl	$2f, %edx
+	subl	$__PAGE_OFFSET, %edx
+	pushl	%edx
+
+	/*
+	 * 3. Clear PG bit in %CR0.
+	 */
+	movl	%cr0, %edx
+	andl	$0x7fffffff, %edx
+	movl	%edx, %cr0
+	jmp	1f
+1:
+
+	/*
+	 * 4. Adjust stack pointer.
+	 */
+	subl	$__PAGE_OFFSET, %esp
+
+	/*
+	 * 5. Call the physical function.
+	 */
+	jmp	*%ecx
+
+2:
+	/*
+	 * 6. After EFI runtime service returns, control will return to
+	 * following instruction. We'd better readjust stack pointer first.
+	 */
+	addl	$__PAGE_OFFSET, %esp
+
+	/*
+	 * 7. Restore PG bit
+	 */
+	movl	%cr0, %edx
+	orl	$0x80000000, %edx
+	movl	%edx, %cr0
+	jmp	1f
+1:
+	/*
+	 * 8. Now restore the virtual mode from flat mode by
+	 * adding EIP with PAGE_OFFSET.
+	 */
+	movl	$1f, %edx
+	jmp	*%edx
+1:
+
+	/*
+	 * 9. Balance the stack. And because EAX contain the return value,
+	 * we'd better not clobber it.
+	 */
+	leal	efi_rt_function_ptr, %edx
+	movl	(%edx), %ecx
+	pushl	%ecx
+
+	/*
+	 * 10. Push the saved return address onto the stack and return.
+	 */
+	leal	saved_return_addr, %edx
+	movl	(%edx), %ecx
+	pushl	%ecx
+	ret
+.previous
+
+.data
+saved_return_addr:
+	.long 0
+efi_rt_function_ptr:
+	.long 0
diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c
--- a/arch/i386/kernel/i8259.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/i8259.c	Thu Jan  8 23:00:24 2004
@@ -419,8 +419,10 @@
 	 * us. (some of these will be overridden and become
 	 * 'special' SMP interrupts)
 	 */
-	for (i = 0; i < NR_IRQS; i++) {
+	for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
 		int vector = FIRST_EXTERNAL_VECTOR + i;
+		if (i >= NR_IRQS)
+			break;
 		if (vector != SYSCALL_VECTOR) 
 			set_intr_gate(vector, interrupt[i]);
 	}
diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
--- a/arch/i386/kernel/io_apic.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/io_apic.c	Thu Jan  8 23:00:23 2004
@@ -76,6 +76,14 @@
 	int apic, pin, next;
 } irq_2_pin[PIN_MAP_SIZE];
 
+#ifdef CONFIG_PCI_USE_VECTOR
+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
+#define vector_to_irq(vector) 	\
+	(platform_legacy_irq(vector) ? vector : vector_irq[vector])
+#else
+#define vector_to_irq(vector)	(vector)
+#endif
+
 /*
  * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
  * shared ISA-space IRQs, so we have to support them. We are super
@@ -249,7 +257,7 @@
 			clear_IO_APIC_pin(apic, pin);
 }
 
-static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
 {
 	unsigned long flags;
 	int pin;
@@ -288,7 +296,7 @@
 
 extern cpumask_t irq_affinity[NR_IRQS];
 
-static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
+cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
 
 #define IRQBALANCE_CHECK_ARCH -999
 static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
@@ -670,13 +678,11 @@
 
 __setup("noirqbalance", irqbalance_disable);
 
-static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
-
 static inline void move_irq(int irq)
 {
 	/* note - we hold the desc->lock */
 	if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
-		set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
+		set_ioapic_affinity_irq(irq, pending_irq_balance_cpumask[irq]);
 		cpus_clear(pending_irq_balance_cpumask[irq]);
 	}
 }
@@ -853,7 +859,7 @@
 			if (irq_entry == -1)
 				continue;
 			irq = pin_2_irq(irq_entry, ioapic, pin);
-			set_ioapic_affinity(irq, mask);
+			set_ioapic_affinity_irq(irq, mask);
 		}
 
 	}
@@ -1141,7 +1147,8 @@
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
 u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 
-static int __init assign_irq_vector(int irq)
+#ifndef CONFIG_PCI_USE_VECTOR
+int __init assign_irq_vector(int irq)
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
 	BUG_ON(irq >= NR_IRQ_VECTORS);
@@ -1158,11 +1165,36 @@
 	}
 
 	IO_APIC_VECTOR(irq) = current_vector;
+
 	return current_vector;
 }
+#endif
 
-static struct hw_interrupt_type ioapic_level_irq_type;
-static struct hw_interrupt_type ioapic_edge_irq_type;
+static struct hw_interrupt_type ioapic_level_type;
+static struct hw_interrupt_type ioapic_edge_type;
+
+#define IOAPIC_AUTO	-1
+#define IOAPIC_EDGE	0
+#define IOAPIC_LEVEL	1
+
+static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
+{
+	if (use_pci_vector() && !platform_legacy_irq(irq)) {
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[vector].handler = &ioapic_level_type;
+		else
+			irq_desc[vector].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[vector]);
+	} else	{
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[irq].handler = &ioapic_level_type;
+		else
+			irq_desc[irq].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[irq]);
+	}
+}
 
 void __init setup_IO_APIC_irqs(void)
 {
@@ -1220,13 +1252,7 @@
 		if (IO_APIC_IRQ(irq)) {
 			vector = assign_irq_vector(irq);
 			entry.vector = vector;
-
-			if (IO_APIC_irq_trigger(irq))
-				irq_desc[irq].handler = &ioapic_level_irq_type;
-			else
-				irq_desc[irq].handler = &ioapic_edge_irq_type;
-
-			set_intr_gate(vector, interrupt[irq]);
+			ioapic_register_intr(irq, vector, IOAPIC_AUTO);
 		
 			if (!apic && (irq < 16))
 				disable_8259A_irq(irq);
@@ -1273,7 +1299,7 @@
 	 * The timer IRQ doesn't have to know that behind the
 	 * scene we have a 8259A-master in AEOI mode ...
 	 */
-	irq_desc[0].handler = &ioapic_edge_irq_type;
+	irq_desc[0].handler = &ioapic_edge_type;
 
 	/*
 	 * Add it to the IO-APIC irq-routing table:
@@ -1763,9 +1789,6 @@
  * that was delayed but this is now handled in the device
  * independent code.
  */
-#define enable_edge_ioapic_irq unmask_IO_APIC_irq
-
-static void disable_edge_ioapic_irq (unsigned int irq) { /* nothing */ }
 
 /*
  * Starting up a edge-triggered IO-APIC interrupt is
@@ -1776,7 +1799,6 @@
  * This is not complete - we should be able to fake
  * an edge even if it isn't on the 8259A...
  */
-
 static unsigned int startup_edge_ioapic_irq(unsigned int irq)
 {
 	int was_pending = 0;
@@ -1794,8 +1816,6 @@
 	return was_pending;
 }
 
-#define shutdown_edge_ioapic_irq	disable_edge_ioapic_irq
-
 /*
  * Once we have recorded IRQ_PENDING already, we can mask the
  * interrupt for real. This prevents IRQ storms from unhandled
@@ -1810,9 +1830,6 @@
 	ack_APIC_irq();
 }
 
-static void end_edge_ioapic_irq (unsigned int i) { /* nothing */ }
-
-
 /*
  * Level triggered interrupts can just be masked,
  * and shutting down and starting up the interrupt
@@ -1834,10 +1851,6 @@
 	return 0; /* don't check for pending */
 }
 
-#define shutdown_level_ioapic_irq	mask_IO_APIC_irq
-#define enable_level_ioapic_irq		unmask_IO_APIC_irq
-#define disable_level_ioapic_irq	mask_IO_APIC_irq
-
 static void end_level_ioapic_irq (unsigned int irq)
 {
 	unsigned long v;
@@ -1864,6 +1877,7 @@
  * The idea is from Manfred Spraul.  --macro
  */
 	i = IO_APIC_VECTOR(irq);
+
 	v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
 
 	ack_APIC_irq();
@@ -1898,7 +1912,57 @@
 	}
 }
 
-static void mask_and_ack_level_ioapic_irq (unsigned int irq) { /* nothing */ }
+#ifdef CONFIG_PCI_USE_VECTOR
+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_edge_ioapic_irq(irq);
+}
+
+static void ack_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	ack_edge_ioapic_irq(irq);
+}
+
+static unsigned int startup_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_level_ioapic_irq (irq);
+}
+
+static void end_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	end_level_ioapic_irq(irq);
+}
+
+static void mask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	mask_IO_APIC_irq(irq);
+}
+
+static void unmask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	unmask_IO_APIC_irq(irq);
+}
+
+static void set_ioapic_affinity_vector (unsigned int vector,
+					cpumask_t cpu_mask)
+{
+	int irq = vector_to_irq(vector);
+
+	set_ioapic_affinity_irq(irq, cpu_mask);
+}
+#endif
 
 /*
  * Level and edge triggered IO-APIC interrupts need different handling,
@@ -1908,26 +1972,25 @@
  * edge-triggered handler, without risking IRQ storms and other ugly
  * races.
  */
-
-static struct hw_interrupt_type ioapic_edge_irq_type = {
+static struct hw_interrupt_type ioapic_edge_type = {
 	.typename 	= "IO-APIC-edge",
-	.startup 	= startup_edge_ioapic_irq,
-	.shutdown 	= shutdown_edge_ioapic_irq,
-	.enable 	= enable_edge_ioapic_irq,
-	.disable 	= disable_edge_ioapic_irq,
-	.ack 		= ack_edge_ioapic_irq,
-	.end 		= end_edge_ioapic_irq,
+	.startup 	= startup_edge_ioapic,
+	.shutdown 	= shutdown_edge_ioapic,
+	.enable 	= enable_edge_ioapic,
+	.disable 	= disable_edge_ioapic,
+	.ack 		= ack_edge_ioapic,
+	.end 		= end_edge_ioapic,
 	.set_affinity 	= set_ioapic_affinity,
 };
 
-static struct hw_interrupt_type ioapic_level_irq_type = {
+static struct hw_interrupt_type ioapic_level_type = {
 	.typename 	= "IO-APIC-level",
-	.startup 	= startup_level_ioapic_irq,
-	.shutdown 	= shutdown_level_ioapic_irq,
-	.enable 	= enable_level_ioapic_irq,
-	.disable 	= disable_level_ioapic_irq,
-	.ack 		= mask_and_ack_level_ioapic_irq,
-	.end 		= end_level_ioapic_irq,
+	.startup 	= startup_level_ioapic,
+	.shutdown 	= shutdown_level_ioapic,
+	.enable 	= enable_level_ioapic,
+	.disable 	= disable_level_ioapic,
+	.ack 		= mask_and_ack_level_ioapic,
+	.end 		= end_level_ioapic,
 	.set_affinity 	= set_ioapic_affinity,
 };
 
@@ -1947,7 +2010,13 @@
 	 * 0x80, because int 0x80 is hm, kind of importantish. ;)
 	 */
 	for (irq = 0; irq < NR_IRQS ; irq++) {
-		if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq)) {
+		int tmp = irq;
+		if (use_pci_vector()) {
+			if (!platform_legacy_irq(tmp))
+				if ((tmp = vector_to_irq(tmp)) == -1)
+					continue;
+		}
+		if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
 			/*
 			 * Hmm.. We don't have an entry for this,
 			 * so default to an old-fashioned 8259
@@ -2379,10 +2448,12 @@
 		"IRQ %d Mode:%i Active:%i)\n", ioapic, 
 		mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);
 
+ 	if (use_pci_vector() && !platform_legacy_irq(irq))
+		irq = IO_APIC_VECTOR(irq);
 	if (edge_level) {
-	irq_desc[irq].handler = &ioapic_level_irq_type;
+		irq_desc[irq].handler = &ioapic_level_type;
 	} else {
-		irq_desc[irq].handler = &ioapic_edge_irq_type;
+		irq_desc[irq].handler = &ioapic_edge_type;
 	}
 
 	set_intr_gate(entry.vector, interrupt[irq]);
diff -Nru a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
--- a/arch/i386/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -138,17 +138,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -170,28 +172,32 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", nmi_count(j));
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_printf(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", nmi_count(j));
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_printf(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_printf(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
+
+
+
 #ifdef CONFIG_SMP
 inline void synchronize_irq(unsigned int irq)
 {
@@ -505,6 +511,20 @@
 	return 1;
 }
 
+int can_request_irq(unsigned int irq, unsigned long irqflags)
+{
+	struct irqaction *action;
+
+	if (irq >= NR_IRQS)
+		return 0;
+	action = irq_desc[irq].action;
+	if (action) {
+		if (irqflags & action->flags & SA_SHIRQ)
+			action = NULL;
+	}
+	return !action;
+}
+
 /**
  *	request_irq - allocate an interrupt line
  *	@irq: Interrupt line to allocate
@@ -898,48 +918,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value(const char __user *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
@@ -949,20 +927,10 @@
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -975,7 +943,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
@@ -1000,10 +968,11 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
@@ -1013,7 +982,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/mpparse.c	Thu Jan  8 23:00:23 2004
@@ -1147,15 +1147,19 @@
 		if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
 			printk(KERN_DEBUG "Pin %d-%d already programmed\n",
 				mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-			entry->irq = irq;
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
+ 			entry->irq = irq;
 			continue;
 		}
 
 		mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
 
-		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low))
-			entry->irq = irq;
-
+		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low)) {
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
+ 			entry->irq = irq;
+ 		}
 		printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n",
 			entry->id.segment, entry->id.bus, 
 			entry->id.device, ('A' + entry->pin), 
diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
--- a/arch/i386/kernel/process.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/process.c	Thu Jan  8 23:00:23 2004
@@ -507,7 +507,7 @@
 	/*
 	 * Reload esp0, LDT and the page table pointer:
 	 */
-	load_esp0(tss, next->esp0);
+	load_esp0(tss, next);
 
 	/*
 	 * Load the per-thread Thread-Local Storage descriptor.
diff -Nru a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c
--- a/arch/i386/kernel/reboot.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/reboot.c	Thu Jan  8 23:00:23 2004
@@ -8,6 +8,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/mc146818rtc.h>
+#include <linux/efi.h>
 #include <asm/uaccess.h>
 #include <asm/apic.h>
 #include "mach_reboot.h"
@@ -263,7 +264,12 @@
 	disable_IO_APIC();
 #endif
 
-	if(!reboot_thru_bios) {
+	if (!reboot_thru_bios) {
+		if (efi_enabled) {
+			efi.reset_system(EFI_RESET_COLD, EFI_SUCCESS, 0, 0);
+			__asm__ __volatile__("lidt %0": :"m" (no_idt));
+			__asm__ __volatile__("int3");
+		}
 		/* rebooting needs to touch the page at absolute addr 0 */
 		*((unsigned short *)__va(0x472)) = reboot_mode;
 		for (;;) {
@@ -273,6 +279,8 @@
 			__asm__ __volatile__("int3");
 		}
 	}
+	if (efi_enabled)
+		efi.reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, 0);
 
 	machine_real_restart(jump_to_bios, sizeof(jump_to_bios));
 }
@@ -287,6 +295,8 @@
 
 void machine_power_off(void)
 {
+	if (efi_enabled)
+		efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, 0);
 	if (pm_power_off)
 		pm_power_off();
 }
diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/setup.c	Thu Jan  8 23:00:24 2004
@@ -36,6 +36,8 @@
 #include <linux/root_dev.h>
 #include <linux/highmem.h>
 #include <linux/module.h>
+#include <linux/efi.h>
+#include <linux/init.h>
 #include <video/edid.h>
 #include <asm/e820.h>
 #include <asm/mpspec.h>
@@ -56,6 +58,10 @@
  * Machine setup..
  */
 
+#ifdef CONFIG_EFI
+int efi_enabled = 0;
+#endif
+
 /* cpu data as detected by the assembly code in head.S */
 struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
 /* common cpu data for all cpus */
@@ -144,6 +150,20 @@
 	unsigned long long current_addr = 0;
 	int i;
 
+	if (efi_enabled) {
+		for (i = 0; i < memmap.nr_map; i++) {
+			current_addr = memmap.map[i].phys_addr +
+				       (memmap.map[i].num_pages << 12);
+			if (memmap.map[i].type == EFI_CONVENTIONAL_MEMORY) {
+				if (current_addr >= size) {
+					memmap.map[i].num_pages -=
+						(((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
+					memmap.nr_map = i + 1;
+					return;
+				}
+			}
+		}
+	}
 	for (i = 0; i < e820.nr_map; i++) {
 		if (e820.map[i].type == E820_RAM) {
 			current_addr = e820.map[i].addr + e820.map[i].size;
@@ -159,17 +179,21 @@
 static void __init add_memory_region(unsigned long long start,
                                   unsigned long long size, int type)
 {
-	int x = e820.nr_map;
+	int x;
 
-	if (x == E820MAX) {
-	    printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-	    return;
-	}
+	if (!efi_enabled) {
+       		x = e820.nr_map;
 
-	e820.map[x].addr = start;
-	e820.map[x].size = size;
-	e820.map[x].type = type;
-	e820.nr_map++;
+		if (x == E820MAX) {
+		    printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
+		    return;
+		}
+
+		e820.map[x].addr = start;
+		e820.map[x].size = size;
+		e820.map[x].type = type;
+		e820.nr_map++;
+	}
 } /* add_memory_region */
 
 #define E820_DEBUG	1
@@ -446,7 +470,6 @@
 static void __init setup_memory_region(void)
 {
 	char *who = machine_specific_memory_setup();
-
 	printk(KERN_INFO "BIOS-provided physical RAM map:\n");
 	print_memory_map(who);
 } /* setup_memory_region */
@@ -584,6 +607,23 @@
 }
 
 /*
+ * Callback for efi_memory_walk.
+ */
+static int __init
+efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
+{
+	unsigned long *max_pfn = arg, pfn;
+
+	if (start < end) {
+		pfn = PFN_UP(end -1);
+		if (pfn > *max_pfn)
+			*max_pfn = pfn;
+	}
+	return 0;
+}
+
+
+/*
  * Find the highest page frame number we have available
  */
 void __init find_max_pfn(void)
@@ -591,6 +631,11 @@
 	int i;
 
 	max_pfn = 0;
+	if (efi_enabled) {
+		efi_memmap_walk(efi_find_max_pfn, &max_pfn);
+		return;
+	}
+
 	for (i = 0; i < e820.nr_map; i++) {
 		unsigned long start, end;
 		/* RAM? */
@@ -665,6 +710,25 @@
 }
 
 #ifndef CONFIG_DISCONTIGMEM
+
+/*
+ * Free all available memory for boot time allocation.  Used
+ * as a callback function by efi_memory_walk()
+ */
+
+static int __init
+free_available_memory(unsigned long start, unsigned long end, void *arg)
+{
+	/* check max_low_pfn */
+	if (start >= ((max_low_pfn + 1) << PAGE_SHIFT))
+		return 0;
+	if (end >= ((max_low_pfn + 1) << PAGE_SHIFT))
+		end = (max_low_pfn + 1) << PAGE_SHIFT;
+	if (start < end)
+		free_bootmem(start, end - start);
+
+	return 0;
+}
 /*
  * Register fully available low RAM pages with the bootmem allocator.
  */
@@ -672,6 +736,10 @@
 {
 	int i;
 
+	if (efi_enabled) {
+		efi_memmap_walk(free_available_memory, NULL);
+		return;
+	}
 	for (i = 0; i < e820.nr_map; i++) {
 		unsigned long curr_pfn, last_pfn, size;
 		/*
@@ -799,9 +867,9 @@
  * Request address space for all standard RAM and ROM resources
  * and also for regions reported as reserved by the e820.
  */
-static void __init register_memory(unsigned long max_low_pfn)
+static void __init
+legacy_init_iomem_resources(struct resource *code_resource, struct resource *data_resource)
 {
-	unsigned long low_mem_size;
 	int i;
 
 	probe_roms();
@@ -826,11 +894,26 @@
 			 *  so we try it repeatedly and let the resource manager
 			 *  test it.
 			 */
-			request_resource(res, &code_resource);
-			request_resource(res, &data_resource);
+			request_resource(res, code_resource);
+			request_resource(res, data_resource);
 		}
 	}
+}
 
+/*
+ * Request address space for all standard resources
+ */
+static void __init register_memory(unsigned long max_low_pfn)
+{
+	unsigned long low_mem_size;
+	int i;
+
+	if (efi_enabled)
+		efi_initialize_iomem_resources(&code_resource, &data_resource);
+	else
+		legacy_init_iomem_resources(&code_resource, &data_resource);
+
+ 	 /* EFI systems may still have VGA */
 	request_graphics_resource();
 
 	/* request I/O space for devices used on all i[345]86 PCs */
@@ -950,6 +1033,13 @@
 
 __setup("noreplacement", noreplacement_setup); 
 
+/*
+ * Determine if we were loaded by an EFI loader.  If so, then we have also been
+ * passed the efi memmap, systab, etc., so we should use these data structures
+ * for initialization.  Note, the efi init code path is determined by the
+ * global efi_enabled. This allows the same kernel image to be used on existing
+ * systems (with a traditional BIOS) as well as on EFI systems.
+ */
 void __init setup_arch(char **cmdline_p)
 {
 	unsigned long max_low_pfn;
@@ -958,6 +1048,18 @@
 	pre_setup_arch_hook();
 	early_cpu_init();
 
+	/*
+	 * FIXME: This isn't an official loader_type right
+	 * now but does currently work with elilo.
+	 * If we were configured as an EFI kernel, check to make
+	 * sure that we were loaded correctly from elilo and that
+	 * the system table is valid.  If not, then initialize normally.
+	 */
+#ifdef CONFIG_EFI
+	if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
+		efi_enabled = 1;
+#endif
+
  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
  	drive_info = DRIVE_INFO;
  	screen_info = SCREEN_INFO;
@@ -979,7 +1081,11 @@
 	rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
 #endif
 	ARCH_SETUP
-	setup_memory_region();
+	if (efi_enabled)
+		efi_init();
+	else
+		setup_memory_region();
+
 	copy_edd();
 
 	if (!MOUNT_ROOT_RDONLY)
@@ -1013,6 +1119,8 @@
 #ifdef CONFIG_X86_GENERICARCH
 	generic_apic_probe(*cmdline_p);
 #endif	
+	if (efi_enabled)
+		efi_map_memmap();
 
 	/*
 	 * Parse the ACPI tables for possible boot-time SMP configuration.
@@ -1028,7 +1136,8 @@
 
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
-	conswitchp = &vga_con;
+	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
+		conswitchp = &vga_con;
 #elif defined(CONFIG_DUMMY_CONSOLE)
 	conswitchp = &dummy_con;
 #endif
diff -Nru a/arch/i386/kernel/summit.c b/arch/i386/kernel/summit.c
--- a/arch/i386/kernel/summit.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/summit.c	Thu Jan  8 23:00:24 2004
@@ -29,86 +29,85 @@
 #include <linux/mm.h>
 #include <linux/init.h>
 #include <asm/io.h>
-#include <mach_mpparse.h>
+#include <asm/mach-summit/mach_mpparse.h>
 
-#ifdef CONFIG_NUMA
-static void __init setup_pci_node_map_for_wpeg(int wpeg_num, struct rio_table_hdr *rth, 
-		struct scal_detail **scal_nodes, struct rio_detail **rio_nodes){
-	int twst_num = 0, node = 0, first_bus = 0;
-	int i, bus, num_busses;
-
-	for(i = 0; i < rth->num_rio_dev; i++){
-		if (rio_nodes[i]->node_id == rio_nodes[wpeg_num]->owner_id){
-			twst_num = rio_nodes[i]->owner_id;
+static struct rio_table_hdr *rio_table_hdr __initdata;
+static struct scal_detail   *scal_devs[MAX_NUMNODES] __initdata;
+static struct rio_detail    *rio_devs[MAX_NUMNODES*4] __initdata;
+
+static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus)
+{
+	int twister = 0, node = 0;
+	int i, bus, num_buses;
+
+	for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
+		if (rio_devs[i]->node_id == rio_devs[wpeg_num]->owner_id){
+			twister = rio_devs[i]->owner_id;
 			break;
 		}
 	}
-	if (i == rth->num_rio_dev){
-		printk("%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
-		return;
+	if (i == rio_table_hdr->num_rio_dev){
+		printk(KERN_ERR "%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	for(i = 0; i < rth->num_scal_dev; i++){
-		if (scal_nodes[i]->node_id == twst_num){
-			node = scal_nodes[i]->node_id;
+	for(i = 0; i < rio_table_hdr->num_scal_dev; i++){
+		if (scal_devs[i]->node_id == twister){
+			node = scal_devs[i]->node_id;
 			break;
 		}
 	}
-	if (i == rth->num_scal_dev){
-		printk("%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
-		return;
+	if (i == rio_table_hdr->num_scal_dev){
+		printk(KERN_ERR "%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	switch (rio_nodes[wpeg_num]->type){
+	switch (rio_devs[wpeg_num]->type){
 	case CompatWPEG:
-		/* The Compatability Winnipeg controls the legacy busses
-		   (busses 0 & 1), the 66MHz PCI bus [2 slots] (bus 2), 
-		   and the "extra" busses in case a PCI-PCI bridge card is 
-		   used in either slot (busses 3 & 4): total 5 busses. */
-		num_busses = 5;
-		/* The BIOS numbers the busses starting at 1, and in a 
-		   slightly wierd manner.  You'll have to trust that 
-		   the math used below to determine the number of the 
-		   first bus works. */
-		first_bus = (rio_nodes[wpeg_num]->first_slot - 1) * 2;
+		/* The Compatability Winnipeg controls the 2 legacy buses,
+		 * the 66MHz PCI bus [2 slots] and the 2 "extra" buses in case
+		 * a PCI-PCI bridge card is used in either slot: total 5 buses.
+		 */
+		num_buses = 5;
 		break;
 	case AltWPEG:
-		/* The Alternate/Secondary Winnipeg controls the 1st 133MHz 
-		   bus [1 slot] & its "extra" bus (busses 0 & 1), the 2nd 
-		   133MHz bus [1 slot] & its "extra" bus (busses 2 & 3), the 
-		   100MHz bus [2 slots] (bus 4), and the "extra" busses for 
-		   the 2 100MHz slots (busses 5 & 6): total 7 busses. */
-		num_busses = 7;
-		first_bus = (rio_nodes[wpeg_num]->first_slot * 2) - 1;
+		/* The Alternate Winnipeg controls the 2 133MHz buses [1 slot
+		 * each], their 2 "extra" buses, the 100MHz bus [2 slots] and
+		 * the "extra" buses for each of those slots: total 7 buses.
+		 */
+		num_buses = 7;
 		break;
 	case LookOutAWPEG:
 	case LookOutBWPEG:
-		printk("%s: LookOut Winnipegs not supported yet!\n", __FUNCTION__);
-		return;
+		/* A Lookout Winnipeg controls 3 100MHz buses [2 slots each]
+		 * & the "extra" buses for each of those slots: total 9 buses.
+		 */
+		num_buses = 9;
+		break;
 	default:
-		printk("%s: Unsupported Winnipeg type!\n", __FUNCTION__);
-		return;
+		printk(KERN_INFO "%s: Unsupported Winnipeg type!\n", __FUNCTION__);
+		return last_bus;
 	}
 
-	for(bus = first_bus; bus < first_bus + num_busses; bus++)
+	for(bus = last_bus; bus < last_bus + num_buses; bus++)
 		mp_bus_id_to_node[bus] = node;
+	return bus;
 }
 
-static int __init build_detail_arrays(struct rio_table_hdr *rth,
-		struct scal_detail **sd, struct rio_detail **rd){
+static int __init build_detail_arrays(void)
+{
 	unsigned long ptr;
 	int i, scal_detail_size, rio_detail_size;
 
-	if ((rth->num_scal_dev > MAX_NUMNODES) ||
-	    (rth->num_rio_dev > MAX_NUMNODES * 2)){
-		printk("%s: MAX_NUMNODES too low!  Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rth->num_scal_dev);
-		return 1;
+	if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){
+		printk(KERN_WARNING "%s: MAX_NUMNODES too low!  Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rio_table_hdr->num_scal_dev);
+		return 0;
 	}
 
-	switch (rth->version){
+	switch (rio_table_hdr->version){
 	default:
-		printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version);
-		return 1;
+		printk(KERN_WARNING "%s: Invalid Rio Grande Table Version: %d\n", __FUNCTION__, rio_table_hdr->version);
+		return 0;
 	case 2:
 		scal_detail_size = 11;
 		rio_detail_size = 13;
@@ -119,32 +118,27 @@
 		break;
 	}
 
-	ptr = (unsigned long)rth + 3;
-	for(i = 0; i < rth->num_scal_dev; i++)
-		sd[i] = (struct scal_detail *)(ptr + (scal_detail_size * i));
-
-	ptr += scal_detail_size * rth->num_scal_dev;
-	for(i = 0; i < rth->num_rio_dev; i++)
-		rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i));
+	ptr = (unsigned long)rio_table_hdr + 3;
+	for(i = 0; i < rio_table_hdr->num_scal_dev; i++, ptr += scal_detail_size)
+		scal_devs[i] = (struct scal_detail *)ptr;
 
-	return 0;
+	for(i = 0; i < rio_table_hdr->num_rio_dev; i++, ptr += rio_detail_size)
+		rio_devs[i] = (struct rio_detail *)ptr;
+
+	return 1;
 }
 
 void __init setup_summit(void)
 {
-	struct rio_table_hdr	*rio_table_hdr = NULL;
-	struct scal_detail	*scal_devs[MAX_NUMNODES];
-	struct rio_detail	*rio_devs[MAX_NUMNODES*2];
 	unsigned long		ptr;
 	unsigned short		offset;
-	int			i;
-
-	memset(mp_bus_id_to_node, -1, sizeof(mp_bus_id_to_node));
+	int			i, next_wpeg, next_bus = 0;
 
 	/* The pointer to the EBDA is stored in the word @ phys 0x40E(40:0E) */
 	ptr = *(unsigned short *)phys_to_virt(0x40Eul);
 	ptr = (unsigned long)phys_to_virt(ptr << 4);
 
+	rio_table_hdr = NULL;
 	offset = 0x180;
 	while (offset){
 		/* The block id is stored in the 2nd word */
@@ -157,16 +151,30 @@
 		offset = *((unsigned short *)(ptr + offset));
 	}
 	if (!rio_table_hdr){
-		printk("%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
+		printk(KERN_ERR "%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
 		return;
 	}
 
-	if (build_detail_arrays(rio_table_hdr, scal_devs, rio_devs))
+	if (!build_detail_arrays())
 		return;
 
-	for(i = 0; i < rio_table_hdr->num_rio_dev; i++)
-		if (is_WPEG(rio_devs[i]->type))
-			/* It's a Winnipeg, it's got PCI Busses */
-			setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs);
+	/* The first Winnipeg we're looking for has an index of 0 */
+	next_wpeg = 0;
+	do {
+		for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
+			if (is_WPEG(rio_devs[i]) && rio_devs[i]->WP_index == next_wpeg){
+				/* It's the Winnipeg we're looking for! */
+				next_bus = setup_pci_node_map_for_wpeg(i, next_bus);
+				next_wpeg++;
+				break;
+			}
+		}
+		/*
+		 * If we go through all Rio devices and don't find one with
+		 * the next index, it means we've found all the Winnipegs,
+		 * and thus all the PCI buses.
+		 */
+		if (i == rio_table_hdr->num_rio_dev)
+			next_wpeg = 0;
+	} while (next_wpeg != 0);
 }
-#endif /* CONFIG_NUMA */
diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/time.c	Thu Jan  8 23:00:24 2004
@@ -44,6 +44,7 @@
 #include <linux/module.h>
 #include <linux/sysdev.h>
 #include <linux/bcd.h>
+#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -94,7 +95,7 @@
 {
 	unsigned long seq;
 	unsigned long usec, sec;
-	unsigned long max_ntp_tick = tick_usec - tickadj;
+	unsigned long max_ntp_tick;
 
 	do {
 		unsigned long lost;
@@ -110,13 +111,14 @@
 		 * Better to lose some accuracy than have time go backwards..
 		 */
 		if (unlikely(time_adjust < 0)) {
+			max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
 			usec = min(usec, max_ntp_tick);
 
 			if (lost)
 				usec += lost * max_ntp_tick;
 		}
 		else if (unlikely(lost))
-			usec += lost * tick_usec;
+			usec += lost * (USEC_PER_SEC / HZ);
 
 		sec = xtime.tv_sec;
 		usec += (xtime.tv_nsec / 1000);
@@ -174,7 +176,10 @@
 
 	/* gets recalled with irq locally disabled */
 	spin_lock(&rtc_lock);
-	retval = mach_set_rtc_mmss(nowtime);
+	if (efi_enabled)
+		retval = efi_set_rtc_mmss(nowtime);
+	else
+		retval = mach_set_rtc_mmss(nowtime);
 	spin_unlock(&rtc_lock);
 
 	return retval;
@@ -232,7 +237,13 @@
 			>= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
 	    (xtime.tv_nsec / 1000)
 			<= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
+		/* horrible...FIXME */
+		if (efi_enabled) {
+	 		if (efi_set_rtc_mmss(xtime.tv_sec) == 0)
+				last_rtc_update = xtime.tv_sec;
+			else
+				last_rtc_update = xtime.tv_sec - 600;
+		} else if (set_rtc_mmss(xtime.tv_sec) == 0)
 			last_rtc_update = xtime.tv_sec;
 		else
 			last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
@@ -286,7 +297,10 @@
 
 	spin_lock(&rtc_lock);
 
-	retval = mach_get_cmos_time();
+	if (efi_enabled)
+		retval = efi_get_time();
+	else
+		retval = mach_get_cmos_time();
 
 	spin_unlock(&rtc_lock);
 
@@ -297,6 +311,7 @@
 	set_kset_name("pit"),
 };
 
+
 /* XXX this driverfs stuff should probably go elsewhere later -john */
 static struct sys_device device_i8253 = {
 	.id	= 0,
@@ -328,6 +343,8 @@
 	}
 
 	cur_timer = select_timer();
+	printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
 	time_init_hook();
 }
 #endif
@@ -344,12 +361,13 @@
 		return;
 	}
 #endif
-
 	xtime.tv_sec = get_cmos_time();
 	wall_to_monotonic.tv_sec = -xtime.tv_sec;
 	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
 	wall_to_monotonic.tv_nsec = -xtime.tv_nsec;
 
 	cur_timer = select_timer();
+	printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
+
 	time_init_hook();
 }
diff -Nru a/arch/i386/kernel/timers/timer_cyclone.c b/arch/i386/kernel/timers/timer_cyclone.c
--- a/arch/i386/kernel/timers/timer_cyclone.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/timers/timer_cyclone.c	Thu Jan  8 23:00:24 2004
@@ -71,7 +71,7 @@
 	lost = delta/(1000000/HZ);
 	delay = delta%(1000000/HZ);
 	if (lost >= 2)
-		jiffies += lost-1;
+		jiffies_64 += lost-1;
 	
 	/* update the monotonic base value */
 	this_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low;
@@ -88,7 +88,7 @@
 	 * usec delta is > 90% # of usecs/tick)
 	 */
 	if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-		jiffies++;
+		jiffies_64++;
 }
 
 static unsigned long get_offset_cyclone(void)
@@ -253,6 +253,7 @@
 
 /* cyclone timer_opts struct */
 struct timer_opts timer_cyclone = {
+	.name = "cyclone",
 	.init = init_cyclone, 
 	.mark_offset = mark_offset_cyclone, 
 	.get_offset = get_offset_cyclone,
diff -Nru a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c
--- a/arch/i386/kernel/timers/timer_hpet.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/timers/timer_hpet.c	Thu Jan  8 23:00:24 2004
@@ -108,7 +108,7 @@
 	offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
 	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
 		int lost_ticks = (offset - hpet_last) / hpet_tick;
-		jiffies += lost_ticks;
+		jiffies_64 += lost_ticks;
 	}
 	hpet_last = offset;
 
@@ -178,6 +178,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_hpet = {
+	.name = 		"hpet",
 	.init =			init_hpet,
 	.mark_offset =		mark_offset_hpet,
 	.get_offset =		get_offset_hpet,
diff -Nru a/arch/i386/kernel/timers/timer_none.c b/arch/i386/kernel/timers/timer_none.c
--- a/arch/i386/kernel/timers/timer_none.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/timers/timer_none.c	Thu Jan  8 23:00:24 2004
@@ -36,6 +36,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_none = {
+	.name = 	"none",
 	.init =		init_none, 
 	.mark_offset =	mark_offset_none, 
 	.get_offset =	get_offset_none,
diff -Nru a/arch/i386/kernel/timers/timer_pit.c b/arch/i386/kernel/timers/timer_pit.c
--- a/arch/i386/kernel/timers/timer_pit.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/timers/timer_pit.c	Thu Jan  8 23:00:24 2004
@@ -149,6 +149,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_pit = {
+	.name = 	"pit",
 	.init =		init_pit, 
 	.mark_offset =	mark_offset_pit, 
 	.get_offset =	get_offset_pit,
diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c
--- a/arch/i386/kernel/timers/timer_tsc.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/kernel/timers/timer_tsc.c	Thu Jan  8 23:00:24 2004
@@ -30,7 +30,6 @@
 int tsc_disable __initdata = 0;
 
 extern spinlock_t i8253_lock;
-extern volatile unsigned long jiffies;
 
 static int use_tsc;
 /* Number of usecs that the last interrupt was delayed */
@@ -141,7 +140,8 @@
 #ifndef CONFIG_NUMA
 	if (!use_tsc)
 #endif
-		return (unsigned long long)jiffies * (1000000000 / HZ);
+		/* no locking but a rare wrong value is not a big deal */
+		return jiffies_64 * (1000000000 / HZ);
 
 	/* Read the Time Stamp Counter */
 	rdtscll(this_offset);
@@ -184,6 +184,18 @@
 
 	count = inb_p(PIT_CH0);    /* read the latched count */
 	count |= inb(PIT_CH0) << 8;
+
+	/*
+	 * VIA686a test code... reset the latch if count > max + 1
+	 * from timer_pit.c - cjb
+	 */
+	if (count > LATCH) {
+		outb_p(0x34, PIT_MODE);
+		outb_p(LATCH & 0xff, PIT_CH0);
+		outb(LATCH >> 8, PIT_CH0);
+		count = LATCH - 1;
+	}
+
 	spin_unlock(&i8253_lock);
 
 	if (pit_latch_buggy) {
@@ -215,7 +227,7 @@
 	lost = delta/(1000000/HZ);
 	delay = delta%(1000000/HZ);
 	if (lost >= 2) {
-		jiffies += lost-1;
+		jiffies_64 += lost-1;
 
 		/* sanity check to ensure we're not always losing ticks */
 		if (lost_count++ > 100) {
@@ -241,7 +253,7 @@
 	 * usec delta is > 90% # of usecs/tick)
 	 */
 	if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-		jiffies++;
+		jiffies_64++;
 }
 
 static void delay_tsc(unsigned long loops)
@@ -283,7 +295,7 @@
 	offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
 	if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
 		int lost_ticks = (offset - hpet_last) / hpet_tick;
-		jiffies += lost_ticks;
+		jiffies_64 += lost_ticks;
 	}
 	hpet_last = hpet_current;
 
@@ -306,9 +318,17 @@
 }
 #endif
 
+
 #ifdef CONFIG_CPU_FREQ
+/* If the CPU frequency is scaled, TSC-based delays will need a different
+ * loops_per_jiffy value to function properly. An exception to this
+ * are modern Intel Pentium 4 processors, where the TSC runs at a constant
+ * speed independent of frequency scaling. 
+ */
+
 static unsigned int  ref_freq = 0;
 static unsigned long loops_per_jiffy_ref = 0;
+static unsigned int  variable_tsc = 1;
 
 #ifndef CONFIG_SMP
 static unsigned long fast_gettimeoffset_ref = 0;
@@ -333,12 +353,15 @@
 
 	if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
 	    (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) {
-		cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
+		if (variable_tsc)
+			cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
 #ifndef CONFIG_SMP
 		if (use_tsc) {
-			fast_gettimeoffset_quotient = cpufreq_scale(fast_gettimeoffset_ref, freq->new, ref_freq);
 			cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
-			set_cyc2ns_scale(cpu_khz/1000);
+			if (variable_tsc) {
+				fast_gettimeoffset_quotient = cpufreq_scale(fast_gettimeoffset_ref, freq->new, ref_freq);
+				set_cyc2ns_scale(cpu_khz/1000);
+			}
 		}
 #endif
 	}
@@ -350,7 +373,19 @@
 static struct notifier_block time_cpufreq_notifier_block = {
 	.notifier_call	= time_cpufreq_notifier
 };
-#endif
+
+
+static int __init cpufreq_tsc(void)
+{
+	/* P4 and above CPU TSC freq doesn't change when CPU frequency changes*/
+	if ((boot_cpu_data.x86 >= 15) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
+		variable_tsc = 0;
+
+	return cpufreq_register_notifier(&time_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
+}
+core_initcall(cpufreq_tsc);
+
+#endif 
 
 
 static int __init init_tsc(char* override)
@@ -392,10 +427,6 @@
  	 *	some CPU's have a TSC. Thats never worked and nobody has
  	 *	moaned if you have the only one in the world - you fix it!
  	 */
- 
-#ifdef CONFIG_CPU_FREQ
-	cpufreq_register_notifier(&time_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
-#endif
 
 	count2 = LATCH; /* initialize counter for mark_offset_tsc() */
 
@@ -472,6 +503,7 @@
 
 /* tsc timer_opts struct */
 struct timer_opts timer_tsc = {
+	.name = 	"tsc",
 	.init =		init_tsc,
 	.mark_offset =	mark_offset_tsc, 
 	.get_offset =	get_offset_tsc,
diff -Nru a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c
--- a/arch/i386/kernel/vm86.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/kernel/vm86.c	Thu Jan  8 23:00:23 2004
@@ -124,7 +124,8 @@
 
 	tss = init_tss + get_cpu();
 	current->thread.esp0 = current->thread.saved_esp0;
-	load_esp0(tss, current->thread.esp0);
+	current->thread.sysenter_cs = __KERNEL_CS;
+	load_esp0(tss, &current->thread);
 	current->thread.saved_esp0 = 0;
 	put_cpu();
 
@@ -301,8 +302,10 @@
 	asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));
 
 	tss = init_tss + get_cpu();
-	tss->esp0 = tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
-	disable_sysenter(tss);
+	tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
+	if (cpu_has_sep)
+		tsk->thread.sysenter_cs = 0;
+	load_esp0(tss, &tsk->thread);
 	put_cpu();
 
 	tsk->thread.screen_bitmap = info->screen_bitmap;
diff -Nru a/arch/i386/lib/usercopy.c b/arch/i386/lib/usercopy.c
--- a/arch/i386/lib/usercopy.c	Thu Jan  8 23:00:23 2004
+++ b/arch/i386/lib/usercopy.c	Thu Jan  8 23:00:23 2004
@@ -541,8 +541,10 @@
 				goto survive;
 			}
 
-			if (retval != 1)
+			if (retval != 1) {
+				up_read(&current->mm->mmap_sem);
 		       		break;
+		       	}
 
 			maddr = kmap_atomic(pg, KM_USER0);
 			memcpy(maddr + offset, from, len);
diff -Nru a/arch/i386/mm/highmem.c b/arch/i386/mm/highmem.c
--- a/arch/i386/mm/highmem.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/mm/highmem.c	Thu Jan  8 23:00:24 2004
@@ -30,6 +30,7 @@
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -54,6 +55,7 @@
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -69,6 +71,7 @@
 #endif
 
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 struct page *kmap_atomic_to_page(void *ptr)
diff -Nru a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c
--- a/arch/i386/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
@@ -534,7 +534,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int unused)
+				unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
diff -Nru a/arch/i386/mm/init.c b/arch/i386/mm/init.c
--- a/arch/i386/mm/init.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/mm/init.c	Thu Jan  8 23:00:24 2004
@@ -26,6 +26,7 @@
 #include <linux/bootmem.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
+#include <linux/efi.h>
 
 #include <asm/processor.h>
 #include <asm/system.h>
@@ -165,12 +166,30 @@
 	return 0;
 }
 
+extern int is_available_memory(efi_memory_desc_t *);
+
 static inline int page_is_ram(unsigned long pagenr)
 {
 	int i;
+	unsigned long addr, end;
+
+	if (efi_enabled) {
+		efi_memory_desc_t *md;
+
+		for (i = 0; i < memmap.nr_map; i++) {
+			md = &memmap.map[i];
+			if (!is_available_memory(md))
+				continue;
+			addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
+			end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
+
+			if ((pagenr >= addr) && (pagenr < end))
+				return 1;
+		}
+		return 0;
+	}
 
 	for (i = 0; i < e820.nr_map; i++) {
-		unsigned long addr, end;
 
 		if (e820.map[i].type != E820_RAM)	/* not usable memory */
 			continue;
@@ -388,12 +407,6 @@
 
 void __init test_wp_bit(void)
 {
-	if (cpu_has_pse) {
-		/* Ok, all PSE-capable CPUs are definitely handling the WP bit right. */
-		boot_cpu_data.wp_works_ok = 1;
-		return;
-	}
-
 	printk("Checking if this processor honours the WP bit even in supervisor mode... ");
 
 	/* Any page-aligned address will do, the test is non-destructive */
diff -Nru a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c
--- a/arch/i386/pci/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/i386/pci/irq.c	Thu Jan  8 23:00:24 2004
@@ -455,7 +455,10 @@
 #if 0 /* Let's see what chip this is supposed to be ... */
 	/* We must not touch 440GX even if we have tables. 440GX has
 	   different IRQ routing weirdness */
-	if (pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82440GX, NULL))
+	if (	pci_find_device(PCI_VENDOR_ID_INTEL,
+				PCI_DEVICE_ID_INTEL_82443GX_0, NULL) ||
+		pci_find_device(PCI_VENDOR_ID_INTEL,
+				PCI_DEVICE_ID_INTEL_82443GX_2, NULL))
 		return 0;
 #endif
 
@@ -695,11 +698,6 @@
 	return NULL;
 }
 
-static irqreturn_t pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-{
-	return IRQ_NONE;
-}
-
 static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
 {
 	u8 pin;
@@ -761,11 +759,8 @@
 		for (i = 0; i < 16; i++) {
 			if (!(mask & (1 << i)))
 				continue;
-			if (pirq_penalty[i] < pirq_penalty[newirq] &&
-			    !request_irq(i, pcibios_test_irq_handler, SA_SHIRQ, "pci-test", dev)) {
-				free_irq(i, dev);
+			if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, SA_SHIRQ))
 				newirq = i;
-			}
 		}
 	}
 	DBG(" -> newirq=%d", newirq);
@@ -813,8 +808,10 @@
 		    	if ( dev2->irq && dev2->irq != irq && \
 			(!(pci_probe & PCI_USE_PIRQ_MASK) || \
 			((1 << dev2->irq) & mask)) ) {
+#ifndef CONFIG_PCI_USE_VECTOR
 		    		printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
 				       pci_name(dev2), dev2->irq, irq);
+#endif
 		    		continue;
 		    	}
 			dev2->irq = irq;
@@ -878,6 +875,10 @@
 							bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
 				}
 				if (irq >= 0) {
+					if (use_pci_vector() &&
+						!platform_legacy_irq(irq))
+						irq = IO_APIC_VECTOR(irq);
+
 					printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
 						dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
 					dev->irq = irq;
diff -Nru a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/Kconfig	Thu Jan  8 23:00:24 2004
@@ -164,11 +164,6 @@
 	  The ACPI Sourceforge project may also be of interest:
 	  <http://sf.net/projects/acpi/>
 
-config ACPI_EFI
-	bool
-	depends on !IA64_HP_SIM
-	default y
-
 config ACPI_INTERPRETER
 	bool
 	depends on !IA64_HP_SIM
@@ -375,6 +370,11 @@
 	depends on IA32_SUPPORT
 	default y
 
+config HAVE_DEC_LOCK
+	bool
+	depends on (SMP || PREEMPT)
+	default y
+
 config PERFMON
 	bool "Performance monitor support"
 	help
@@ -394,15 +394,11 @@
 	  To use this option, you have to ensure that the "/proc file system
 	  support" (CONFIG_PROC_FS) is enabled, too.
 
-config IA64_SALINFO
-	tristate "/proc/sal support"
-	help
-	  The /proc/sal directory exports the SAL (system abstraction layer)
-	  feature bits, like whether the platform is subject to ITC drift.  It
-	  is intended to be used by user programs that care about such things.
 
-	  To use this option, you have to ensure that the "/proc file system
-	  support" (CONFIG_PROC_FS) is enabled, too.
+config EFI
+	bool
+	depends on !IA64_HP_SIM
+	default y
 
 config EFI_VARS
 	tristate "/proc/efi/vars support"
@@ -579,6 +575,7 @@
 
 config IA64_GRANULE_64MB
 	bool "64MB"
+	depends on !(IA64_GENERIC || IA64_HP_ZX1)
 
 endchoice
 
diff -Nru a/arch/ia64/Makefile b/arch/ia64/Makefile
--- a/arch/ia64/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/Makefile	Thu Jan  8 23:00:23 2004
@@ -14,7 +14,7 @@
 
 OBJCOPYFLAGS	:= --strip-all
 LDFLAGS_vmlinux	:= -static
-LDFLAGS_MODULE	+= -T arch/ia64/module.lds
+LDFLAGS_MODULE	+= -T $(srctree)/arch/ia64/module.lds
 AFLAGS_KERNEL	:= -mconstant-gp
 EXTRA		:=
 
@@ -25,9 +25,9 @@
 GCC_VERSION=$(shell $(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.')
 GCC_MINOR_VERSION=$(shell $(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f2 -d'.')
 
-GAS_STATUS=$(shell arch/ia64/scripts/check-gas $(CC) $(OBJDUMP))
+GAS_STATUS=$(shell $(srctree)/arch/ia64/scripts/check-gas $(CC) $(OBJDUMP))
 
-CPPFLAGS	+= $(shell arch/ia64/scripts/toolchain-flags $(CC) $(OBJDUMP))
+CPPFLAGS	+= $(shell $(srctree)/arch/ia64/scripts/toolchain-flags $(CC) $(OBJDUMP))
 
 ifeq ($(GAS_STATUS),buggy)
 $(error Sorry, you need a newer version of the assember, one that is built from	\
@@ -88,12 +88,15 @@
 
 prepare: include/asm-ia64/offsets.h
 
-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
+arch/ia64/kernel/asm-offsets.s: include/asm include/linux/version.h
+
+include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.s
 	$(call filechk,gen-asm-offsets)
 
 arch/ia64/kernel/asm-offsets.s: include/asm-ia64/.offsets.h.stamp
 
 include/asm-ia64/.offsets.h.stamp:
+	mkdir -p include/asm-ia64
 	[ -s include/asm-ia64/offsets.h ] \
 	 || echo "#define IA64_TASK_SIZE 0" > include/asm-ia64/offsets.h
 	touch $@
diff -Nru a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/configs/sn2_defconfig	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,693 @@
+#
+# Automatically generated make config: don't edit
+#
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_PAGG=y
+CONFIG_PAGG_JOB=y
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=20
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Processor type and features
+#
+CONFIG_IA64=y
+CONFIG_64BIT=y
+CONFIG_MMU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_TIME_INTERPOLATION=y
+# CONFIG_ITANIUM is not set
+CONFIG_MCKINLEY=y
+# CONFIG_IA64_GENERIC is not set
+# CONFIG_IA64_DIG is not set
+# CONFIG_IA64_HP_SIM is not set
+# CONFIG_IA64_HP_ZX1 is not set
+CONFIG_IA64_SGI_SN2=y
+# CONFIG_IA64_PAGE_SIZE_4KB is not set
+# CONFIG_IA64_PAGE_SIZE_8KB is not set
+CONFIG_IA64_PAGE_SIZE_16KB=y
+# CONFIG_IA64_PAGE_SIZE_64KB is not set
+CONFIG_ACPI=y
+CONFIG_ACPI_EFI=y
+CONFIG_ACPI_INTERPRETER=y
+CONFIG_ACPI_KERNEL_CONFIG=y
+CONFIG_IA64_L1_CACHE_SHIFT=7
+# CONFIG_MCKINLEY_ASTEP_SPECIFIC is not set
+CONFIG_NUMA=y
+CONFIG_DISCONTIGMEM=y
+CONFIG_VIRTUAL_MEM_MAP=y
+CONFIG_IA64_MCA=y
+CONFIG_IOSAPIC=y
+# CONFIG_IA64_SGI_SN_SIM is not set
+CONFIG_FORCE_MAX_ZONEORDER=18
+# CONFIG_IA64_PAL_IDLE is not set
+CONFIG_SMP=y
+# CONFIG_PREEMPT is not set
+CONFIG_IA32_SUPPORT=y
+CONFIG_COMPAT=y
+CONFIG_PERFMON=y
+CONFIG_IA64_PALINFO=y
+CONFIG_IA64_SALINFO=y
+# CONFIG_EFI_VARS is not set
+CONFIG_NR_CPUS=512
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI_BOOT=y
+# CONFIG_ACPI_BUTTON is not set
+# CONFIG_ACPI_FAN is not set
+# CONFIG_ACPI_PROCESSOR is not set
+CONFIG_ACPI_NUMA=y
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_BUS=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_PCI=y
+CONFIG_ACPI_SYSTEM=y
+# CONFIG_ACPI_RELAXED_AML is not set
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_HOTPLUG=y
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# PCMCIA/CardBus support
+#
+# CONFIG_PCMCIA is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+CONFIG_SCSI_REPORT_LUNS=y
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_MEGARAID is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CPQFCTS is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+CONFIG_SCSI_QLOGIC_1280=y
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+CONFIG_ARPD=y
+# CONFIG_INET_ECN is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+CONFIG_IPV6_SCTP__=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SK98LIN is not set
+CONFIG_TIGON3=y
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_ROCKETPORT is not set
+# CONFIG_SYNCLINK is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_STALDRV is not set
+CONFIG_SGI_L1_SERIAL=y
+CONFIG_SGI_L1_SERIAL_CONSOLE=y
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+# CONFIG_I2C_SENSOR is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+CONFIG_EFI_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_XFS_FS=y
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_POSIX_ACL is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=y
+CONFIG_AUTOFS4_FS=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=y
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_NEC98_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+CONFIG_EFI_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_IA64_GRANULE_16MB is not set
+CONFIG_IA64_GRANULE_64MB=y
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_IA64_PRINT_HAZARDS is not set
+# CONFIG_DISABLE_VHPT is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_IA64_EARLY_PRINTK=y
+# CONFIG_IA64_EARLY_PRINTK_UART is not set
+# CONFIG_IA64_EARLY_PRINTK_VGA is not set
+CONFIG_IA64_EARLY_PRINTK_SGI_SN=y
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_IA64_DEBUG_CMPXCHG is not set
+# CONFIG_IA64_DEBUG_IRQ is not set
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
diff -Nru a/arch/ia64/defconfig b/arch/ia64/defconfig
--- a/arch/ia64/defconfig	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/defconfig	Thu Jan  8 23:00:23 2004
@@ -6,6 +6,10 @@
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+# CONFIG_STANDALONE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
 
 #
 # General setup
@@ -15,9 +19,16 @@
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=16
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
 # CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
 # Loadable module support
@@ -33,6 +44,7 @@
 # Processor type and features
 #
 CONFIG_IA64=y
+CONFIG_64BIT=y
 CONFIG_MMU=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_TIME_INTERPOLATION=y
@@ -48,7 +60,6 @@
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
 CONFIG_ACPI=y
-CONFIG_ACPI_EFI=y
 CONFIG_ACPI_INTERPRETER=y
 CONFIG_ACPI_KERNEL_CONFIG=y
 CONFIG_IA64_L1_CACHE_SHIFT=7
@@ -58,9 +69,7 @@
 CONFIG_IA64_MCA=y
 CONFIG_PM=y
 CONFIG_IOSAPIC=y
-CONFIG_KCORE_ELF=y
 CONFIG_FORCE_MAX_ZONEORDER=18
-CONFIG_HUGETLB_PAGE=y
 # CONFIG_HUGETLB_PAGE_SIZE_4GB is not set
 # CONFIG_HUGETLB_PAGE_SIZE_1GB is not set
 # CONFIG_HUGETLB_PAGE_SIZE_256MB is not set
@@ -69,20 +78,22 @@
 # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
 # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
 # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set
-CONFIG_IA64_PAL_IDLE=y
+# CONFIG_IA64_PAL_IDLE is not set
 CONFIG_SMP=y
 # CONFIG_PREEMPT is not set
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
+CONFIG_HAVE_DEC_LOCK=y
 CONFIG_PERFMON=y
 CONFIG_IA64_PALINFO=y
+CONFIG_EFI=y
 CONFIG_EFI_VARS=y
 CONFIG_NR_CPUS=16
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=y
 
 #
-# ACPI Support
+# ACPI (Advanced Configuration and Power Interface) Support
 #
 CONFIG_ACPI_BOOT=y
 CONFIG_ACPI_BUTTON=y
@@ -94,6 +105,7 @@
 CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
+# CONFIG_ACPI_RELAXED_AML is not set
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCI_LEGACY_PROC=y
@@ -139,12 +151,72 @@
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_INITRD=y
 
 #
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+# CONFIG_IDEDISK_STROKE is not set
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+CONFIG_BLK_DEV_IDEFLOPPY=m
+CONFIG_BLK_DEV_IDESCSI=m
+CONFIG_IDE_TASK_IOCTL=y
+CONFIG_IDE_TASKFILE_IO=y
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# CONFIG_IDEDMA_PCI_WIP is not set
+CONFIG_BLK_DEV_ADMA=y
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+CONFIG_BLK_DEV_CMD64X=y
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
 # IEEE 1394 (FireWire) support (EXPERIMENTAL)
 #
 # CONFIG_IEEE1394 is not set
@@ -157,7 +229,15 @@
 #
 # Multi-device support (RAID and LVM)
 #
-# CONFIG_MD is not set
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_IOCTL_V4=y
 
 #
 # Fusion MPT device support
@@ -169,9 +249,10 @@
 # CONFIG_FUSION_CTL is not set
 
 #
-# SCSI support
+# SCSI device support
 #
 CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
 
 #
 # SCSI support type (disk, tape, CD-ROM)
@@ -200,9 +281,9 @@
 # CONFIG_SCSI_AIC7XXX is not set
 CONFIG_SCSI_AIC7XXX_OLD=y
 # CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ADVANSYS is not set
 CONFIG_SCSI_MEGARAID=y
+# CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
@@ -210,6 +291,7 @@
 # CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
 CONFIG_SCSI_SYM53C8XX_2=y
@@ -238,8 +320,6 @@
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 # CONFIG_NETLINK_DEV is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -257,6 +337,16 @@
 # CONFIG_INET_IPCOMP is not set
 
 #
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
 # IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
@@ -264,10 +354,9 @@
 # CONFIG_IP_NF_IPTABLES is not set
 CONFIG_IP_NF_ARPTABLES=y
 # CONFIG_IP_NF_ARPFILTER is not set
+# CONFIG_IP_NF_ARP_MANGLE is not set
 # CONFIG_IP_NF_COMPAT_IPCHAINS is not set
 # CONFIG_IP_NF_COMPAT_IPFWADM is not set
-# CONFIG_IPV6 is not set
-# CONFIG_XFRM_USER is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
@@ -276,9 +365,9 @@
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_NET_DIVERT is not set
@@ -306,7 +395,6 @@
 CONFIG_BONDING=y
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-# CONFIG_ETHERTAP is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -339,7 +427,6 @@
 # CONFIG_SIS900 is not set
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
-# CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
 
 #
@@ -353,8 +440,9 @@
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
-CONFIG_TIGON3=m
+CONFIG_TIGON3=y
 
 #
 # Ethernet (10000 Mbit)
@@ -371,10 +459,10 @@
 # CONFIG_NET_RADIO is not set
 
 #
-# Token Ring devices (depends on LLC=y)
+# Token Ring devices
 #
+# CONFIG_TR is not set
 # CONFIG_NET_FC is not set
-# CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
 
 #
@@ -388,14 +476,19 @@
 # CONFIG_HAMRADIO is not set
 
 #
-# ISDN subsystem
+# IrDA (infrared) support
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_IRDA is not set
 
 #
-# CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
+# Bluetooth support
 #
-# CONFIG_CD_NO_IDESCSI is not set
+# CONFIG_BT is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
 
 #
 # Input device support
@@ -406,7 +499,7 @@
 # Userland interfaces
 #
 CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
 CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 CONFIG_INPUT_JOYDEV=y
@@ -449,6 +542,7 @@
 CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_8250_ACPI=y
 CONFIG_SERIAL_8250_HCDP=y
+CONFIG_SERIAL_8250_NR_UARTS=4
 # CONFIG_SERIAL_8250_EXTENDED is not set
 
 #
@@ -465,7 +559,11 @@
 # CONFIG_I2C is not set
 
 #
-# I2C Hardware Sensors Mainboard support
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
 #
 
 #
@@ -509,8 +607,8 @@
 # CONFIG_DRM_R128 is not set
 CONFIG_DRM_RADEON=m
 # CONFIG_DRM_MGA is not set
+# CONFIG_DRM_SIS is not set
 # CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # Multimedia devices
@@ -565,11 +663,13 @@
 # Pseudo filesystems
 #
 CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
 CONFIG_DEVPTS_FS=y
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
 
 #
@@ -594,6 +694,7 @@
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
 CONFIG_NFSD=y
 CONFIG_NFSD_V3=y
 # CONFIG_NFSD_V4 is not set
@@ -630,11 +731,11 @@
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
 CONFIG_EFI_PARTITION=y
-CONFIG_NLS=y
 
 #
 # Native Language Support
 #
+CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="iso8859-1"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_CODEPAGE_737=y
@@ -843,7 +944,6 @@
 #
 # USB Network adaptors
 #
-# CONFIG_USB_AX8817X is not set
 # CONFIG_USB_CATC is not set
 # CONFIG_USB_KAWETH is not set
 # CONFIG_USB_PEGASUS is not set
@@ -865,36 +965,40 @@
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_GADGET is not set
 
 #
-# Bluetooth support
+# Library routines
 #
-# CONFIG_BT is not set
+CONFIG_CRC32=y
 
 #
-# Library routines
+# Profiling support
 #
-CONFIG_CRC32=y
+# CONFIG_PROFILING is not set
 
 #
 # Kernel hacking
 #
-# CONFIG_IA64_GRANULE_16MB is not set
-CONFIG_IA64_GRANULE_64MB=y
+CONFIG_IA64_GRANULE_16MB=y
+# CONFIG_IA64_GRANULE_64MB is not set
 CONFIG_DEBUG_KERNEL=y
-CONFIG_KALLSYMS=y
 CONFIG_IA64_PRINT_HAZARDS=y
 # CONFIG_DISABLE_VHPT is not set
 CONFIG_MAGIC_SYSRQ=y
-# CONFIG_IA64_EARLY_PRINTK is not set
+CONFIG_IA64_EARLY_PRINTK=y
+CONFIG_IA64_EARLY_PRINTK_UART=y
+CONFIG_IA64_EARLY_PRINTK_UART_BASE=0xff5e0000
+CONFIG_IA64_EARLY_PRINTK_VGA=y
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_IA64_DEBUG_CMPXCHG is not set
 # CONFIG_IA64_DEBUG_IRQ is not set
+CONFIG_DEBUG_INFO=y
 
 #
 # Security options
diff -Nru a/arch/ia64/hp/sim/boot/fw-emu.c b/arch/ia64/hp/sim/boot/fw-emu.c
--- a/arch/ia64/hp/sim/boot/fw-emu.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/hp/sim/boot/fw-emu.c	Thu Jan  8 23:00:23 2004
@@ -108,7 +108,7 @@
 #define BUS_NUMBER(addr)	(0x0000000000FF0000 & (addr))
 
 static efi_status_t
-efi_get_time (efi_time_t *tm, efi_time_cap_t *tc)
+fw_efi_get_time (efi_time_t *tm, efi_time_cap_t *tc)
 {
 #if defined(CONFIG_IA64_HP_SIM) || defined(CONFIG_IA64_GENERIC)
 	struct {
@@ -310,7 +310,7 @@
 	efi_runtime->hdr.signature = EFI_RUNTIME_SERVICES_SIGNATURE;
 	efi_runtime->hdr.revision = EFI_RUNTIME_SERVICES_REVISION;
 	efi_runtime->hdr.headersize = sizeof(efi_runtime->hdr);
-	efi_runtime->get_time = __pa(&efi_get_time);
+	efi_runtime->get_time = __pa(&fw_efi_get_time);
 	efi_runtime->set_time = __pa(&efi_unimplemented);
 	efi_runtime->get_wakeup_time = __pa(&efi_unimplemented);
 	efi_runtime->set_wakeup_time = __pa(&efi_unimplemented);
diff -Nru a/arch/ia64/ia32/binfmt_elf32.c b/arch/ia64/ia32/binfmt_elf32.c
--- a/arch/ia64/ia32/binfmt_elf32.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/ia32/binfmt_elf32.c	Thu Jan  8 23:00:24 2004
@@ -60,10 +60,12 @@
 extern unsigned long *ia32_gdt;
 
 struct page *
-ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int no_share)
+ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int *type)
 {
 	struct page *pg = ia32_shared_page[smp_processor_id()];
 	get_page(pg);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return pg;
 }
 
diff -Nru a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S
--- a/arch/ia64/ia32/ia32_entry.S	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/ia32/ia32_entry.S	Thu Jan  8 23:00:24 2004
@@ -1,4 +1,5 @@
 #include <asm/asmmacro.h>
+#include <asm/ia32.h>
 #include <asm/offsets.h>
 #include <asm/signal.h>
 #include <asm/thread_info.h>
@@ -141,27 +142,35 @@
 	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp
 	;;
 	st8 [r2]=r3				// initialize return code to -ENOSYS
-	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
-	// Need to reload arguments (they may be changed by the tracing process)
-	adds r2=IA64_PT_REGS_R9_OFFSET+16,sp	// r2 = &pt_regs.r9
+	br.call.sptk.few rp=syscall_trace	// give parent a chance to catch syscall args
+.ret2:	// Need to reload arguments (they may be changed by the tracing process)
+	adds r2=IA64_PT_REGS_R1_OFFSET+16,sp	// r2 = &pt_regs.r1
 	adds r3=IA64_PT_REGS_R13_OFFSET+16,sp	// r3 = &pt_regs.r13
+	mov r15=IA32_NR_syscalls
+	;;
+	ld4 r8=[r2],IA64_PT_REGS_R9_OFFSET-IA64_PT_REGS_R1_OFFSET
+	movl r16=ia32_syscall_table
 	;;
 	ld4 r33=[r2],8				// r9 == ecx
 	ld4 r37=[r3],16				// r13 == ebp
+	cmp.ltu.unc p6,p7=r8,r15
 	;;
 	ld4 r34=[r2],8				// r10 == edx
 	ld4 r36=[r3],8				// r15 == edi
+(p6)	shladd r16=r8,3,r16	// force ni_syscall if not valid syscall number
+	;;
+	ld8 r16=[r16]
 	;;
 	ld4 r32=[r2],8				// r11 == ebx
+	mov b6=r16
 	ld4 r35=[r3],8				// r14 == esi
-	;;
-.ret2:	br.call.sptk.few rp=b6			// do the syscall
+	br.call.sptk.few rp=b6			// do the syscall
 .ia32_strace_check_retval:
 	cmp.lt p6,p0=r8,r0			// syscall failed?
 	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp	// r2 = &pt_regs.r8
 	;;
 	st8.spill [r2]=r8			// store return value in slot for r8
-	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch return value
+	br.call.sptk.few rp=syscall_trace	// give parent a chance to catch return value
 .ret4:	alloc r2=ar.pfs,0,0,0,0			// drop the syscall argument frame
 	br.cond.sptk.many ia64_leave_kernel
 END(ia32_trace_syscall)
@@ -199,7 +208,7 @@
 	.align 8
 	.globl ia32_syscall_table
 ia32_syscall_table:
-	data8 sys32_ni_syscall	  /* 0	-  old "setup(" system call*/
+	data8 sys_ni_syscall	  /* 0	-  old "setup(" system call*/
 	data8 sys_exit
 	data8 sys32_fork
 	data8 sys_read
@@ -216,25 +225,25 @@
 	data8 sys_mknod
 	data8 sys_chmod		  /* 15 */
 	data8 sys_lchown	/* 16-bit version */
-	data8 sys32_ni_syscall	  /* old break syscall holder */
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall	  /* old break syscall holder */
+	data8 sys_ni_syscall
 	data8 sys32_lseek
 	data8 sys_getpid	  /* 20 */
 	data8 sys_mount
 	data8 sys_oldumount
 	data8 sys_setuid	/* 16-bit version */
 	data8 sys_getuid	/* 16-bit version */
-	data8 sys32_ni_syscall /* sys_stime is not supported on IA64 */  /* 25 */
+	data8 sys_ni_syscall	/* sys_stime is not supported on IA64 */  /* 25 */
 	data8 sys32_ptrace
 	data8 sys32_alarm
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall
 	data8 sys32_pause
 	data8 compat_sys_utime	  /* 30 */
-	data8 sys32_ni_syscall	  /* old stty syscall holder */
-	data8 sys32_ni_syscall	  /* old gtty syscall holder */
+	data8 sys_ni_syscall	  /* old stty syscall holder */
+	data8 sys_ni_syscall	  /* old gtty syscall holder */
 	data8 sys_access
 	data8 sys_nice
-	data8 sys32_ni_syscall	  /* 35 */	  /* old ftime syscall holder */
+	data8 sys_ni_syscall	  /* 35 */	  /* old ftime syscall holder */
 	data8 sys_sync
 	data8 sys_kill
 	data8 sys_rename
@@ -243,7 +252,7 @@
 	data8 sys_dup
 	data8 sys32_pipe
 	data8 compat_sys_times
-	data8 sys32_ni_syscall	  /* old prof syscall holder */
+	data8 sys_ni_syscall	  /* old prof syscall holder */
 	data8 sys32_brk		  /* 45 */
 	data8 sys_setgid	/* 16-bit version */
 	data8 sys_getgid	/* 16-bit version */
@@ -252,13 +261,13 @@
 	data8 sys_getegid	/* 16-bit version */	  /* 50 */
 	data8 sys_acct
 	data8 sys_umount	  /* recycled never used phys( */
-	data8 sys32_ni_syscall	  /* old lock syscall holder */
+	data8 sys_ni_syscall	  /* old lock syscall holder */
 	data8 compat_sys_ioctl
 	data8 compat_sys_fcntl	  /* 55 */
-	data8 sys32_ni_syscall	  /* old mpx syscall holder */
+	data8 sys_ni_syscall	  /* old mpx syscall holder */
 	data8 sys_setpgid
-	data8 sys32_ni_syscall	  /* old ulimit syscall holder */
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall	  /* old ulimit syscall holder */
+	data8 sys_ni_syscall
 	data8 sys_umask		  /* 60 */
 	data8 sys_chroot
 	data8 sys_ustat
@@ -267,8 +276,8 @@
 	data8 sys_getpgrp	  /* 65 */
 	data8 sys_setsid
 	data8 sys32_sigaction
-	data8 sys32_ni_syscall
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
 	data8 sys_setreuid	/* 16-bit version */	  /* 70 */
 	data8 sys_setregid	/* 16-bit version */
 	data8 sys32_sigsuspend
@@ -283,7 +292,7 @@
 	data8 sys32_setgroups16
 	data8 sys32_old_select
 	data8 sys_symlink
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall
 	data8 sys_readlink	  /* 85 */
 	data8 sys_uselib
 	data8 sys_swapon
@@ -297,7 +306,7 @@
 	data8 sys_fchown	/* 16-bit version */	  /* 95 */
 	data8 sys_getpriority
 	data8 sys_setpriority
-	data8 sys32_ni_syscall	  /* old profil syscall holder */
+	data8 sys_ni_syscall	  /* old profil syscall holder */
 	data8 compat_sys_statfs
 	data8 compat_sys_fstatfs	  /* 100 */
 	data8 sys32_ioperm
@@ -308,11 +317,11 @@
 	data8 compat_sys_newstat
 	data8 compat_sys_newlstat
 	data8 compat_sys_newfstat
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall
 	data8 sys32_iopl		  /* 110 */
 	data8 sys_vhangup
-	data8 sys32_ni_syscall		/* used to be sys_idle */
-	data8 sys32_ni_syscall
+	data8 sys_ni_syscall		/* used to be sys_idle */
+	data8 sys_ni_syscall
 	data8 compat_sys_wait4
 	data8 sys_swapoff	  /* 115 */
 	data8 sys32_sysinfo
@@ -323,20 +332,20 @@
 	data8 sys_setdomainname
 	data8 sys32_newuname
 	data8 sys32_modify_ldt
-	data8 sys32_ni_syscall	/* adjtimex */
+	data8 sys_ni_syscall	/* adjtimex */
 	data8 sys32_mprotect	  /* 125 */
 	data8 compat_sys_sigprocmask
-	data8 sys32_ni_syscall	/* create_module */
-	data8 sys32_ni_syscall	/* init_module */
-	data8 sys32_ni_syscall	/* delete_module */
-	data8 sys32_ni_syscall	/* get_kernel_syms */  /* 130 */
+	data8 sys_ni_syscall	/* create_module */
+	data8 sys_ni_syscall	/* init_module */
+	data8 sys_ni_syscall	/* delete_module */
+	data8 sys_ni_syscall	/* get_kernel_syms */  /* 130 */
 	data8 sys_quotactl
 	data8 sys_getpgid
 	data8 sys_fchdir
-	data8 sys32_ni_syscall	/* sys_bdflush */
+	data8 sys_ni_syscall	/* sys_bdflush */
 	data8 sys_sysfs		/* 135 */
 	data8 sys32_personality
-	data8 sys32_ni_syscall	  /* for afs_syscall */
+	data8 sys_ni_syscall	  /* for afs_syscall */
 	data8 sys_setfsuid	/* 16-bit version */
 	data8 sys_setfsgid	/* 16-bit version */
 	data8 sys_llseek	  /* 140 */
@@ -365,10 +374,10 @@
 	data8 sys_mremap
 	data8 sys_setresuid	/* 16-bit version */
 	data8 sys32_getresuid16	/* 16-bit version */	  /* 165 */
-	data8 sys32_ni_syscall	/* vm86 */
-	data8 sys32_ni_syscall	/* sys_query_module */
+	data8 sys_ni_syscall	/* vm86 */
+	data8 sys_ni_syscall	/* sys_query_module */
 	data8 sys_poll
-	data8 sys32_ni_syscall	/* nfsservctl */
+	data8 sys_ni_syscall	/* nfsservctl */
 	data8 sys_setresgid	  /* 170 */
 	data8 sys32_getresgid16
 	data8 sys_prctl
@@ -387,8 +396,8 @@
 	data8 sys_capset	  /* 185 */
 	data8 sys32_sigaltstack
 	data8 sys32_sendfile
-	data8 sys32_ni_syscall		  /* streams1 */
-	data8 sys32_ni_syscall		  /* streams2 */
+	data8 sys_ni_syscall		  /* streams1 */
+	data8 sys_ni_syscall		  /* streams2 */
 	data8 sys32_vfork	  /* 190 */
 	data8 compat_sys_getrlimit
 	data8 sys32_mmap2
@@ -425,54 +434,55 @@
 	data8 sys_ni_syscall		/* reserved for Security */
 	data8 sys_gettid
 	data8 sys_readahead	  /* 225 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	/* 230 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	/* 235 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
+ 	data8 sys_setxattr
+ 	data8 sys_lsetxattr
+ 	data8 sys_fsetxattr
+ 	data8 sys_getxattr
+ 	data8 sys_lgetxattr	/* 230 */
+ 	data8 sys_fgetxattr
+ 	data8 sys_listxattr
+ 	data8 sys_llistxattr
+ 	data8 sys_flistxattr
+ 	data8 sys_removexattr	/* 235 */
+ 	data8 sys_lremovexattr
+ 	data8 sys_fremovexattr
 	data8 sys_tkill
-	data8 sys_ni_syscall
+ 	data8 sys_sendfile64
 	data8 compat_sys_futex	/* 240 */
 	data8 compat_sys_sched_setaffinity
 	data8 compat_sys_sched_getaffinity
 	data8 sys32_set_thread_area
 	data8 sys32_get_thread_area
-	data8 sys_ni_syscall	/* 245 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	/* 250 */
+ 	data8 compat_sys_io_setup	/* 245 */
+ 	data8 sys_io_destroy
+ 	data8 compat_sys_io_getevents
+ 	data8 compat_sys_io_submit
+ 	data8 sys_io_cancel
+ 	data8 sys_fadvise64	/* 250 */
 	data8 sys_ni_syscall
 	data8 sys_exit_group
-	data8 sys_ni_syscall
+ 	data8 sys_lookup_dcookie
 	data8 sys_epoll_create
 	data8 sys32_epoll_ctl	/* 255 */
 	data8 sys32_epoll_wait
 	data8 sys_remap_file_pages
 	data8 sys_set_tid_address
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	/* 260 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall	/* 265 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
+ 	data8 sys32_timer_create
+ 	data8 compat_timer_settime	/* 260 */
+ 	data8 compat_timer_gettime
+ 	data8 sys_timer_getoverrun
+ 	data8 sys_timer_delete
+ 	data8 compat_clock_settime
+ 	data8 compat_clock_gettime /* 265 */
+ 	data8 compat_clock_getres
+ 	data8 compat_clock_nanosleep
 	data8 sys_statfs64
 	data8 sys_fstatfs64
-	data8 sys_ni_syscall
-	
-	/*
-	 *  CAUTION: If any system calls are added beyond this point
-	 *	then the check in `arch/ia64/kernel/ivt.S' will have
-	 *	to be modified also.  You've been warned.
-	 */
+ 	data8 sys_tgkill	/* 270 */
+ 	data8 compat_sys_utimes
+ 	data8 sys32_fadvise64_64
+ 	data8 sys_ni_syscall
+  	data8 sys_ni_syscall
+
+	// guard against failures to increase IA32_NR_syscalls
+	.org ia32_syscall_table + 8*IA32_NR_syscalls
diff -Nru a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h
--- a/arch/ia64/ia32/ia32priv.h	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/ia32/ia32priv.h	Thu Jan  8 23:00:24 2004
@@ -199,6 +199,8 @@
 	unsigned int sival_ptr;
 } sigval_t32;
 
+#define SIGEV_PAD_SIZE32 ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
+
 typedef struct siginfo32 {
 	int si_signo;
 	int si_errno;
@@ -250,6 +252,19 @@
 		} _sigpoll;
 	} _sifields;
 } siginfo_t32;
+
+typedef struct sigevent32 {
+	sigval_t32 sigev_value;
+	int sigev_signo;
+	int sigev_notify;
+	union {
+		int _pad[SIGEV_PAD_SIZE32];
+		struct {
+			u32 _function;
+			u32 _attribute; /* really pthread_attr_t */
+		} _sigev_thread;
+	} _sigev_un;
+} sigevent_t32;
 
 struct old_linux32_dirent {
 	u32	d_ino;
diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
--- a/arch/ia64/ia32/sys_ia32.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/ia32/sys_ia32.c	Thu Jan  8 23:00:24 2004
@@ -2164,19 +2164,6 @@
 	return ret;
 }
 
-asmlinkage long sys_ni_syscall(void);
-
-asmlinkage long
-sys32_ni_syscall (int dummy0, int dummy1, int dummy2, int dummy3, int dummy4, int dummy5,
-		  int dummy6, int dummy7, int stack)
-{
-	struct pt_regs *regs = (struct pt_regs *)&stack;
-
-	printk(KERN_WARNING "IA32 syscall #%d issued, maybe we should implement it\n",
-	       (int)regs->r1);
-	return(sys_ni_syscall());
-}
-
 /*
  *  The IA64 maps 4 I/O ports for each 4K page
  */
@@ -2267,7 +2254,7 @@
 	uss.ss_flags = buf32.ss_flags;
 	/* MINSIGSTKSZ is different for ia32 vs ia64. We lie here to pass the 
            check and set it to the user requested value later */
-	if (buf32.ss_size < MINSIGSTKSZ_IA32) {
+	if ((buf32.ss_flags != SS_DISABLE) && (buf32.ss_size < MINSIGSTKSZ_IA32)) {
 		ret = -ENOMEM;
 		goto out;
 	}
@@ -2924,6 +2911,54 @@
 		return -EFAULT;
 	return 0;
 }
+
+extern asmlinkage long
+sys_timer_create(clockid_t which_clock, struct sigevent *timer_event_spec,
+		 timer_t * created_timer_id);
+
+asmlinkage long
+sys32_timer_create(u32 clock, struct sigevent32 *se32, timer_t *timer_id)
+{
+	struct sigevent se;
+	mm_segment_t oldfs;
+	timer_t t;
+	long err;
+
+	if (se32 == NULL)
+		return sys_timer_create(clock, NULL, timer_id);
+
+	memset(&se, 0, sizeof(struct sigevent));
+	if (get_user(se.sigev_value.sival_int,	&se32->sigev_value.sival_int) ||
+	    __get_user(se.sigev_signo, &se32->sigev_signo) ||
+	    __get_user(se.sigev_notify, &se32->sigev_notify) ||
+	    __copy_from_user(&se._sigev_un._pad, &se32->_sigev_un._pad,
+	    sizeof(se._sigev_un._pad)))
+		return -EFAULT;
+
+	if (!access_ok(VERIFY_WRITE,timer_id,sizeof(timer_t)))
+		return -EFAULT;
+
+	oldfs = get_fs();
+	set_fs(KERNEL_DS);
+	err = sys_timer_create(clock, &se, &t);
+	set_fs(oldfs);
+
+	if (!err)
+		err = __put_user (t, timer_id);
+
+	return err;
+}
+
+extern long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice);
+
+long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 offset_high, 
+			__u32 len_low, __u32 len_high, int advice)
+{ 
+	return sys_fadvise64_64(fd,
+			       (((u64)offset_high)<<32) | offset_low,
+			       (((u64)len_high)<<32) | len_low,
+			       advice); 
+} 
 
 #ifdef	NOTYET  /* UNTESTED FOR IA64 FROM HERE DOWN */
 
diff -Nru a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
--- a/arch/ia64/kernel/Makefile	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/Makefile	Thu Jan  8 23:00:24 2004
@@ -6,7 +6,7 @@
 
 obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o	\
 	 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o		\
-	 semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o unwind.o
+	 salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o unwind.o
 
 obj-$(CONFIG_EFI_VARS)		+= efivars.o
 obj-$(CONFIG_IA64_BRL_EMU)	+= brl_emu.o
@@ -14,7 +14,6 @@
 obj-$(CONFIG_IA64_HP_ZX1)	+= acpi-ext.o
 obj-$(CONFIG_IA64_MCA)		+= mca.o mca_asm.o
 obj-$(CONFIG_IA64_PALINFO)	+= palinfo.o
-obj-$(CONFIG_IA64_SALINFO)	+= salinfo.o
 obj-$(CONFIG_IOSAPIC)		+= iosapic.o
 obj-$(CONFIG_MODULES)		+= module.o
 obj-$(CONFIG_SMP)		+= smp.o smpboot.o
diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
--- a/arch/ia64/kernel/acpi.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/acpi.c	Thu Jan  8 23:00:24 2004
@@ -413,7 +413,7 @@
 			break;
 	}
 	if (p < pend) {
-		for (q = pend; q >= p; q--)
+		for (q = pend - 1; q >= p; q--)
 			*(q + 1) = *q;
 	}
 	p->start_paddr = paddr;
@@ -608,66 +608,6 @@
 	/* Make boot-up look pretty */
 	printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus);
 	return 0;
-}
-
-/*
- * PCI Interrupt Routing
- */
-
-#ifdef CONFIG_PCI
-int __init
-acpi_get_prt (struct pci_vector_struct **vectors, int *count)
-{
-	struct pci_vector_struct *vector;
-	struct list_head *node;
-	struct acpi_prt_entry *entry;
-	int i = 0;
-
-	if (!vectors || !count)
-		return -EINVAL;
-
-	*vectors = NULL;
-	*count = 0;
-
-	if (acpi_prt.count < 0) {
-		printk(KERN_ERR PREFIX "No PCI interrupt routing entries\n");
-		return -ENODEV;
-	}
-
-	/* Allocate vectors */
-
-	*vectors = kmalloc(sizeof(struct pci_vector_struct) * acpi_prt.count, GFP_KERNEL);
-	if (!(*vectors))
-		return -ENOMEM;
-
-	/* Convert PRT entries to IOSAPIC PCI vectors */
-
-	vector = *vectors;
-
-	list_for_each(node, &acpi_prt.entries) {
-		entry = (struct acpi_prt_entry *)node;
-		vector[i].segment = entry->id.segment;
-		vector[i].bus    = entry->id.bus;
-		vector[i].pci_id = ((u32) entry->id.device << 16) | 0xffff;
-		vector[i].pin    = entry->pin;
-		vector[i].irq    = entry->link.index;
-		i++;
-	}
-	*count = acpi_prt.count;
-	return 0;
-}
-#endif /* CONFIG_PCI */
-
-/* Assume IA64 always use I/O SAPIC */
-
-int __init
-acpi_get_interrupt_model (int *type)
-{
-        if (!type)
-                return -EINVAL;
-
-	*type = ACPI_IRQ_MODEL_IOSAPIC;
-        return 0;
 }
 
 int
diff -Nru a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c
--- a/arch/ia64/kernel/asm-offsets.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/asm-offsets.c	Thu Jan  8 23:00:24 2004
@@ -12,6 +12,7 @@
 #include <asm-ia64/ptrace.h>
 #include <asm-ia64/siginfo.h>
 #include <asm-ia64/sigcontext.h>
+#include <asm-ia64/mca.h>
 
 #include "../kernel/sigframe.h"
 
@@ -203,5 +204,8 @@
 #if CLONE_SETTLS != (1<<19)
 # error "CLONE_SETTLS_BIT incorrect, please fix"
 #endif
+
+	BLANK();
+	DEFINE(IA64_MCA_TLB_INFO_SIZE, sizeof (struct ia64_mca_tlb_info));
 
 }
diff -Nru a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
--- a/arch/ia64/kernel/efi.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/efi.c	Thu Jan  8 23:00:23 2004
@@ -30,6 +30,7 @@
 #include <asm/kregs.h>
 #include <asm/pgtable.h>
 #include <asm/processor.h>
+#include <asm/mca.h>
 
 #define EFI_DEBUG	0
 
@@ -395,6 +396,9 @@
 	int pal_code_count = 0;
 	u64 mask, psr;
 	u64 vaddr;
+#ifdef CONFIG_IA64_MCA
+	int cpu;
+#endif
 
 	efi_map_start = __va(ia64_boot_param->efi_memmap);
 	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
@@ -455,6 +459,14 @@
 			 IA64_GRANULE_SHIFT);
 		ia64_set_psr(psr);		/* restore psr */
 		ia64_srlz_i();
+
+#ifdef CONFIG_IA64_MCA
+		cpu = smp_processor_id();
+
+		/* insert this TR into our list for MCA recovery purposes */
+		ia64_mca_tlb_list[cpu].pal_base = vaddr & mask;
+		ia64_mca_tlb_list[cpu].pal_paddr = pte_val(mk_pte_phys(md->phys_addr, PAGE_KERNEL));
+#endif
 	}
 }
 
diff -Nru a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
--- a/arch/ia64/kernel/entry.S	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/entry.S	Thu Jan  8 23:00:23 2004
@@ -484,33 +484,10 @@
 END(clone)
 
 	/*
-	 * We invoke syscall_trace through this intermediate function to
-	 * ensure that the syscall input arguments are not clobbered.  We
-	 * also use it to preserve b6, which contains the syscall entry point.
-	 */
-GLOBAL_ENTRY(invoke_syscall_trace)
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc loc1=ar.pfs,8,3,0,0
-	mov loc0=rp
-	.body
-	mov loc2=b6
-	;;
-	br.call.sptk.many rp=syscall_trace
-.ret3:	mov rp=loc0
-	mov ar.pfs=loc1
-	mov b6=loc2
-	br.ret.sptk.many rp
-END(invoke_syscall_trace)
-
-	/*
 	 * Invoke a system call, but do some tracing before and after the call.
 	 * We MUST preserve the current register frame throughout this routine
 	 * because some system calls (such as ia64_execve) directly
 	 * manipulate ar.pfs.
-	 *
-	 * Input:
-	 *	r15 = syscall number
-	 *	b6  = syscall entry point
 	 */
 	.global ia64_strace_leave_kernel
 
@@ -522,21 +499,38 @@
 	 */
 	nop.m 0
 	nop.i 0
-	br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch syscall args
+	br.call.sptk.many rp=syscall_trace // give parent a chance to catch syscall args
 }
-.ret6:	br.call.sptk.many rp=b6			// do the syscall
-strace_check_retval:
+	// the syscall number may have changed, so re-load it and re-calculate the
+	// syscall entry-point:
+	adds r15=PT(R15)+16,sp			// r15 = &pt_regs.r15 (syscall #)
+	;;
+	ld8 r15=[r15]
+	mov r3=NR_syscalls - 1
+	;;
+	adds r15=-1024,r15
+	movl r16=sys_call_table
+	;;
+	shladd r20=r15,3,r16			// r20 = sys_call_table + 8*(syscall-1024)
+	cmp.leu p6,p7=r15,r3
+	;;
+(p6)	ld8 r20=[r20]				// load address of syscall entry point
+(p7)	movl r20=sys_ni_syscall
+	;;
+	mov b6=r20
+	br.call.sptk.many rp=b6			// do the syscall
+.strace_check_retval:
 	cmp.lt p6,p0=r8,r0			// syscall failed?
 	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
 	adds r3=PT(R10)+16,sp			// r3 = &pt_regs.r10
 	mov r10=0
 (p6)	br.cond.sptk strace_error		// syscall failed ->
 	;;					// avoid RAW on r10
-strace_save_retval:
+.strace_save_retval:
 .mem.offset 0,0; st8.spill [r2]=r8		// store return value in slot for r8
 .mem.offset 8,0; st8.spill [r3]=r10		// clear error indication in slot for r10
 ia64_strace_leave_kernel:
-	br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch return value
+	br.call.sptk.many rp=syscall_trace // give parent a chance to catch return value
 .rety:	br.cond.sptk ia64_leave_syscall
 
 strace_error:
@@ -548,7 +542,7 @@
 	;;
 (p6)	mov r10=-1
 (p6)	mov r8=r9
-	br.cond.sptk strace_save_retval
+	br.cond.sptk .strace_save_retval
 END(ia64_trace_syscall)
 
 GLOBAL_ENTRY(ia64_ret_from_clone)
@@ -573,7 +567,7 @@
 	;;
 	mov r8=0
 	tbit.nz p6,p0=r2,TIF_SYSCALL_TRACE
-(p6)	br.cond.spnt strace_check_retval
+(p6)	br.cond.spnt .strace_check_retval
 	;;					// added stop bits to prevent r8 dependency
 END(ia64_ret_from_clone)
 	// fall through
@@ -726,6 +720,7 @@
 	mov b6=r22				// restore b6
 	shr.u r18=r19,16	// get byte size of existing "dirty" partition
 (pKStk) br.cond.dpnt.many skip_rbs_switch
+(pNonSys) br.cond.dpnt.many dont_preserve_current_frame
 	br.cond.sptk.many rbs_switch
 END(ia64_leave_syscall)
 
@@ -1334,9 +1329,9 @@
 	data8 sys_syslog
 	data8 sys_setitimer
 	data8 sys_getitimer
-	data8 ia64_ni_syscall			// 1120		/* was: ia64_oldstat */
-	data8 ia64_ni_syscall					/* was: ia64_oldlstat */
-	data8 ia64_ni_syscall					/* was: ia64_oldfstat */
+	data8 sys_ni_syscall			// 1120		/* was: ia64_oldstat */
+	data8 sys_ni_syscall					/* was: ia64_oldlstat */
+	data8 sys_ni_syscall					/* was: ia64_oldfstat */
 	data8 sys_vhangup
 	data8 sys_lchown
 	data8 sys_remap_file_pages		// 1125
@@ -1346,16 +1341,16 @@
 	data8 sys_setdomainname
 	data8 sys_newuname			// 1130
 	data8 sys_adjtimex
-	data8 ia64_ni_syscall					/* was: ia64_create_module */
+	data8 sys_ni_syscall					/* was: ia64_create_module */
 	data8 sys_init_module
 	data8 sys_delete_module
-	data8 ia64_ni_syscall			// 1135		/* was: sys_get_kernel_syms */
-	data8 ia64_ni_syscall					/* was: sys_query_module */
+	data8 sys_ni_syscall			// 1135		/* was: sys_get_kernel_syms */
+	data8 sys_ni_syscall					/* was: sys_query_module */
 	data8 sys_quotactl
 	data8 sys_bdflush
 	data8 sys_sysfs
 	data8 sys_personality			// 1140
-	data8 ia64_ni_syscall		// sys_afs_syscall
+	data8 sys_ni_syscall		// sys_afs_syscall
 	data8 sys_setfsuid
 	data8 sys_setfsgid
 	data8 sys_getdents
@@ -1473,26 +1468,26 @@
 	data8 sys_clock_nanosleep
 	data8 sys_fstatfs64
 	data8 sys_statfs64
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall			// 1260
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall			// 1265
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall			// 1270
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall			// 1275
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
-	data8 ia64_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall			// 1260
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall			// 1265
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall			// 1270
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall			// 1275
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
 
 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
diff -Nru a/arch/ia64/kernel/entry.h b/arch/ia64/kernel/entry.h
--- a/arch/ia64/kernel/entry.h	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/entry.h	Thu Jan  8 23:00:23 2004
@@ -4,7 +4,7 @@
  * Preserved registers that are shared between code in ivt.S and entry.S.  Be
  * careful not to step on these!
  */
-#define pLvSys		p1	/* set 1 if leave from syscall; otherwise, set 0*/
+#define pLvSys		p1	/* set 1 if leave from syscall; otherwise, set 0 */
 #define pKStk		p2	/* will leave_{kernel,syscall} return to kernel-stacks? */
 #define pUStk		p3	/* will leave_{kernel,syscall} return to user-stacks? */
 #define pSys		p4	/* are we processing a (synchronous) system call? */
diff -Nru a/arch/ia64/kernel/gate.S b/arch/ia64/kernel/gate.S
--- a/arch/ia64/kernel/gate.S	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/gate.S	Thu Jan  8 23:00:24 2004
@@ -195,10 +195,10 @@
 	ld8 r15=[base1]					// get address of new RBS base (or NULL)
 	cover				// push args in interrupted frame onto backing store
 	;;
-	cmp.ne p8,p0=r15,r0		// do we need to switch the rbs?
+	cmp.ne p1,p0=r15,r0		// do we need to switch rbs? (note: pr is saved by kernel)
 	mov.m r9=ar.bsp			// fetch ar.bsp
-	.spillsp.p p8, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
-(p8)	br.cond.spnt setup_rbs		// yup -> (clobbers p8, r14-r16, and r18-r20)
+	.spillsp.p p1, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
+(p1)	br.cond.spnt setup_rbs		// yup -> (clobbers p8, r14-r16, and r18-r20)
 back_from_setup_rbs:
 	alloc r8=ar.pfs,0,0,3,0
 	ld8 out0=[base0],16		// load arg0 (signum)
@@ -237,8 +237,8 @@
 	ld8 r15=[base0],(CFM_OFF-BSP_OFF)	// fetch sc_ar_bsp and advance to CFM_OFF
 	mov r14=ar.bsp
 	;;
-	cmp.ne p8,p0=r14,r15			// do we need to restore the rbs?
-(p8)	br.cond.spnt restore_rbs		// yup -> (clobbers r14-r18, f6 & f7)
+	cmp.ne p1,p0=r14,r15			// do we need to restore the rbs?
+(p1)	br.cond.spnt restore_rbs		// yup -> (clobbers r14-r18, f6 & f7)
 	;;
 back_from_restore_rbs:
 	adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
diff -Nru a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
--- a/arch/ia64/kernel/head.S	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/head.S	Thu Jan  8 23:00:24 2004
@@ -864,7 +864,7 @@
 	 * the clobber lists for spin_lock() in include/asm-ia64/spinlock.h.
 	 */
 
-#if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
+#if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
 
 GLOBAL_ENTRY(ia64_spinlock_contention_pre3_4)
 	.prologue
diff -Nru a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
--- a/arch/ia64/kernel/ia64_ksyms.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/ia64_ksyms.c	Thu Jan  8 23:00:24 2004
@@ -189,7 +189,7 @@
 EXPORT_SYMBOL(unw_access_pr);
 
 #ifdef CONFIG_SMP
-# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
 /*
  * This is not a normal routine and we don't want a function descriptor for it, so we use
  * a fake declaration here.
diff -Nru a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
--- a/arch/ia64/kernel/iosapic.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/iosapic.c	Thu Jan  8 23:00:24 2004
@@ -628,9 +628,6 @@
 	iosapic_lists[num_iosapic].num_rte = num_rte;
 	num_iosapic++;
 
-	printk(KERN_INFO "  IOSAPIC v%x.%x, address 0x%lx, GSIs 0x%x-0x%x\n",
-	       (ver & 0xf0) >> 4, (ver & 0x0f), phys_addr, gsi_base, gsi_base + num_rte - 1);
-
 	if ((gsi_base == 0) && pcat_compat) {
 		/*
 		 * Map the legacy ISA devices into the IOSAPIC data.  Some of these may
diff -Nru a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c
--- a/arch/ia64/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -27,6 +27,7 @@
 #include <linux/timex.h>
 #include <linux/slab.h>
 #include <linux/random.h>
+#include <linux/ctype.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <linux/kernel_stat.h>
@@ -160,18 +161,20 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int j, i = *(loff_t *) v;
 	struct irqaction * action;
 	irq_desc_t *idesc;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		idesc = irq_descp(i);
 		spin_lock_irqsave(&idesc->lock, flags);
 		action = idesc->action;
@@ -194,25 +197,26 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&idesc->lock, flags);
-	}
-	seq_puts(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", nmi_count(j));
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_puts(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", nmi_count(j));
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_puts(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_puts(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
@@ -910,47 +914,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value(const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	unsigned long i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -974,20 +937,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -997,21 +950,37 @@
 	unsigned int irq = (unsigned long) data;
 	int full_count = count, err;
 	cpumask_t new_value, tmp;
-	const char *buf = buffer;
+#	define R_PREFIX_LEN 16
+	char rbuf[R_PREFIX_LEN];
+	int rlen;
+	int prelen;
 	irq_desc_t *desc = irq_descp(irq);
-	int redir;
 
 	if (!desc->handler->set_affinity)
 		return -EIO;
 
-	if (buf[0] == 'r' || buf[0] == 'R') {
-		++buf;
-		while (*buf == ' ') ++buf;
-		redir = 1;
-	} else
-		redir = 0;
+	/*
+	 * If string being written starts with a prefix of 'r' or 'R'
+	 * and some limited number of spaces, set IA64_IRQ_REDIRECTED.
+	 * If more than (R_PREFIX_LEN - 2) spaces are passed, they won't
+	 * all be trimmed as part of prelen, the untrimmed spaces will
+	 * cause the hex parsing to fail, and this write() syscall will
+	 * fail with EINVAL.
+	 */
+
+	if (!count)
+		return -EINVAL;
+	rlen = min(sizeof(rbuf)-1, count);
+	if (copy_from_user(rbuf, buffer, rlen))
+		return -EFAULT;
+	rbuf[rlen] = 0;
+	prelen = 0;
+	if (tolower(*rbuf) == 'r') {
+		prelen = strspn(rbuf, "Rr ");
+		irq |= IA64_IRQ_REDIRECTED;
+	}
 
-	err = parse_hex_value(buf, count, &new_value);
+	err = cpumask_parse(buffer+prelen, count-prelen, new_value);
 	if (err)
 		return err;
 
@@ -1024,7 +993,7 @@
 	if (cpus_empty(tmp))
 		return -EINVAL;
 
-	desc->handler->set_affinity(irq | (redir? IA64_IRQ_REDIRECTED : 0), new_value);
+	desc->handler->set_affinity(irq, new_value);
 	return full_count;
 }
 
@@ -1033,19 +1002,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t *mask = (cpumask_t *)data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-		len += j;
-		page += j;
-		cpus_shift_right(*mask, *mask, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -1056,7 +1016,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S
--- a/arch/ia64/kernel/ivt.S	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/ivt.S	Thu Jan  8 23:00:23 2004
@@ -42,6 +42,7 @@
 
 #include <asm/asmmacro.h>
 #include <asm/break.h>
+#include <asm/ia32.h>
 #include <asm/kregs.h>
 #include <asm/offsets.h>
 #include <asm/pgtable.h>
@@ -360,33 +361,6 @@
 	rfi
 END(alt_dtlb_miss)
 
-	//-----------------------------------------------------------------------------------
-	// call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address)
-ENTRY(page_fault)
-	ssm psr.dt
-	;;
-	srlz.i
-	;;
-	SAVE_MIN_WITH_COVER
-	alloc r15=ar.pfs,0,0,3,0
-	mov out0=cr.ifa
-	mov out1=cr.isr
-	adds r3=8,r2				// set up second base pointer
-	;;
-	ssm psr.ic | PSR_DEFAULT_BITS
-	;;
-	srlz.i					// guarantee that interruption collectin is on
-	;;
-(p15)	ssm psr.i				// restore psr.i
-	movl r14=ia64_leave_kernel
-	;;
-	SAVE_REST
-	mov rp=r14
-	;;
-	adds out2=16,r12			// out2 = pointer to pt_regs
-	br.call.sptk.many b6=ia64_do_page_fault	// ignore return address
-END(page_fault)
-
 	.org ia64_ivt+0x1400
 /////////////////////////////////////////////////////////////////////////////////////////
 // 0x1400 Entry 5 (size 64 bundles) Data nested TLB (6,45)
@@ -459,6 +433,33 @@
 	FAULT(6)
 END(ikey_miss)
 
+	//-----------------------------------------------------------------------------------
+	// call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address)
+ENTRY(page_fault)
+	ssm psr.dt
+	;;
+	srlz.i
+	;;
+	SAVE_MIN_WITH_COVER
+	alloc r15=ar.pfs,0,0,3,0
+	mov out0=cr.ifa
+	mov out1=cr.isr
+	adds r3=8,r2				// set up second base pointer
+	;;
+	ssm psr.ic | PSR_DEFAULT_BITS
+	;;
+	srlz.i					// guarantee that interruption collectin is on
+	;;
+(p15)	ssm psr.i				// restore psr.i
+	movl r14=ia64_leave_kernel
+	;;
+	SAVE_REST
+	mov rp=r14
+	;;
+	adds out2=16,r12			// out2 = pointer to pt_regs
+	br.call.sptk.many b6=ia64_do_page_fault	// ignore return address
+END(page_fault)
+
 	.org ia64_ivt+0x1c00
 /////////////////////////////////////////////////////////////////////////////////////////
 // 0x1c00 Entry 7 (size 64 bundles) Data Key Miss (12,51)
@@ -705,13 +706,14 @@
 	movl r2=ia64_ret_from_syscall
 	;;
 	shladd r20=r15,3,r16			// r20 = sys_call_table + 8*(syscall-1024)
-	cmp.geu p0,p7=r3,r15			// (syscall > 0 && syscall < 1024 + NR_syscalls) ?
+	cmp.leu p6,p7=r15,r3			// (syscall > 0 && syscall < 1024 + NR_syscalls) ?
 	mov rp=r2				// set the real return addr
 	;;
-(p7)	add r20=(__NR_ni_syscall-1024)*8,r16	// force __NR_ni_syscall
+(p6)	ld8 r20=[r20]				// load address of syscall entry point
+(p7)	movl r20=sys_ni_syscall
+
 	add r2=TI_FLAGS+IA64_TASK_SIZE,r13
 	;;
-	ld8 r20=[r20]				// load address of syscall entry point
 	ld4 r2=[r2]				// r2 = current_thread_info()->flags
 	;;
 	tbit.z p8,p0=r2,TIF_SYSCALL_TRACE
@@ -1513,7 +1515,7 @@
 	alloc r15=ar.pfs,0,0,6,0	// must first in an insn group
 	;;
 	ld4 r8=[r14],8		// r8 == eax (syscall number)
-	mov r15=270		// number of entries in ia32 system call table
+	mov r15=IA32_NR_syscalls
 	;;
 	cmp.ltu.unc p6,p7=r8,r15
 	ld4 out1=[r14],8	// r9 == ecx
diff -Nru a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
--- a/arch/ia64/kernel/mca.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/mca.c	Thu Jan  8 23:00:24 2004
@@ -36,6 +36,10 @@
  *                      SAL 3.0 spec.
  * 00/03/29 C. Fleckenstein  Fixed PAL/SAL update issues, began MCA bug fixes, logging issues,
  *                           added min save state dump, added INIT handler.
+ *
+ * 2003-12-08 Keith Owens <kaos@sgi.com>
+ *            smp_call_function() must not be called from interrupt context (can
+ *            deadlock on tasklist_lock).  Use keventd to call smp_call_function().
  */
 #include <linux/config.h>
 #include <linux/types.h>
@@ -51,6 +55,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/smp.h>
+#include <linux/workqueue.h>
 
 #include <asm/delay.h>
 #include <asm/machvec.h>
@@ -78,17 +83,19 @@
 u64				ia64_mca_stackframe[32];
 u64				ia64_mca_bspstore[1024];
 u64				ia64_init_stack[KERNEL_STACK_SIZE/8] __attribute__((aligned(16)));
-u64				ia64_mca_sal_data_area[1356];
-u64				ia64_tlb_functional;
 u64				ia64_os_mca_recovery_successful;
+u64				ia64_mca_serialize;
 static void			ia64_mca_wakeup_ipi_wait(void);
 static void			ia64_mca_wakeup(int cpu);
 static void			ia64_mca_wakeup_all(void);
 static void			ia64_log_init(int);
 extern void			ia64_monarch_init_handler (void);
 extern void			ia64_slave_init_handler (void);
+static u64			ia64_log_get(int sal_info_type, u8 **buffer);
 extern struct hw_interrupt_type	irq_type_iosapic_level;
 
+struct ia64_mca_tlb_info ia64_mca_tlb_list[NR_CPUS];
+
 static struct irqaction cmci_irqaction = {
 	.handler =	ia64_mca_cmc_int_handler,
 	.flags =	SA_INTERRUPT,
@@ -149,12 +156,14 @@
  */
 static int cpe_poll_enabled = 1;
 
+extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size);
+
 /*
  *  ia64_mca_log_sal_error_record
  *
- *  This function retrieves a specified error record type from SAL, sends it to
- *  the system log, and notifies SALs to clear the record from its non-volatile
- *  memory.
+ *  This function retrieves a specified error record type from SAL,
+ *  wakes up any processes waiting for error records, and sends it to
+ *  the system log.
  *
  *  Inputs  :   sal_info_type   (Type of error record MCA/CMC/CPE/INIT)
  *  Outputs :   platform error status
@@ -162,11 +171,13 @@
 int
 ia64_mca_log_sal_error_record(int sal_info_type, int called_from_init)
 {
-	int platform_err = 0;
+	u8 *buffer;
+	u64 size;
+	int platform_err;
 
-	/* Get the MCA error record */
-	if (!ia64_log_get(sal_info_type, (prfunc_t)printk))
-		return platform_err;		/* no record retrieved */
+	size = ia64_log_get(sal_info_type, &buffer);
+	if (!size)
+		return 0;
 
 	/* TODO:
 	 * 1. analyze error logs to determine recoverability
@@ -174,10 +185,10 @@
 	 * 3. set ia64_os_mca_recovery_successful flag, if applicable
 	 */
 
+	salinfo_log_wakeup(sal_info_type, buffer, size);
 	platform_err = ia64_log_print(sal_info_type, (prfunc_t)printk);
-	/* temporary: only clear SAL logs on hardware-corrected errors
-		or if we're logging an error after an MCA-initiated reboot */
-	if ((sal_info_type > 1) || (called_from_init))
+	/* Clear logs from corrected errors in case there's no user-level logger */
+	if (sal_info_type == SAL_INFO_TYPE_CPE || sal_info_type == SAL_INFO_TYPE_CMC)
 		ia64_sal_clear_state_info(sal_info_type);
 
 	return platform_err;
@@ -450,7 +461,10 @@
 ia64_mca_register_cpev (int cpev)
 {
 	/* Register the CPE interrupt vector with SAL */
-	if (ia64_sal_mc_set_params(SAL_MC_PARAM_CPE_INT, SAL_MC_PARAM_MECHANISM_INT, cpev, 0, 0)) {
+	struct ia64_sal_retval isrv;
+
+	isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_CPE_INT, SAL_MC_PARAM_MECHANISM_INT, cpev, 0, 0);
+	if (isrv.status) {
 		printk(KERN_ERR "ia64_mca_platform_init: failed to register Corrected "
 		       "Platform Error interrupt vector with SAL.\n");
 		return;
@@ -602,6 +616,30 @@
 }
 
 /*
+ * ia64_mca_cmc_vector_disable_keventd
+ *
+ * Called via keventd (smp_call_function() is not safe in interrupt context) to
+ * disable the cmc interrupt vector.
+ */
+static void
+ia64_mca_cmc_vector_disable_keventd(void *unused)
+{
+	on_each_cpu(ia64_mca_cmc_vector_disable, NULL, 1, 0);
+}
+
+/*
+ * ia64_mca_cmc_vector_enable_keventd
+ *
+ * Called via keventd (smp_call_function() is not safe in interrupt context) to
+ * enable the cmc interrupt vector.
+ */
+static void
+ia64_mca_cmc_vector_enable_keventd(void *unused)
+{
+	on_each_cpu(ia64_mca_cmc_vector_enable, NULL, 1, 0);
+}
+
+/*
  * ia64_mca_init
  *
  *  Do all the system level mca specific initialization.
@@ -629,6 +667,8 @@
 	ia64_fptr_t *mca_hldlr_ptr = (ia64_fptr_t *)ia64_os_mca_dispatch;
 	int i;
 	s64 rc;
+	struct ia64_sal_retval isrv;
+	u64 timeout = IA64_MCA_RENDEZ_TIMEOUT;	/* platform specific */
 
 	IA64_MCA_DEBUG("ia64_mca_init: begin\n");
 
@@ -644,23 +684,33 @@
 	 */
 
 	/* Register the rendezvous interrupt vector with SAL */
-	if ((rc = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT,
-					 SAL_MC_PARAM_MECHANISM_INT,
-					 IA64_MCA_RENDEZ_VECTOR,
-					 IA64_MCA_RENDEZ_TIMEOUT,
-					 SAL_MC_PARAM_RZ_ALWAYS)))
-	{
+	while (1) {
+		isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_INT,
+					      SAL_MC_PARAM_MECHANISM_INT,
+					      IA64_MCA_RENDEZ_VECTOR,
+					      timeout,
+					      SAL_MC_PARAM_RZ_ALWAYS);
+		rc = isrv.status;
+		if (rc == 0)
+			break;
+		if (rc == -2) {
+			printk(KERN_INFO "ia64_mca_init: increasing MCA rendezvous timeout from "
+				"%ld to %ld\n", timeout, isrv.v0);
+			timeout = isrv.v0;
+			continue;
+		}
 		printk(KERN_ERR "ia64_mca_init: Failed to register rendezvous interrupt "
 		       "with SAL.  rc = %ld\n", rc);
 		return;
 	}
 
 	/* Register the wakeup interrupt vector with SAL */
-	if ((rc = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP,
-					 SAL_MC_PARAM_MECHANISM_INT,
-					 IA64_MCA_WAKEUP_VECTOR,
-					 0, 0)))
-	{
+	isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_RENDEZ_WAKEUP,
+				      SAL_MC_PARAM_MECHANISM_INT,
+				      IA64_MCA_WAKEUP_VECTOR,
+				      0, 0);
+	rc = isrv.status;
+	if (rc) {
 		printk(KERN_ERR "ia64_mca_init: Failed to register wakeup interrupt with SAL.  "
 		       "rc = %ld\n", rc);
 		return;
@@ -924,6 +974,9 @@
 void
 ia64_return_to_sal_check(void)
 {
+	pal_processor_state_info_t *psp = (pal_processor_state_info_t *)
+		&ia64_sal_to_os_handoff_state.proc_state_param;
+
 	/* Copy over some relevant stuff from the sal_to_os_mca_handoff
 	 * so that it can be used at the time of os_mca_to_sal_handoff
 	 */
@@ -933,14 +986,22 @@
 	ia64_os_to_sal_handoff_state.imots_sal_check_ra =
 		ia64_sal_to_os_handoff_state.imsto_sal_check_ra;
 
-	/* Cold Boot for uncorrectable MCA */
-	ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT;
+	/*
+	 * Did we correct the error? At the moment the only error that
+	 * we fix is a TLB error, if any other kind of error occurred
+	 * we must reboot.
+	 */
+	if (psp->cc == 1 && psp->bc == 1 && psp->rc == 1 && psp->uc == 1)
+		ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT;
+	else
+		ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_CORRECTED;
 
 	/* Default = tell SAL to return to same context */
 	ia64_os_to_sal_handoff_state.imots_context = IA64_MCA_SAME_CONTEXT;
 
 	ia64_os_to_sal_handoff_state.imots_new_min_state =
 		(u64 *)ia64_sal_to_os_handoff_state.pal_min_state;
+
 }
 
 /*
@@ -983,6 +1044,9 @@
 	ia64_return_to_sal_check();
 }
 
+static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL);
+static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd, NULL);
+
 /*
  * ia64_mca_cmc_int_handler
  *
@@ -1029,14 +1093,7 @@
 
 			cmc_polling_enabled = 1;
 			spin_unlock(&cmc_history_lock);
-
-			/*
-			 * We rely on the local_irq_enable() above so
-			 * that this can't deadlock.
-			 */
-			ia64_mca_cmc_vector_disable(NULL);
-
-			smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 0);
+			schedule_work(&cmc_disable_work);
 
 			/*
 			 * Corrected errors will still be corrected, but
@@ -1131,19 +1188,7 @@
 		if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) {
 
 			printk(KERN_WARNING "%s: Returning to interrupt driven CMC handler\n", __FUNCTION__);
-
-			/*
-			 * The cmc interrupt handler enabled irqs, so
-			 * this can't deadlock.
-			 */
-			smp_call_function(ia64_mca_cmc_vector_enable, NULL, 1, 0);
-
-			/*
-			 * Turn off interrupts before re-enabling the
-			 * cmc vector locally.  Make sure we get out.
-			 */
-			local_irq_disable();
-			ia64_mca_cmc_vector_enable(NULL);
+			schedule_work(&cmc_enable_work);
 			cmc_polling_enabled = 0;
 
 		} else {
@@ -1399,12 +1444,12 @@
  *	Get the current MCA log from SAL and copy it into the OS log buffer.
  *
  *  Inputs  :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
- *              prfunc      (fn ptr of log output function)
  *  Outputs :   size        (total record length)
+ *              *buffer     (ptr to error record)
  *
  */
-u64
-ia64_log_get(int sal_info_type, prfunc_t prfunc)
+static u64
+ia64_log_get(int sal_info_type, u8 **buffer)
 {
 	sal_log_record_header_t     *log_buffer;
 	u64                         total_len = 0;
@@ -1422,6 +1467,7 @@
 		IA64_LOG_UNLOCK(sal_info_type);
 		IA64_MCA_DEBUG("ia64_log_get: SAL error record type %d retrieved. "
 			       "Record length = %ld\n", sal_info_type, total_len);
+		*buffer = (u8 *) log_buffer;
 		return total_len;
 	} else {
 		IA64_LOG_UNLOCK(sal_info_type);
@@ -1466,7 +1512,7 @@
 void
 ia64_log_rec_header_print (sal_log_record_header_t *lh, prfunc_t prfunc)
 {
-	prfunc("+Err Record ID: %d    SAL Rev: %2x.%02x\n", lh->id,
+	prfunc("+Err Record ID: %ld    SAL Rev: %2x.%02x\n", lh->id,
 			lh->revision.major, lh->revision.minor);
 	prfunc("+Time: %02x/%02x/%02x%02x %02x:%02x:%02x    Severity %d\n",
 			lh->timestamp.slh_month, lh->timestamp.slh_day,
@@ -1589,13 +1635,13 @@
 	if (info->dl)
 		prfunc(" Line: Data,");
 	prfunc(" Operation: %s,", pal_cache_op[info->op]);
-	if (info->wv)
+	if (info->wiv)
 		prfunc(" Way: %d,", info->way);
 	if (cache_check_info->valid.target_identifier)
 		/* Hope target address is saved in target_identifier */
 		if (info->tv)
 			prfunc(" Target Addr: 0x%lx,", target_addr);
-	if (info->mc)
+	if (info->mcc)
 		prfunc(" MC: Corrected");
 	prfunc("\n");
 }
@@ -1631,13 +1677,13 @@
 		prfunc("  Failure: Data Translation Cache");
 	if (info->itr) {
 		prfunc("  Failure: Instruction Translation Register");
-		prfunc(" ,Slot: %d", info->tr_slot);
+		prfunc(" ,Slot: %ld", info->tr_slot);
 	}
 	if (info->dtr) {
 		prfunc("  Failure: Data Translation Register");
-		prfunc(" ,Slot: %d", info->tr_slot);
+		prfunc(" ,Slot: %ld", info->tr_slot);
 	}
-	if (info->mc)
+	if (info->mcc)
 		prfunc(" ,MC: Corrected");
 	prfunc("\n");
 }
@@ -1683,7 +1729,7 @@
 		prfunc(" ,Error: Internal");
 	if (info->eb)
 		prfunc(" ,Error: External");
-	if (info->mc)
+	if (info->mcc)
 		prfunc(" ,MC: Corrected");
 	if (info->tv)
 		prfunc(" ,Target Address: 0x%lx", targ_addr);
@@ -1970,9 +2016,9 @@
 		ia64_log_prt_guid(&psei->guid, prfunc);
 	}
 	if (psei->valid.oem_data) {
-		platform_plat_specific_err_print((int)psei->header.len,
-				      (int)sizeof(sal_log_plat_specific_err_info_t) - 1,
-				      &(psei->oem_data[0]), prfunc);
+		platform_plat_specific_err_print((int) psei->header.len,
+				      (char *) psei->oem_data - (char *) psei,
+				      &psei->oem_data[0], prfunc);
 	}
 	prfunc("\n");
 }
@@ -2352,13 +2398,12 @@
 
 	switch(sal_info_type) {
 	      case SAL_INFO_TYPE_MCA:
-		prfunc("+BEGIN HARDWARE ERROR STATE AT MCA\n");
-		platform_err = ia64_log_platform_info_print(IA64_LOG_CURR_BUFFER(sal_info_type),
-							    prfunc);
-		prfunc("+END HARDWARE ERROR STATE AT MCA\n");
+		prfunc("+CPU %d: SAL log contains MCA error record\n", smp_processor_id());
+		ia64_log_rec_header_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc);
 		break;
 	      case SAL_INFO_TYPE_INIT:
-		prfunc("+MCA INIT ERROR LOG (UNIMPLEMENTED)\n");
+		prfunc("+CPU %d: SAL log contains INIT error record\n", smp_processor_id());
+		ia64_log_rec_header_print(IA64_LOG_CURR_BUFFER(sal_info_type), prfunc);
 		break;
 	      case SAL_INFO_TYPE_CMC:
 		prfunc("+BEGIN HARDWARE ERROR STATE AT CMC\n");
diff -Nru a/arch/ia64/kernel/mca_asm.S b/arch/ia64/kernel/mca_asm.S
--- a/arch/ia64/kernel/mca_asm.S	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/mca_asm.S	Thu Jan  8 23:00:24 2004
@@ -14,6 +14,7 @@
 //		   3. Move stack ptr 16 bytes to conform to C calling convention
 //
 #include <linux/config.h>
+#include <linux/threads.h>
 
 #include <asm/asmmacro.h>
 #include <asm/pgtable.h>
@@ -22,20 +23,15 @@
 #include <asm/mca.h>
 
 /*
- * When we get an machine check, the kernel stack pointer is no longer
+ * When we get a machine check, the kernel stack pointer is no longer
  * valid, so we need to set a new stack pointer.
  */
 #define	MINSTATE_PHYS	/* Make sure stack access is physical for MINSTATE */
 
 /*
- * Needed for ia64_sal call
- */
-#define SAL_GET_STATE_INFO      0x01000001
-
-/*
  * Needed for return context to SAL
  */
-#define IA64_MCA_SAME_CONTEXT	0x0
+#define IA64_MCA_SAME_CONTEXT	0
 #define IA64_MCA_COLD_BOOT	-2
 
 #include "minstate.h"
@@ -71,19 +67,36 @@
  *	returns ptr to SAL rtn save loc in _tmp
  */
 #define OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(_tmp)	\
-	LOAD_PHYSICAL(p6, _tmp, ia64_sal_to_os_handoff_state);; \
-	LOAD_PHYSICAL(p7, _tmp, ia64_os_to_sal_handoff_state);; \
-(p6)	movl	r8=IA64_MCA_COLD_BOOT;			\
-(p6)	movl	r10=IA64_MCA_SAME_CONTEXT;		\
-(p6)	add     _tmp=0x18,_tmp;;			\
-(p6)	ld8	r9=[_tmp],0x10;				\
-(p6)	mov	r22=r0;;				\
-(p7)	ld8	r8=[_tmp],0x08;;			\
-(p7)	ld8	r9=[_tmp],0x08;;			\
-(p7)	ld8     r10=[_tmp],0x08;;			\
-(p7)	ld8     r22=[_tmp],0x08;;
+	movl	_tmp=ia64_os_to_sal_handoff_state;;	\
+	DATA_VA_TO_PA(_tmp);;				\
+	ld8	r8=[_tmp],0x08;;			\
+	ld8	r9=[_tmp],0x08;;			\
+	ld8	r10=[_tmp],0x08;;			\
+	ld8	r22=[_tmp],0x08;;
 	// now _tmp is pointing to SAL rtn save location
 
+/*
+ * COLD_BOOT_HANDOFF_STATE() sets ia64_mca_os_to_sal_state
+ *	imots_os_status=IA64_MCA_COLD_BOOT
+ *	imots_sal_gp=SAL GP
+ *	imots_context=IA64_MCA_SAME_CONTEXT
+ *	imots_new_min_state=Min state save area pointer
+ *	imots_sal_check_ra=Return address to location within SAL_CHECK
+ *
+ */
+#define COLD_BOOT_HANDOFF_STATE(sal_to_os_handoff,os_to_sal_handoff,tmp)\
+	movl	tmp=IA64_MCA_COLD_BOOT;					\
+	movl	sal_to_os_handoff=__pa(ia64_sal_to_os_handoff_state);	\
+	movl	os_to_sal_handoff=__pa(ia64_os_to_sal_handoff_state);;	\
+	st8	[os_to_sal_handoff]=tmp,8;;				\
+	ld8	tmp=[sal_to_os_handoff],48;;				\
+	st8	[os_to_sal_handoff]=tmp,8;;				\
+	movl	tmp=IA64_MCA_SAME_CONTEXT;;				\
+	st8	[os_to_sal_handoff]=tmp,8;;				\
+	ld8	tmp=[sal_to_os_handoff],-8;;				\
+	st8     [os_to_sal_handoff]=tmp,8;;				\
+	ld8	tmp=[sal_to_os_handoff];;				\
+	st8     [os_to_sal_handoff]=tmp;;
 
 	.global ia64_os_mca_dispatch
 	.global ia64_os_mca_dispatch_end
@@ -94,20 +107,19 @@
 	.global	ia64_mca_stackframe
 	.global	ia64_mca_bspstore
 	.global ia64_init_stack
-	.global ia64_mca_sal_data_area
-	.global ia64_tlb_functional
 
 	.text
 	.align 16
 
 ia64_os_mca_dispatch:
 
-#if defined(MCA_TEST)
-	// Pretend that we are in interrupt context
-	mov		r2=psr
-	dep		r2=0, r2, PSR_IC, 2;
-	mov		psr.l = r2
-#endif	/* #if defined(MCA_TEST) */
+	// Serialize all MCA processing
+	mov	r3=1;;
+	LOAD_PHYSICAL(p0,r2,ia64_mca_serialize);;
+ia64_os_mca_spin:
+	xchg8	r4=[r2],r3;;
+	cmp.ne	p6,p0=r4,r0
+(p6)	br ia64_os_mca_spin
 
 	// Save the SAL to OS MCA handoff state as defined
 	// by SAL SPEC 3.0
@@ -124,6 +136,187 @@
 
 ia64_os_mca_done_dump:
 
+	LOAD_PHYSICAL(p0,r16,ia64_sal_to_os_handoff_state+56)
+	;;
+	ld8 r18=[r16]		// Get processor state parameter on existing PALE_CHECK.
+	;;
+	tbit.nz p6,p7=r18,60
+(p7)	br.spnt done_tlb_purge_and_reload
+
+	// The following code purges TC and TR entries. Then reload all TC entries.
+	// Purge percpu data TC entries.
+begin_tlb_purge_and_reload:
+	mov r16=cr.lid
+	LOAD_PHYSICAL(p0,r17,ia64_mca_tlb_list) // Physical address of ia64_mca_tlb_list
+	mov r19=0
+	mov r20=NR_CPUS
+	;;
+1:	cmp.eq p6,p7=r19,r20
+(p6)	br.spnt.few err
+	ld8 r18=[r17],IA64_MCA_TLB_INFO_SIZE
+	;;
+	add r19=1,r19
+	cmp.eq p6,p7=r18,r16
+(p7)	br.sptk.few 1b
+	;;
+	adds r17=-IA64_MCA_TLB_INFO_SIZE,r17
+	;;
+	mov r23=r17		// save current ia64_mca_percpu_info addr pointer.
+	adds r17=16,r17
+	;;
+	ld8 r18=[r17],8		// r18=ptce_base
+  	;;
+	ld4 r19=[r17],4		// r19=ptce_count[0]
+	;;
+	ld4 r20=[r17],4		// r20=ptce_count[1]
+	;;
+	ld4 r21=[r17],4		// r21=ptce_stride[0]
+	mov r24=0
+	;;
+	ld4 r22=[r17],4		// r22=ptce_stride[1]
+	adds r20=-1,r20
+	;;
+2:
+	cmp.ltu p6,p7=r24,r19
+(p7)	br.cond.dpnt.few 4f
+	mov ar.lc=r20
+3:
+	ptc.e r18
+	;;
+	add r18=r22,r18
+	br.cloop.sptk.few 3b
+	;;
+	add r18=r21,r18
+	add r24=1,r24
+	;;
+	br.sptk.few 2b
+4:
+	srlz.i 			// srlz.i implies srlz.d
+	;;
+
+        // Now purge addresses formerly mapped by TR registers
+	// 1. Purge ITR&DTR for kernel.
+	movl r16=KERNEL_START
+	mov r18=KERNEL_TR_PAGE_SHIFT<<2
+	;;
+	ptr.i r16, r18
+	ptr.d r16, r18
+	;;
+	srlz.i
+	;;
+	srlz.d
+	;;
+	// 2. Purge DTR for PERCPU data.
+	movl r16=PERCPU_ADDR
+	mov r18=PERCPU_PAGE_SHIFT<<2
+	;;
+	ptr.d r16,r18
+	;;
+	srlz.d
+	;;
+	// 3. Purge ITR for PAL code.
+	adds r17=48,r23
+	;;
+	ld8 r16=[r17]
+	mov r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.i r16,r18
+	;;
+	srlz.i
+	;;
+	// 4. Purge DTR for stack.
+	mov r16=IA64_KR(CURRENT_STACK)
+	;;
+	shl r16=r16,IA64_GRANULE_SHIFT
+	movl r19=PAGE_OFFSET
+	;;
+	add r16=r19,r16
+	mov r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.d r16,r18
+	;;
+	srlz.i
+	;;
+	// Finally reload the TR registers.
+	// 1. Reload DTR/ITR registers for kernel.
+	mov r18=KERNEL_TR_PAGE_SHIFT<<2
+	movl r17=KERNEL_START
+	;;
+	mov cr.itir=r18
+	mov cr.ifa=r17
+        mov r16=IA64_TR_KERNEL
+	mov r19=ip
+	movl r18=PAGE_KERNEL
+	;;
+        dep r17=0,r19,0, KERNEL_TR_PAGE_SHIFT
+	;;
+	or r18=r17,r18
+	;;
+        itr.i itr[r16]=r18
+	;;
+        itr.d dtr[r16]=r18
+        ;;
+	srlz.i
+	srlz.d
+	;;
+	// 2. Reload DTR register for PERCPU data.
+	adds r17=8,r23
+	movl r16=PERCPU_ADDR		// vaddr
+	movl r18=PERCPU_PAGE_SHIFT<<2
+	;;
+	mov cr.itir=r18
+	mov cr.ifa=r16
+	;;
+	ld8 r18=[r17]			// pte
+	mov r16=IA64_TR_PERCPU_DATA;
+	;;
+	itr.d dtr[r16]=r18
+	;;
+	srlz.d
+	;;
+	// 3. Reload ITR for PAL code.
+	adds r17=40,r23
+	;;
+	ld8 r18=[r17],8			// pte
+	;;
+	ld8 r16=[r17]			// vaddr
+	mov r19=IA64_GRANULE_SHIFT<<2
+	;;
+	mov cr.itir=r19
+	mov cr.ifa=r16
+	mov r20=IA64_TR_PALCODE
+	;;
+	itr.i itr[r20]=r18
+	;;
+	srlz.i
+	;;
+	// 4. Reload DTR for stack.
+	mov r16=IA64_KR(CURRENT_STACK)
+	;;
+	shl r16=r16,IA64_GRANULE_SHIFT
+	movl r19=PAGE_OFFSET
+	;;
+	add r18=r19,r16
+	movl r20=PAGE_KERNEL
+	;;
+	add r16=r20,r16
+	mov r19=IA64_GRANULE_SHIFT<<2
+	;;
+	mov cr.itir=r19
+	mov cr.ifa=r18
+	mov r20=IA64_TR_CURRENT_STACK
+	;;
+	itr.d dtr[r20]=r16
+	;;
+	srlz.d
+	;;
+	br.sptk.many done_tlb_purge_and_reload
+err:
+	COLD_BOOT_HANDOFF_STATE(r20,r21,r22)
+	br.sptk.many ia64_os_mca_done_restore
+
+done_tlb_purge_and_reload:
+
 	// Setup new stack frame for OS_MCA handling
 	movl	r2=ia64_mca_bspstore;;	// local bspstore area location in r2
 	DATA_VA_TO_PA(r2);;
@@ -137,17 +330,11 @@
 					// (C calling convention)
 	DATA_VA_TO_PA(r12);;
 
-	// Check to see if the MCA resulted from a TLB error
-begin_tlb_error_check:
-        br      ia64_os_mca_tlb_error_check;;
-
-done_tlb_error_check:
-
-        // If TLB is functional, enter virtual mode from physical mode
+        // Enter virtual mode from physical mode
 	VIRTUAL_MODE_ENTER(r2, r3, ia64_os_mca_virtual_begin, r4)
 ia64_os_mca_virtual_begin:
 
-	// call our handler
+	// Call virtual mode handler
 	movl		r2=ia64_mca_ucmc_handler;;
 	mov		b6=r2;;
 	br.call.sptk.many    b0=b6;;
@@ -156,13 +343,6 @@
 	PHYSICAL_MODE_ENTER(r2, r3, ia64_os_mca_virtual_end, r4)
 ia64_os_mca_virtual_end:
 
-#if defined(MCA_TEST)
-	// Pretend that we are in interrupt context
-	mov	r2=psr;;
-	dep	r2=0, r2, PSR_IC, 2;;
-	mov	psr.l = r2;;
-#endif	/* #if defined(MCA_TEST) */
-
 	// restore the original stack frame here
 	movl    r2=ia64_mca_stackframe	// restore stack frame from memory at r2
 	;;
@@ -178,14 +358,16 @@
 	br	ia64_os_mca_proc_state_restore;;
 
 ia64_os_mca_done_restore:
-	movl	r3=ia64_tlb_functional;;
-	DATA_VA_TO_PA(r3);;
-	ld8	r3=[r3];;
-	cmp.eq	p6,p7=r0,r3;;
 	OS_MCA_TO_SAL_HANDOFF_STATE_RESTORE(r2);;
 	// branch back to SALE_CHECK
 	ld8		r3=[r2];;
 	mov		b0=r3;;		// SAL_CHECK return address
+
+	// release lock
+	movl		r3=ia64_mca_serialize;;
+	DATA_VA_TO_PA(r3);;
+	st8.rel		[r3]=r0
+
 	br		b0
 	;;
 ia64_os_mca_dispatch_end:
@@ -205,8 +387,7 @@
 ia64_os_mca_proc_state_dump:
 // Save bank 1 GRs 16-31 which will be used by c-language code when we switch
 //  to virtual addressing mode.
-	movl		r2=ia64_mca_proc_state_dump;;           // Os state dump area
-        DATA_VA_TO_PA(r2)                   // convert to to physical address
+	LOAD_PHYSICAL(p0,r2,ia64_mca_proc_state_dump)// convert OS state dump area to physical address
 
 // save ar.NaT
 	mov		r5=ar.unat                  // ar.unat
@@ -655,79 +836,6 @@
 	;;
 end_os_mca_restore:
 	br	ia64_os_mca_done_restore;;
-
-//EndStub//////////////////////////////////////////////////////////////////////
-
-//++
-// Name:
-//	ia64_os_mca_tlb_error_check()
-//
-// Stub Description:
-//
-//	This stub checks to see if the MCA resulted from a TLB error
-//
-//--
-
-ia64_os_mca_tlb_error_check:
-
-	// Retrieve sal data structure for uncorrected MCA
-
-	// Make the ia64_sal_get_state_info() call
-	movl	r4=ia64_mca_sal_data_area;;
-	movl	r7=ia64_sal;;
-	mov	r6=r1			// save gp
-	DATA_VA_TO_PA(r4)		// convert to physical address
-	DATA_VA_TO_PA(r7);;		// convert to physical address
-	ld8	r7=[r7]			// get addr of pdesc from ia64_sal
-	movl	r3=SAL_GET_STATE_INFO;;
-	DATA_VA_TO_PA(r7);;		// convert to physical address
-	ld8	r8=[r7],8;;		// get pdesc function pointer
-	dep	r8=0,r8,61,3;;		// convert SAL VA to PA
-	ld8	r1=[r7];;		// set new (ia64_sal) gp
-	dep	r1=0,r1,61,3;;		// convert SAL VA to PA
-	mov	b6=r8
-
-	alloc	r5=ar.pfs,8,0,8,0;;	// allocate stack frame for SAL call
-	mov	out0=r3			// which SAL proc to call
-	mov	out1=r0			// error type == MCA
-	mov	out2=r0			// null arg
-	mov	out3=r4			// data copy area
-	mov	out4=r0			// null arg
-	mov	out5=r0			// null arg
-	mov	out6=r0			// null arg
-	mov	out7=r0;;		// null arg
-
-	br.call.sptk.few	b0=b6;;
-
-	mov	r1=r6			// restore gp
-	mov	ar.pfs=r5;;		// restore ar.pfs
-
-	movl	r6=ia64_tlb_functional;;
-	DATA_VA_TO_PA(r6)		// needed later
-
-	cmp.eq	p6,p7=r0,r8;;		// check SAL call return address
-(p7)	st8	[r6]=r0			// clear tlb_functional flag
-(p7)    br	tlb_failure		// error; return to SAL
-
-	// examine processor error log for type of error
-	add	r4=40+24,r4;;		// parse past record header (length=40)
-					// and section header (length=24)
-	ld4	r4=[r4]			// get valid field of processor log
-	mov	r5=0xf00;;
-	and	r5=r4,r5;;		// read bits 8-11 of valid field
-					// to determine if we have a TLB error
-	movl	r3=0x1
-	cmp.eq	p6,p7=r0,r5;;
-	// if no TLB failure, set tlb_functional flag
-(p6)	st8	[r6]=r3
-	// else clear flag
-(p7)	st8	[r6]=r0
-
-	// if no TLB failure, continue with normal virtual mode logging
-(p6)    br	done_tlb_error_check
-	// else no point in entering virtual mode for logging
-tlb_failure:
-	br      ia64_os_mca_virtual_end
 
 //EndStub//////////////////////////////////////////////////////////////////////
 
diff -Nru a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
--- a/arch/ia64/kernel/perfmon.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/perfmon.c	Thu Jan  8 23:00:24 2004
@@ -5475,7 +5475,7 @@
 	int this_cpu;
 	int ret;
 
-	this_cpu = smp_processor_id();
+	this_cpu = get_cpu();
 	min      = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
 	max      = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
 
diff -Nru a/arch/ia64/kernel/perfmon_default_smpl.c b/arch/ia64/kernel/perfmon_default_smpl.c
--- a/arch/ia64/kernel/perfmon_default_smpl.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/perfmon_default_smpl.c	Thu Jan  8 23:00:24 2004
@@ -114,7 +114,7 @@
 	pfm_default_smpl_hdr_t *hdr;
 	pfm_default_smpl_entry_t *ent;
 	void *cur, *last;
-	unsigned long *e;
+	unsigned long *e, entry_size;
 	unsigned int npmds, i;
 	unsigned char ovfl_pmd;
 	unsigned char ovfl_notify;
@@ -131,8 +131,7 @@
 	ovfl_notify = arg->ovfl_notify;
 
 	/*
-	 * check for space against largest possibly entry.
-	 * We may waste space at the end of the buffer.
+	 * precheck for sanity
 	 */
 	if ((last - cur) < PFM_DEFAULT_MAX_ENTRY_SIZE) goto full;
 
@@ -142,6 +141,8 @@
 
 	prefetch(arg->smpl_pmds_values);
 
+	entry_size = sizeof(*ent) + (npmds << 3);
+
 	/* position for first pmd */
 	e = (unsigned long *)(ent+1);
 
@@ -191,7 +192,13 @@
 	/*
 	 * update position for next entry
 	 */
-	hdr->hdr_cur_offs += sizeof(*ent) + (npmds << 3);
+	hdr->hdr_cur_offs += entry_size;
+	cur               += entry_size;
+
+	/*
+	 * post check to avoid losing the last sample
+	 */
+	if ((last - cur) < PFM_DEFAULT_MAX_ENTRY_SIZE) goto full;
 
 	/*
 	 * keep same ovfl_pmds, ovfl_notify
diff -Nru a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
--- a/arch/ia64/kernel/ptrace.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/ptrace.c	Thu Jan  8 23:00:24 2004
@@ -29,6 +29,11 @@
 #include <asm/perfmon.h>
 #endif
 
+#include "entry.h"
+
+#define p4	(1UL << 4)	/* for pSys (see entry.h) */
+#define p5	(1UL << 5)	/* for pNonSys (see entry.h) */
+
 /*
  * Bits in the PSR that we allow ptrace() to change:
  *	be, up, ac, mfl, mfh (the user mask; five bits total)
@@ -51,6 +56,14 @@
 # define dprintk(format...)
 #endif
 
+/* Return TRUE if PT was created due to kernel-entry via a system-call.  */
+
+static inline int
+in_syscall (struct pt_regs *pt)
+{
+	return (long) pt->cr_ifs >= 0;
+}
+
 /*
  * Collect the NaT bits for r1-r31 from scratch_unat and return a NaT
  * bitset where bit i is set iff the NaT bit of register i is set.
@@ -272,7 +285,7 @@
 	ubspstore = (unsigned long *) pt->ar_bspstore;
 
 	urbs_kargs = urbs_end;
-	if ((long)pt->cr_ifs >= 0) {
+	if (in_syscall(pt)) {
 		/*
 		 * If entered via syscall, don't allow user to set rnat bits
 		 * for syscall args.
@@ -331,6 +344,13 @@
 		*rnat1_kaddr = ((*rnat1_kaddr & ~m) | (rnat1 & m));
 }
 
+static inline int
+on_kernel_rbs (unsigned long addr, unsigned long bspstore, unsigned long urbs_end)
+{
+	return (addr >= bspstore
+		&& addr <= (unsigned long) ia64_rse_rnat_addr((unsigned long *) urbs_end));
+}
+
 /*
  * Read a word from the user-level backing store of task CHILD.  ADDR is the user-level
  * address to read the word from, VAL a pointer to the return value, and USER_BSP gives
@@ -355,7 +375,7 @@
 	child_regs = ia64_task_regs(child);
 	bspstore = (unsigned long *) child_regs->ar_bspstore;
 	krbs = (unsigned long *) child + IA64_RBS_OFFSET/8;
-	if (laddr >= bspstore && laddr <= ia64_rse_rnat_addr(urbs_end)) {
+	if (on_kernel_rbs(addr, (unsigned long) bspstore, (unsigned long) urbs_end)) {
 		/*
 		 * Attempt to read the RBS in an area that's actually on the kernel RBS =>
 		 * read the corresponding bits in the kernel RBS.
@@ -406,7 +426,7 @@
 	child_regs = ia64_task_regs(child);
 	bspstore = (unsigned long *) child_regs->ar_bspstore;
 	krbs = (unsigned long *) child + IA64_RBS_OFFSET/8;
-	if (laddr >= bspstore && laddr <= ia64_rse_rnat_addr(urbs_end)) {
+	if (on_kernel_rbs(addr, (unsigned long) bspstore, (unsigned long) urbs_end)) {
 		/*
 		 * Attempt to write the RBS in an area that's actually on the kernel RBS
 		 * => write the corresponding bits in the kernel RBS.
@@ -443,7 +463,7 @@
 	ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));
 	cfm = pt->cr_ifs & ~(1UL << 63);
 
-	if ((long) pt->cr_ifs >= 0) {
+	if (in_syscall(pt)) {
 		/*
 		 * If bit 63 of cr.ifs is cleared, the kernel was entered via a system
 		 * call and we need to recover the CFM that existed on entry to the
@@ -483,134 +503,80 @@
 	return 0;
 }
 
-/*
- * Simulate user-level "flushrs".  Note: we can't just add pt->loadrs>>16 to
- * pt->ar_bspstore because the kernel backing store and the user-level backing store may
- * have different alignments (and therefore a different number of intervening rnat slots).
- */
-static void
-user_flushrs (struct task_struct *task, struct pt_regs *pt)
-{
-	unsigned long *krbs;
-	long ndirty;
-
-	krbs = (unsigned long *) task + IA64_RBS_OFFSET/8;
-	ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));
-
-	pt->ar_bspstore = (unsigned long) ia64_rse_skip_regs((unsigned long *) pt->ar_bspstore,
-							     ndirty);
-	pt->loadrs = 0;
-}
-
-static inline void
-sync_user_rbs_one_thread (struct task_struct *p, int make_writable)
-{
-	struct switch_stack *sw;
-	unsigned long urbs_end;
-	struct pt_regs *pt;
-
-	sw = (struct switch_stack *) (p->thread.ksp + 16);
-	pt = ia64_task_regs(p);
-	urbs_end = ia64_get_user_rbs_end(p, pt, NULL);
-	ia64_sync_user_rbs(p, sw, pt->ar_bspstore, urbs_end);
-	if (make_writable)
-		user_flushrs(p, pt);
-}
-
-struct task_list {
-	struct task_list *next;
-	struct task_struct *task;
-};
-
-#ifdef CONFIG_SMP
-
-static inline void
-collect_task (struct task_list **listp, struct task_struct *p, int make_writable)
+static inline int
+thread_matches (struct task_struct *thread, unsigned long addr)
 {
-	struct task_list *e;
-
-	e = kmalloc(sizeof(*e), GFP_KERNEL);
-	if (!e)
-		/* oops, can't collect more: finish at least what we collected so far... */
-		return;
+	unsigned long thread_rbs_end;
+	struct pt_regs *thread_regs;
 
-	get_task_struct(p);
-	e->task = p;
-	e->next = *listp;
-	*listp = e;
-}
+	if (ptrace_check_attach(thread, 0) < 0)
+		/*
+		 * If the thread is not in an attachable state, we'll ignore it.
+		 * The net effect is that if ADDR happens to overlap with the
+		 * portion of the thread's register backing store that is
+		 * currently residing on the thread's kernel stack, then ptrace()
+		 * may end up accessing a stale value.  But if the thread isn't
+		 * stopped, that's a problem anyhow, so we're doing as well as we
+		 * can...
+		 */
+		return 0;
 
-static inline struct task_list *
-finish_task (struct task_list *list, int make_writable)
-{
-	struct task_list *next = list->next;
+	thread_regs = ia64_task_regs(thread);
+	thread_rbs_end = ia64_get_user_rbs_end(thread, thread_regs, NULL);
+	if (!on_kernel_rbs(addr, thread_regs->ar_bspstore, thread_rbs_end))
+		return 0;
 
-	sync_user_rbs_one_thread(list->task, make_writable);
-	put_task_struct(list->task);
-	kfree(list);
-	return next;
+	return 1;	/* looks like we've got a winner */
 }
 
-#else
-# define collect_task(list, p, make_writable)	sync_user_rbs_one_thread(p, make_writable)
-# define finish_task(list, make_writable)	(NULL)
-#endif
-
 /*
- * Synchronize the RSE backing store of CHILD and all tasks that share the address space
- * with it.  CHILD_URBS_END is the address of the end of the register backing store of
- * CHILD.  If MAKE_WRITABLE is set, a user-level "flushrs" is simulated such that the VM
- * can be written via ptrace() and the tasks will pick up the newly written values.  It
- * would be OK to unconditionally simulate a "flushrs", but this would be more intrusive
- * than strictly necessary (e.g., it would make it impossible to obtain the original value
- * of ar.bspstore).
+ * GDB apparently wants to be able to read the register-backing store of any thread when
+ * attached to a given process.  If we are peeking or poking an address that happens to
+ * reside in the kernel-backing store of another thread, we need to attach to that thread,
+ * because otherwise we end up accessing stale data.
+ *
+ * task_list_lock must be read-locked before calling this routine!
  */
-static void
-threads_sync_user_rbs (struct task_struct *child, unsigned long child_urbs_end, int make_writable)
+static struct task_struct *
+find_thread_for_addr (struct task_struct *child, unsigned long addr)
 {
-	struct switch_stack *sw;
 	struct task_struct *g, *p;
 	struct mm_struct *mm;
-	struct pt_regs *pt;
-	long multi_threaded;
+	int mm_users;
 
-	task_lock(child);
-	{
-		mm = child->mm;
-		multi_threaded = mm && (atomic_read(&mm->mm_users) > 1);
-	}
-	task_unlock(child);
+	if (!(mm = get_task_mm(child)))
+		return child;
 
-	if (!multi_threaded) {
-		sw = (struct switch_stack *) (child->thread.ksp + 16);
-		pt = ia64_task_regs(child);
-		ia64_sync_user_rbs(child, sw, pt->ar_bspstore, child_urbs_end);
-		if (make_writable)
-			user_flushrs(child, pt);
-	} else {
-		/*
-		 * Note: we can't call ia64_sync_user_rbs() while holding the
-		 * tasklist_lock because that may cause a dead-lock: ia64_sync_user_rbs()
-		 * may indirectly call tlb_flush_all(), which triggers an IPI.
-		 * Furthermore, tasklist_lock is acquired by fork() with interrupts
-		 * disabled, so with the right timing, the IPI never completes, hence
-		 * tasklist_lock never gets released, hence fork() never completes...
-		 */
-		struct task_list *list = NULL;
+	mm_users = atomic_read(&mm->mm_users) - 1;	/* -1 because of our get_task_mm()... */
+	if (mm_users <= 1)
+		goto out;		/* not multi-threaded */
 
-		read_lock(&tasklist_lock);
-		{
-			do_each_thread(g, p) {
-				if (p->mm == mm && p->state != TASK_RUNNING)
-					collect_task(&list, p, make_writable);
-			} while_each_thread(g, p);
+	/*
+	 * First, traverse the child's thread-list.  Good for scalability with
+	 * NPTL-threads.
+	 */
+	p = child;
+	do {
+		if (thread_matches(p, addr)) {
+			child = p;
+			goto out;
 		}
-		read_unlock(&tasklist_lock);
+		if (mm_users-- <= 1)
+			goto out;
+	} while ((p = next_thread(p)) != child);
 
-		while (list)
-			list = finish_task(list, make_writable);
-	}
-	child->thread.flags |= IA64_THREAD_KRBS_SYNCED;	/* set the flag in the child thread only */
+	do_each_thread(g, p) {
+		if (child->mm != mm)
+			continue;
+
+		if (thread_matches(p, addr)) {
+			child = p;
+			goto out;
+		}
+	} while_each_thread(g, p);
+  out:
+	mmput(mm);
+	return child;
 }
 
 /*
@@ -668,12 +634,40 @@
 	return ret;
 }
 
+/*
+ * Change the machine-state of CHILD such that it will return via the normal
+ * kernel exit-path, rather than the syscall-exit path.
+ */
+static void
+convert_to_non_syscall (struct task_struct *child, struct pt_regs  *pt, unsigned long cfm)
+{
+	struct unw_frame_info info, prev_info;
+	unsigned long ip, pr;
+
+	unw_init_from_blocked_task(&info, child);
+	while (1) {
+		prev_info = info;
+		if (unw_unwind(&info) < 0)
+			return;
+		if (unw_get_rp(&info, &ip) < 0)
+			return;
+		if (ip < FIXADDR_USER_END)
+			break;
+	}
+
+	unw_get_pr(&prev_info, &pr);
+	pr &= ~pSys;
+	pr |= pNonSys;
+	unw_set_pr(&prev_info, pr);
+
+	pt->cr_ifs = (1UL << 63) | cfm;
+}
+
 static int
 access_uarea (struct task_struct *child, unsigned long addr, unsigned long *data, int write_access)
 {
-	unsigned long *ptr, regnum, urbs_end, rnat_addr;
+	unsigned long *ptr, regnum, urbs_end, rnat_addr, cfm;
 	struct switch_stack *sw;
-	struct unw_frame_info info;
 	struct pt_regs *pt;
 
 	pt = ia64_task_regs(child);
@@ -778,13 +772,30 @@
 			 * By convention, we use PT_AR_BSP to refer to the end of the user-level
 			 * backing store.  Use ia64_rse_skip_regs(PT_AR_BSP, -CFM.sof) to get
 			 * the real value of ar.bsp at the time the kernel was entered.
+			 *
+			 * Furthermore, when changing the contents of PT_AR_BSP (or
+			 * PT_CFM) we MUST copy any users-level stacked registers that are
+			 * stored on the kernel stack back to user-space because
+			 * otherwise, we might end up clobbering kernel stacked registers.
+			 * Also, if this happens while the task is blocked in a system
+			 * call, which convert the state such that the non-system-call
+			 * exit path is used.  This ensures that the proper state will be
+			 * picked up when resuming execution.  However, it *also* means
+			 * that once we write PT_AR_BSP/PT_CFM, it won't be possible to
+			 * modify the syscall arguments of the pending system call any
+			 * longer.  This shouldn't be an issue because modifying
+			 * PT_AR_BSP/PT_CFM generally implies that we're either abandoning
+			 * the pending system call or that we defer it's re-execution
+			 * (e.g., due to GDB doing an inferior function call).
 			 */
-			urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
+			urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
 			if (write_access) {
 				if (*data != urbs_end) {
 					if (ia64_sync_user_rbs(child, sw,
 							       pt->ar_bspstore, urbs_end) < 0)
 						return -1;
+					if (in_syscall(pt))
+						convert_to_non_syscall(child, pt, cfm);
 					/* simulate user-level write of ar.bsp: */
 					pt->loadrs = 0;
 					pt->ar_bspstore = *data;
@@ -794,27 +805,19 @@
 			return 0;
 
 		      case PT_CFM:
-			if ((long) pt->cr_ifs < 0) {
-				if (write_access)
+			urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
+			if (write_access) {
+				if (((cfm ^ *data) & 0x3fffffffffU) != 0) {
+					if (ia64_sync_user_rbs(child, sw,
+							       pt->ar_bspstore, urbs_end) < 0)
+						return -1;
+					if (in_syscall(pt))
+						convert_to_non_syscall(child, pt, cfm);
 					pt->cr_ifs = ((pt->cr_ifs & ~0x3fffffffffUL)
 						      | (*data & 0x3fffffffffUL));
-				else
-					*data = pt->cr_ifs & 0x3fffffffffUL;
-			} else {
-				/* kernel was entered through a system call */
-				unsigned long cfm;
-
-				unw_init_from_blocked_task(&info, child);
-				if (unw_unwind_to_user(&info) < 0)
-					return -1;
-
-				unw_get_cfm(&info, &cfm);
-				if (write_access)
-					unw_set_cfm(&info, ((cfm & ~0x3fffffffffU)
-							    | (*data & 0x3fffffffffUL)));
-				else
-					*data = cfm;
-			}
+				}
+			} else
+				*data = cfm;
 			return 0;
 
 		      case PT_CR_IPSR:
@@ -1240,9 +1243,6 @@
 	/* make sure the single step/take-branch tra bits are not set: */
 	child_psr->ss = 0;
 	child_psr->tb = 0;
-
-	/* Turn off flag indicating that the KRBS is sync'd with child's VM: */
-	child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
 }
 
 asmlinkage long
@@ -1250,7 +1250,7 @@
 	    long arg4, long arg5, long arg6, long arg7, long stack)
 {
 	struct pt_regs *pt, *regs = (struct pt_regs *) &stack;
-	unsigned long urbs_end;
+	unsigned long urbs_end, peek_or_poke;
 	struct task_struct *child;
 	struct switch_stack *sw;
 	long ret;
@@ -1269,12 +1269,17 @@
 		goto out;
 	}
 
+	peek_or_poke = (request == PTRACE_PEEKTEXT || request == PTRACE_PEEKDATA
+			|| request == PTRACE_POKETEXT || request == PTRACE_POKEDATA);
 	ret = -ESRCH;
 	read_lock(&tasklist_lock);
 	{
 		child = find_task_by_pid(pid);
-		if (child)
+		if (child) {
+			if (peek_or_poke)
+				child = find_thread_for_addr(child, addr);
 			get_task_struct(child);
+		}
 	}
 	read_unlock(&tasklist_lock);
 	if (!child)
@@ -1299,10 +1304,6 @@
 	      case PTRACE_PEEKTEXT:
 	      case PTRACE_PEEKDATA:		/* read word at location addr */
 		urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
-
-		if (!(child->thread.flags & IA64_THREAD_KRBS_SYNCED))
-			threads_sync_user_rbs(child, urbs_end, 0);
-
 		ret = ia64_peek(child, sw, urbs_end, addr, &data);
 		if (ret == 0) {
 			ret = data;
@@ -1313,9 +1314,6 @@
 	      case PTRACE_POKETEXT:
 	      case PTRACE_POKEDATA:		/* write the word at location addr */
 		urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
-		if (!(child->thread.flags & IA64_THREAD_KRBS_SYNCED))
-			threads_sync_user_rbs(child, urbs_end, 1);
-
 		ret = ia64_poke(child, sw, urbs_end, addr, data);
 		goto out_tsk;
 
@@ -1359,9 +1357,6 @@
 		ia64_psr(pt)->ss = 0;
 		ia64_psr(pt)->tb = 0;
 
-		/* Turn off flag indicating that the KRBS is sync'd with child's VM: */
-		child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
-
 		wake_up_process(child);
 		ret = 0;
 		goto out_tsk;
@@ -1380,9 +1375,6 @@
 		ia64_psr(pt)->ss = 0;
 		ia64_psr(pt)->tb = 0;
 
-		/* Turn off flag indicating that the KRBS is sync'd with child's VM: */
-		child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
-
 		wake_up_process(child);
 		ret = 0;
 		goto out_tsk;
@@ -1401,9 +1393,6 @@
 		}
 		child->exit_code = data;
 
-		/* Turn off flag indicating that the KRBS is sync'd with child's VM: */
-		child->thread.flags &= ~IA64_THREAD_KRBS_SYNCED;
-
 		/* give it a chance to run. */
 		wake_up_process(child);
 		ret = 0;
@@ -1432,7 +1421,9 @@
 	return ret;
 }
 
-void
+/* "asmlinkage" so the input arguments are preserved... */
+
+asmlinkage void
 syscall_trace (void)
 {
 	if (!test_thread_flag(TIF_SYSCALL_TRACE))
diff -Nru a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c
--- a/arch/ia64/kernel/salinfo.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/salinfo.c	Thu Jan  8 23:00:24 2004
@@ -3,18 +3,31 @@
  *
  * Creates entries in /proc/sal for various system features.
  *
- * Copyright (c) 2001 Silicon Graphics, Inc.  All rights reserved.
+ * Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
+ * Copyright (c) 2003 Hewlett-Packard Co
+ *	Bjorn Helgaas <bjorn.helgaas@hp.com>
  *
- * 09/11/2003	jbarnes@sgi.com		updated for 2.6
  * 10/30/2001	jbarnes@sgi.com		copied much of Stephane's palinfo
  *					code to create this file
+ * Oct 23 2003	kaos@sgi.com
+ *   Replace IPI with set_cpus_allowed() to read a record from the required cpu.
+ *   Redesign salinfo log processing to separate interrupt and user space
+ *   contexts.
+ *   Cache the record across multi-block reads from user space.
+ *   Support > 64 cpus.
+ *   Delete module_exit and MOD_INC/DEC_COUNT, salinfo cannot be a module.
  */
 
 #include <linux/types.h>
 #include <linux/proc_fs.h>
 #include <linux/module.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/vmalloc.h>
 
+#include <asm/semaphore.h>
 #include <asm/sal.h>
+#include <asm/uaccess.h>
 
 MODULE_AUTHOR("Jesse Barnes <jbarnes@sgi.com>");
 MODULE_DESCRIPTION("/proc interface to IA-64 SAL features");
@@ -41,42 +54,516 @@
 
 #define NR_SALINFO_ENTRIES ARRAY_SIZE(salinfo_entries)
 
-/*
- * One for each feature and one more for the directory entry...
+static char *salinfo_log_name[] = {
+	"mca",
+	"init",
+	"cmc",
+	"cpe",
+};
+
+static struct proc_dir_entry *salinfo_proc_entries[
+	ARRAY_SIZE(salinfo_entries) +			/* /proc/sal/bus_lock */
+	ARRAY_SIZE(salinfo_log_name) +			/* /proc/sal/{mca,...} */
+	(2 * ARRAY_SIZE(salinfo_log_name)) +		/* /proc/sal/mca/{event,data} */
+	1];						/* /proc/sal */
+
+/* Some records we get ourselves, some are accessed as saved data in buffers
+ * that are owned by mca.c.
+ */
+struct salinfo_data_saved {
+	u8*			buffer;
+	u64			size;
+	u64			id;
+	int			cpu;
+};
+
+/* State transitions.  Actions are :-
+ *   Write "read <cpunum>" to the data file.
+ *   Write "clear <cpunum>" to the data file.
+ *   Write "oemdata <cpunum> <offset> to the data file.
+ *   Read from the data file.
+ *   Close the data file.
+ *
+ * Start state is NO_DATA.
+ *
+ * NO_DATA
+ *    write "read <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "oemdata <cpunum> <offset> -> return -EINVAL.
+ *    read data -> return EOF.
+ *    close -> unchanged.  Free record areas.
+ *
+ * LOG_RECORD
+ *    write "read <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "oemdata <cpunum> <offset> -> format the oem data, goto OEMDATA.
+ *    read data -> return the INIT/MCA/CMC/CPE record.
+ *    close -> unchanged.  Keep record areas.
+ *
+ * OEMDATA
+ *    write "read <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
+ *    write "oemdata <cpunum> <offset> -> format the oem data, goto OEMDATA.
+ *    read data -> return the formatted oemdata.
+ *    close -> unchanged.  Keep record areas.
+ *
+ * Closing the data file does not change the state.  This allows shell scripts
+ * to manipulate salinfo data, each shell redirection opens the file, does one
+ * action then closes it again.  The record areas are only freed at close when
+ * the state is NO_DATA.
+ */
+enum salinfo_state {
+	STATE_NO_DATA,
+	STATE_LOG_RECORD,
+	STATE_OEMDATA,
+};
+
+struct salinfo_data {
+	volatile cpumask_t	cpu_event;	/* which cpus have outstanding events */
+	struct semaphore	sem;		/* count of cpus with outstanding events (bits set in cpu_event) */
+	u8			*log_buffer;
+	u64			log_size;
+	u8			*oemdata;	/* decoded oem data */
+	u64			oemdata_size;
+	int			open;		/* single-open to prevent races */
+	u8			type;
+	u8			saved_num;	/* using a saved record? */
+	enum salinfo_state	state :8;	/* processing state */
+	u8			padding;
+	int			cpu_check;	/* next CPU to check */
+	struct salinfo_data_saved data_saved[5];/* save last 5 records from mca.c, must be < 255 */
+};
+
+static struct salinfo_data salinfo_data[ARRAY_SIZE(salinfo_log_name)];
+
+static spinlock_t data_lock, data_saved_lock;
+
+/** salinfo_platform_oemdata - optional callback to decode oemdata from an error
+ * record.
+ * @sect_header: pointer to the start of the section to decode.
+ * @oemdata: returns vmalloc area containing the decded output.
+ * @oemdata_size: returns length of decoded output (strlen).
+ *
+ * Description: If user space asks for oem data to be decoded by the kernel
+ * and/or prom and the platform has set salinfo_platform_oemdata to the address
+ * of a platform specific routine then call that routine.  salinfo_platform_oemdata
+ * vmalloc's and formats its output area, returning the address of the text
+ * and its strlen.  Returns 0 for success, -ve for error.  The callback is
+ * invoked on the cpu that generated the error record.
  */
-static struct proc_dir_entry *salinfo_proc_entries[NR_SALINFO_ENTRIES + 1];
+int (*salinfo_platform_oemdata)(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size);
+
+struct salinfo_platform_oemdata_parms {
+	const u8 *efi_guid;
+	u8 **oemdata;
+	u64 *oemdata_size;
+	int ret;
+};
+
+static void
+salinfo_platform_oemdata_cpu(void *context)
+{
+	struct salinfo_platform_oemdata_parms *parms = context;
+	parms->ret = salinfo_platform_oemdata(parms->efi_guid, parms->oemdata, parms->oemdata_size);
+}
+
+static void
+shift1_data_saved (struct salinfo_data *data, int shift)
+{
+	memcpy(data->data_saved+shift, data->data_saved+shift+1,
+	       (ARRAY_SIZE(data->data_saved) - (shift+1)) * sizeof(data->data_saved[0]));
+	memset(data->data_saved + ARRAY_SIZE(data->data_saved) - 1, 0,
+	       sizeof(data->data_saved[0]));
+}
+
+/* This routine is invoked in interrupt context.  Note: mca.c enables
+ * interrupts before calling this code for CMC/CPE.  MCA and INIT events are
+ * not irq safe, do not call any routines that use spinlocks, they may deadlock.
+ *
+ * The buffer passed from mca.c points to the output from ia64_log_get. This is
+ * a persistent buffer but its contents can change between the interrupt and
+ * when user space processes the record.  Save the record id to identify
+ * changes.
+ */
+void
+salinfo_log_wakeup(int type, u8 *buffer, u64 size)
+{
+	struct salinfo_data *data = salinfo_data + type;
+	struct salinfo_data_saved *data_saved;
+	unsigned long flags = 0;
+	int i, irqsafe = type != SAL_INFO_TYPE_MCA && type != SAL_INFO_TYPE_INIT;
+	int saved_size = ARRAY_SIZE(data->data_saved);
+
+	BUG_ON(type >= ARRAY_SIZE(salinfo_log_name));
+
+	if (irqsafe)
+		spin_lock_irqsave(&data_saved_lock, flags);
+	for (i = 0, data_saved = data->data_saved; i < saved_size; ++i, ++data_saved) {
+		if (!data_saved->buffer)
+			break;
+	}
+	if (i == saved_size) {
+		if (!data->saved_num) {
+			shift1_data_saved(data, 0);
+			data_saved = data->data_saved + saved_size - 1;
+		} else
+			data_saved = NULL;
+	}
+	if (data_saved) {
+		data_saved->cpu = smp_processor_id();
+		data_saved->id = ((sal_log_record_header_t *)buffer)->id;
+		data_saved->size = size;
+		data_saved->buffer = buffer;
+	}
+	if (irqsafe)
+		spin_unlock_irqrestore(&data_saved_lock, flags);
+
+	if (!test_and_set_bit(smp_processor_id(), &data->cpu_event)) {
+		if (irqsafe)
+			up(&data->sem);
+	}
+}
+
+static int
+salinfo_event_open(struct inode *inode, struct file *file)
+{
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+	return 0;
+}
+
+static ssize_t
+salinfo_event_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
+{
+	struct inode *inode = file->f_dentry->d_inode;
+	struct proc_dir_entry *entry = PDE(inode);
+	struct salinfo_data *data = entry->data;
+	char cmd[32];
+	size_t size;
+	int i, n, cpu = -1;
+
+retry:
+	if (down_trylock(&data->sem)) {
+		if (file->f_flags & O_NONBLOCK)
+			return -EAGAIN;
+		if (down_interruptible(&data->sem))
+			return -ERESTARTSYS;
+	}
+
+	n = data->cpu_check;
+	for (i = 0; i < NR_CPUS; i++) {
+		if (test_bit(n, &data->cpu_event)) {
+			cpu = n;
+			break;
+		}
+		if (++n == NR_CPUS)
+			n = 0;
+	}
+
+	if (cpu == -1)
+		goto retry;
+
+	/* events are sticky until the user says "clear" */
+	up(&data->sem);
+
+	/* for next read, start checking at next CPU */
+	data->cpu_check = cpu;
+	if (++data->cpu_check == NR_CPUS)
+		data->cpu_check = 0;
+
+	snprintf(cmd, sizeof(cmd), "read %d\n", cpu);
+
+	size = strlen(cmd);
+	if (size > count)
+		size = count;
+	if (copy_to_user(buffer, cmd, size))
+		return -EFAULT;
+
+	return size;
+}
+
+static struct file_operations salinfo_event_fops = {
+	.open  = salinfo_event_open,
+	.read  = salinfo_event_read,
+};
+
+static int
+salinfo_log_open(struct inode *inode, struct file *file)
+{
+	struct proc_dir_entry *entry = PDE(inode);
+	struct salinfo_data *data = entry->data;
+
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
+	spin_lock(&data_lock);
+	if (data->open) {
+		spin_unlock(&data_lock);
+		return -EBUSY;
+	}
+	data->open = 1;
+	spin_unlock(&data_lock);
+
+	if (data->state == STATE_NO_DATA &&
+	    !(data->log_buffer = vmalloc(ia64_sal_get_state_info_size(data->type)))) {
+		data->open = 0;
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static int
+salinfo_log_release(struct inode *inode, struct file *file)
+{
+	struct proc_dir_entry *entry = PDE(inode);
+	struct salinfo_data *data = entry->data;
+
+	if (data->state == STATE_NO_DATA) {
+		vfree(data->log_buffer);
+		vfree(data->oemdata);
+		data->log_buffer = NULL;
+		data->oemdata = NULL;
+	}
+	spin_lock(&data_lock);
+	data->open = 0;
+	spin_unlock(&data_lock);
+	return 0;
+}
+
+static void
+call_on_cpu(int cpu, void (*fn)(void *), void *arg)
+{
+	cpumask_t save_cpus_allowed, new_cpus_allowed;
+	memcpy(&save_cpus_allowed, &current->cpus_allowed, sizeof(save_cpus_allowed));
+	memset(&new_cpus_allowed, 0, sizeof(new_cpus_allowed));
+	set_bit(cpu, &new_cpus_allowed);
+	set_cpus_allowed(current, new_cpus_allowed);
+	(*fn)(arg);
+	set_cpus_allowed(current, save_cpus_allowed);
+}
+
+static void
+salinfo_log_read_cpu(void *context)
+{
+	struct salinfo_data *data = context;
+	data->log_size = ia64_sal_get_state_info(data->type, (u64 *) data->log_buffer);
+	if (data->type == SAL_INFO_TYPE_CPE || data->type == SAL_INFO_TYPE_CMC)
+		ia64_sal_clear_state_info(data->type);
+}
+
+static void
+salinfo_log_new_read(int cpu, struct salinfo_data *data)
+{
+	struct salinfo_data_saved *data_saved;
+	unsigned long flags;
+	int i;
+	int saved_size = ARRAY_SIZE(data->data_saved);
+
+	data->saved_num = 0;
+	spin_lock_irqsave(&data_saved_lock, flags);
+retry:
+	for (i = 0, data_saved = data->data_saved; i < saved_size; ++i, ++data_saved) {
+		if (data_saved->buffer && data_saved->cpu == cpu) {
+			sal_log_record_header_t *rh = (sal_log_record_header_t *)(data_saved->buffer);
+			data->log_size = data_saved->size;
+			memcpy(data->log_buffer, rh, data->log_size);
+			barrier();	/* id check must not be moved */
+			if (rh->id == data_saved->id) {
+				data->saved_num = i+1;
+				break;
+			}
+			/* saved record changed by mca.c since interrupt, discard it */
+			shift1_data_saved(data, i);
+			goto retry;
+		}
+	}
+	spin_unlock_irqrestore(&data_saved_lock, flags);
+
+	if (!data->saved_num)
+		call_on_cpu(cpu, salinfo_log_read_cpu, data);
+	data->state = data->log_size ? STATE_LOG_RECORD : STATE_NO_DATA;
+}
+
+static ssize_t
+salinfo_log_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
+{
+	struct inode *inode = file->f_dentry->d_inode;
+	struct proc_dir_entry *entry = PDE(inode);
+	struct salinfo_data *data = entry->data;
+	void *saldata;
+	size_t size;
+	u8 *buf;
+	u64 bufsize;
+
+	if (data->state == STATE_LOG_RECORD) {
+		buf = data->log_buffer;
+		bufsize = data->log_size;
+	} else if (data->state == STATE_OEMDATA) {
+		buf = data->oemdata;
+		bufsize = data->oemdata_size;
+	} else {
+		buf = NULL;
+		bufsize = 0;
+	}
+	if (*ppos >= bufsize)
+		return 0;
+
+	saldata = buf + file->f_pos;
+	size = bufsize - file->f_pos;
+	if (size > count)
+		size = count;
+	if (copy_to_user(buffer, saldata, size))
+		return -EFAULT;
+
+	*ppos += size;
+	return size;
+}
+
+static void
+salinfo_log_clear_cpu(void *context)
+{
+	struct salinfo_data *data = context;
+	ia64_sal_clear_state_info(data->type);
+}
+
+static int
+salinfo_log_clear(struct salinfo_data *data, int cpu)
+{
+	data->state = STATE_NO_DATA;
+	if (!test_bit(cpu, &data->cpu_event))
+		return 0;
+	down(&data->sem);
+	clear_bit(cpu, &data->cpu_event);
+	if (data->saved_num) {
+		unsigned long flags;
+		spin_lock_irqsave(&data_saved_lock, flags);
+		shift1_data_saved(data, data->saved_num - 1 );
+		data->saved_num = 0;
+		spin_unlock_irqrestore(&data_saved_lock, flags);
+	}
+	/* ia64_mca_log_sal_error_record or salinfo_log_read_cpu already cleared
+	 * CPE and CMC errors
+	 */
+	if (data->type != SAL_INFO_TYPE_CPE && data->type != SAL_INFO_TYPE_CMC)
+		call_on_cpu(cpu, salinfo_log_clear_cpu, data);
+	/* clearing a record may make a new record visible */
+	salinfo_log_new_read(cpu, data);
+	if (data->state == STATE_LOG_RECORD &&
+	    !test_and_set_bit(cpu,  &data->cpu_event))
+		up(&data->sem);
+	return 0;
+}
+
+static ssize_t
+salinfo_log_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
+{
+	struct inode *inode = file->f_dentry->d_inode;
+	struct proc_dir_entry *entry = PDE(inode);
+	struct salinfo_data *data = entry->data;
+	char cmd[32];
+	size_t size;
+	u32 offset;
+	int cpu;
+
+	size = sizeof(cmd);
+	if (count < size)
+		size = count;
+	if (copy_from_user(cmd, buffer, size))
+		return -EFAULT;
+
+	if (sscanf(cmd, "read %d", &cpu) == 1) {
+		salinfo_log_new_read(cpu, data);
+	} else if (sscanf(cmd, "clear %d", &cpu) == 1) {
+		int ret;
+		if ((ret = salinfo_log_clear(data, cpu)))
+			count = ret;
+	} else if (sscanf(cmd, "oemdata %d %d", &cpu, &offset) == 2) {
+		if (data->state != STATE_LOG_RECORD && data->state != STATE_OEMDATA)
+			return -EINVAL;
+		if (offset > data->log_size - sizeof(efi_guid_t))
+			return -EINVAL;
+		data->state = STATE_OEMDATA;
+		if (salinfo_platform_oemdata) {
+			struct salinfo_platform_oemdata_parms parms = {
+				.efi_guid = data->log_buffer + offset,
+				.oemdata = &data->oemdata,
+				.oemdata_size = &data->oemdata_size
+			};
+			call_on_cpu(cpu, salinfo_platform_oemdata_cpu, &parms);
+			if (parms.ret)
+				count = parms.ret;
+		} else
+			data->oemdata_size = 0;
+	} else
+		return -EINVAL;
+
+	return count;
+}
+
+static struct file_operations salinfo_data_fops = {
+	.open    = salinfo_log_open,
+	.release = salinfo_log_release,
+	.read    = salinfo_log_read,
+	.write   = salinfo_log_write,
+};
 
 static int __init
 salinfo_init(void)
 {
 	struct proc_dir_entry *salinfo_dir; /* /proc/sal dir entry */
 	struct proc_dir_entry **sdir = salinfo_proc_entries; /* keeps track of every entry */
-	int i;
+	struct proc_dir_entry *dir, *entry;
+	struct salinfo_data *data;
+	int i, j, online;
 
 	salinfo_dir = proc_mkdir("sal", NULL);
+	if (!salinfo_dir)
+		return 0;
 
 	for (i=0; i < NR_SALINFO_ENTRIES; i++) {
 		/* pass the feature bit in question as misc data */
-		*sdir = create_proc_read_entry (salinfo_entries[i].name, 0, salinfo_dir,
+		*sdir++ = create_proc_read_entry (salinfo_entries[i].name, 0, salinfo_dir,
 						  salinfo_read, (void *)salinfo_entries[i].feature);
-		if (*sdir)
-			(*sdir)->owner = THIS_MODULE;
-		sdir++;
 	}
-	*sdir++ = salinfo_dir;
-
-	return 0;
-}
 
-static void __exit
-salinfo_exit(void)
-{
-	int i = 0;
+	for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) {
+		data = salinfo_data + i;
+		data->type = i;
+		sema_init(&data->sem, 0);
+		dir = proc_mkdir(salinfo_log_name[i], salinfo_dir);
+		if (!dir)
+			continue;
+
+		entry = create_proc_entry("event", S_IRUSR, dir);
+		if (!entry)
+			continue;
+		entry->data = data;
+		entry->proc_fops = &salinfo_event_fops;
+		*sdir++ = entry;
+
+		entry = create_proc_entry("data", S_IRUSR | S_IWUSR, dir);
+		if (!entry)
+			continue;
+		entry->data = data;
+		entry->proc_fops = &salinfo_data_fops;
+		*sdir++ = entry;
+
+		/* we missed any events before now */
+		online = 0;
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j)) {
+				set_bit(j, &data->cpu_event);
+				++online;
+			}
+		sema_init(&data->sem, online);
 
-	for (i = 0; i < NR_SALINFO_ENTRIES ; i++) {
-		if (salinfo_proc_entries[i])
-			remove_proc_entry (salinfo_proc_entries[i]->name, NULL);
+		*sdir++ = dir;
 	}
+
+	*sdir++ = salinfo_dir;
+
+	return 0;
 }
 
 /*
@@ -102,4 +589,3 @@
 }
 
 module_init(salinfo_init);
-module_exit(salinfo_exit);
diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/setup.c	Thu Jan  8 23:00:23 2004
@@ -54,6 +54,10 @@
 # error "struct cpuinfo_ia64 too big!"
 #endif
 
+#ifdef CONFIG_EFI
+int efi_enabled = 1;
+#endif
+
 #ifdef CONFIG_SMP
 unsigned long __per_cpu_offset[NR_CPUS];
 #endif
diff -Nru a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
--- a/arch/ia64/kernel/signal.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/signal.c	Thu Jan  8 23:00:24 2004
@@ -538,31 +538,41 @@
 	if (!oldset)
 		oldset = &current->blocked;
 
-	if (IS_IA32_PROCESS(&scr->pt)) {
-		if (in_syscall) {
-			if (errno >= 0)
-				restart = 0;
-			else
-				errno = -errno;
-		}
-	} else if ((long) scr->pt.r10 != -1)
-		/*
-		 * A system calls has to be restarted only if one of the error codes
-		 * ERESTARTNOHAND, ERESTARTSYS, or ERESTARTNOINTR is returned.  If r10
-		 * isn't -1 then r8 doesn't hold an error code and we don't need to
-		 * restart the syscall, so we can clear the "restart" flag here.
-		 */
-		restart = 0;
-
+	/*
+	 * This only loops in the rare cases of handle_signal() failing, in which case we
+	 * need to push through a forced SIGSEGV.
+	 */
 	while (1) {
 		int signr = get_signal_to_deliver(&info, &scr->pt, NULL);
 
+		/*
+		 * get_signal_to_deliver() may have run a debugger (via notify_parent())
+		 * and the debugger may have modified the state (e.g., to arrange for an
+		 * inferior call), thus it's important to check for restarting _after_
+		 * get_signal_to_deliver().
+		 */
+		if (IS_IA32_PROCESS(&scr->pt)) {
+			if (in_syscall) {
+				if (errno >= 0)
+					restart = 0;
+				else
+					errno = -errno;
+			}
+		} else if ((long) scr->pt.r10 != -1)
+			/*
+			 * A system calls has to be restarted only if one of the error codes
+			 * ERESTARTNOHAND, ERESTARTSYS, or ERESTARTNOINTR is returned.  If r10
+			 * isn't -1 then r8 doesn't hold an error code and we don't need to
+			 * restart the syscall, so we can clear the "restart" flag here.
+			 */
+			restart = 0;
+
 		if (signr <= 0)
 			break;
 
 		ka = &current->sighand->action[signr - 1];
 
-		if (restart) {
+		if (unlikely(restart)) {
 			switch (errno) {
 			      case ERESTART_RESTARTBLOCK:
 			      case ERESTARTNOHAND:
@@ -582,6 +592,7 @@
 					scr->pt.cr_iip -= 2;
 				} else
 					ia64_decrement_ip(&scr->pt);
+				restart = 0; /* don't restart twice if handle_signal() fails... */
 			}
 		}
 
diff -Nru a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c
--- a/arch/ia64/kernel/smpboot.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/kernel/smpboot.c	Thu Jan  8 23:00:23 2004
@@ -466,7 +466,7 @@
 #ifdef CONFIG_NUMA
 
 /* on which node is each logical CPU (one cacheline even for 64 CPUs) */
-volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned;
+volatile u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
 /* which logical CPUs are on which nodes */
 volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
 
diff -Nru a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c
--- a/arch/ia64/kernel/traps.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/traps.c	Thu Jan  8 23:00:24 2004
@@ -216,21 +216,6 @@
 }
 
 /*
- * Unimplemented system calls.  This is called only for stuff that
- * we're supposed to implement but haven't done so yet.  Everything
- * else goes to sys_ni_syscall.
- *
- * XXX Remove this for v2.6.1.
- */
-asmlinkage long
-ia64_ni_syscall (unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3,
-		 unsigned long arg4, unsigned long arg5, unsigned long arg6, unsigned long arg7,
-		 unsigned long stack)
-{
-	return -ENOSYS;
-}
-
-/*
  * disabled_fph_fault() is called when a user-level process attempts to access f32..f127
  * and it doesn't own the fp-high register partition.  When this happens, we save the
  * current fph partition in the task_struct of the fpu-owner (if necessary) and then load
diff -Nru a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
--- a/arch/ia64/kernel/vmlinux.lds.S	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/kernel/vmlinux.lds.S	Thu Jan  8 23:00:24 2004
@@ -151,7 +151,7 @@
 	{ *(.con_initcall.init) }
   __con_initcall_end = .;
   __security_initcall_start = .;
-  .security_initcall.init : AT(ADDR(.security_initcall.init) - PAGE_OFFSET)
+  .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET)
 	{ *(.security_initcall.init) }
   __security_initcall_end = .;
   . = ALIGN(PAGE_SIZE);
diff -Nru a/arch/ia64/lib/Makefile b/arch/ia64/lib/Makefile
--- a/arch/ia64/lib/Makefile	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/lib/Makefile	Thu Jan  8 23:00:24 2004
@@ -13,6 +13,7 @@
 lib-$(CONFIG_MCKINLEY)	+= copy_page_mck.o memcpy_mck.o
 lib-$(CONFIG_PERFMON)	+= carta_random.o
 lib-$(CONFIG_MD_RAID5)	+= xor.o
+lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
 
 AFLAGS___divdi3.o	=
 AFLAGS___udivdi3.o	= -DUNSIGNED
diff -Nru a/arch/ia64/lib/dec_and_lock.c b/arch/ia64/lib/dec_and_lock.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/lib/dec_and_lock.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2003 Jerome Marchand, Bull S.A.
+ *	Cleaned up by David Mosberger-Tang <davidm@hpl.hp.com>
+ *
+ * This file is released under the GPLv2, or at your option any later version.
+ *
+ * ia64 version of "atomic_dec_and_lock()" using the atomic "cmpxchg" instruction.  This
+ * code is an adaptation of the x86 version of "atomic_dec_and_lock()".
+ */
+
+#include <linux/compiler.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <asm/atomic.h>
+
+/*
+ * Decrement REFCOUNT and if the count reaches zero, acquire the spinlock.  Both of these
+ * operations have to be done atomically, so that the count doesn't drop to zero without
+ * acquiring the spinlock first.
+ */
+int
+atomic_dec_and_lock (atomic_t *refcount, spinlock_t *lock)
+{
+	int old, new;
+
+	do {
+		old = atomic_read(refcount);
+		new = old - 1;
+
+		if (unlikely (old == 1)) {
+			/* oops, we may be decrementing to zero, do it the slow way... */
+			spin_lock(lock);
+			if (atomic_dec_and_test(refcount))
+				return 1;
+			spin_unlock(lock);
+			return 0;
+		}
+	} while (cmpxchg(&refcount->counter, old, new) != old);
+	return 0;
+}
+
+EXPORT_SYMBOL(atomic_dec_and_lock);
diff -Nru a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
--- a/arch/ia64/mm/discontig.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/mm/discontig.c	Thu Jan  8 23:00:24 2004
@@ -134,94 +134,69 @@
 				     int node)
 {
 	unsigned long epfn, cpu, cpus;
-	unsigned long pernodesize = 0, pernode;
-       	void *cpu_data;
+	unsigned long pernodesize = 0, pernode, pages, mapsize;
+	void *cpu_data;
 	struct bootmem_data *bdp = &mem_data[node].bootmem_data;
 
 	epfn = (start + len) >> PAGE_SHIFT;
 
+	pages = bdp->node_low_pfn - (bdp->node_boot_start >> PAGE_SHIFT);
+	mapsize = bootmem_bootmap_pages(pages) << PAGE_SHIFT;
+
 	/*
 	 * Make sure this memory falls within this node's usable memory
 	 * since we may have thrown some away in build_maps().
 	 */
-	if (start < bdp->node_boot_start ||
-	    epfn > bdp->node_low_pfn)
+	if (start < bdp->node_boot_start || epfn > bdp->node_low_pfn)
 		return 0;
 
 	/* Don't setup this node's local space twice... */
-	if (!mem_data[node].pernode_addr) {
-		/*
-		 * Calculate total size needed, incl. what's necessary
-		 * for good alignment and alias prevention.
-		 */
-		cpus = early_nr_cpus_node(node);
-		pernodesize += PERCPU_PAGE_SIZE * cpus;
-		pernodesize += L1_CACHE_ALIGN(sizeof(pg_data_t));
-		pernodesize += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
-		pernodesize = PAGE_ALIGN(pernodesize);
-		pernode = NODEDATA_ALIGN(start, node);
-
-		/* Is this range big enough for what we want to store here? */
-		if (start + len > (pernode + pernodesize)) {
-			mem_data[node].pernode_addr = pernode;
-			mem_data[node].pernode_size = pernodesize;
-			memset(__va(pernode), 0, pernodesize);
-
-			cpu_data = (void *)pernode;
-			pernode += PERCPU_PAGE_SIZE * cpus;
-
-			mem_data[node].pgdat = __va(pernode);
-			pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
-
-			mem_data[node].node_data = __va(pernode);
-			pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
-
-			mem_data[node].pgdat->bdata = bdp;
-			pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
-
-			/*
-			 * Copy the static per-cpu data into the region we
-			 * just set aside and then setup __per_cpu_offset
-			 * for each CPU on this node.
-			 */
-			for (cpu = 0; cpu < NR_CPUS; cpu++) {
-				if (node == node_cpuid[cpu].nid) {
-					memcpy(__va(cpu_data), __phys_per_cpu_start,
-					       __per_cpu_end-__per_cpu_start);
-					__per_cpu_offset[cpu] =
-						(char*)__va(cpu_data) -
-						__per_cpu_start;
-					cpu_data += PERCPU_PAGE_SIZE;
-				}
-			}
-		}
-	}
+	if (mem_data[node].pernode_addr)
+		return 0;
+
+	/*
+	 * Calculate total size needed, incl. what's necessary
+	 * for good alignment and alias prevention.
+	 */
+	cpus = early_nr_cpus_node(node);
+	pernodesize += PERCPU_PAGE_SIZE * cpus;
+	pernodesize += L1_CACHE_ALIGN(sizeof(pg_data_t));
+	pernodesize += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
+	pernodesize = PAGE_ALIGN(pernodesize);
+	pernode = NODEDATA_ALIGN(start, node);
+
+	/* Is this range big enough for what we want to store here? */
+	if (start + len > (pernode + pernodesize + mapsize)) {
+		mem_data[node].pernode_addr = pernode;
+		mem_data[node].pernode_size = pernodesize;
+		memset(__va(pernode), 0, pernodesize);
+
+		cpu_data = (void *)pernode;
+		pernode += PERCPU_PAGE_SIZE * cpus;
+
+		mem_data[node].pgdat = __va(pernode);
+		pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
 
-	pernode = mem_data[node].pernode_addr;
-	pernodesize = mem_data[node].pernode_size;
-	if (pernode && !bdp->node_bootmem_map) {
-		unsigned long pages, mapsize, map = 0;
-
-		pages = bdp->node_low_pfn -
-			(bdp->node_boot_start >> PAGE_SHIFT);
-		mapsize = bootmem_bootmap_pages(pages) << PAGE_SHIFT;
+		mem_data[node].node_data = __va(pernode);
+		pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
+
+		mem_data[node].pgdat->bdata = bdp;
+		pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
 
 		/*
-		 * The map will either contain the pernode area or begin
-		 * after it.
+		 * Copy the static per-cpu data into the region we
+		 * just set aside and then setup __per_cpu_offset
+		 * for each CPU on this node.
 		 */
-		if (pernode - start > mapsize)
-			map = start;
-		else if (start + len - pernode - pernodesize > mapsize)
-			map = pernode + pernodesize;
-
-		if (map) {
-			init_bootmem_node(mem_data[node].pgdat,
-					  map>>PAGE_SHIFT,
-					  bdp->node_boot_start>>PAGE_SHIFT,
-					  bdp->node_low_pfn);
+		for (cpu = 0; cpu < NR_CPUS; cpu++) {
+			if (node == node_cpuid[cpu].nid) {
+				memcpy(__va(cpu_data), __phys_per_cpu_start,
+				       __per_cpu_end - __per_cpu_start);
+				__per_cpu_offset[cpu] = (char*)__va(cpu_data) -
+					__per_cpu_start;
+				cpu_data += PERCPU_PAGE_SIZE;
+			}
 		}
-
 	}
 
 	return 0;
@@ -314,6 +289,8 @@
  */
 void __init find_memory(void)
 {
+	int node;
+
 	reserve_memory();
 
 	if (numnodes == 0) {
@@ -327,6 +304,31 @@
 	/* These actually end up getting called by call_pernode_memory() */
 	efi_memmap_walk(filter_rsvd_memory, build_node_maps);
 	efi_memmap_walk(filter_rsvd_memory, find_pernode_space);
+
+	/*
+	 * Initialize the boot memory maps in reverse order since that's
+	 * what the bootmem allocator expects
+	 */
+	for (node = numnodes - 1; node >= 0; node--) {
+		unsigned long pernode, pernodesize, map;
+		struct bootmem_data *bdp;
+
+		bdp = &mem_data[node].bootmem_data;
+		pernode = mem_data[node].pernode_addr;
+		pernodesize = mem_data[node].pernode_size;
+		map = pernode + pernodesize;
+
+		/* Sanity check... */
+		if (!pernode)
+			panic("pernode space for node %d "
+			      "could not be allocated!", node);
+
+		init_bootmem_node(mem_data[node].pgdat,
+				  map>>PAGE_SHIFT,
+				  bdp->node_boot_start>>PAGE_SHIFT,
+				  bdp->node_low_pfn);
+	}
+
 	efi_memmap_walk(filter_rsvd_memory, free_node_bootmem);
 
 	reserve_pernode_space();
diff -Nru a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c
--- a/arch/ia64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
@@ -144,17 +144,6 @@
 
 	return 0;
 }
-/* This function checks if the address and address+len falls out of HugeTLB region.  It
- * return -EINVAL if any part of address range falls in HugeTLB region.
- */
-int  check_valid_hugepage_range(unsigned long addr, unsigned long len)
-{
-	if (REGION_NUMBER(addr) == REGION_HPAGE)
-		return -EINVAL;
-	if (REGION_NUMBER(addr+len) == REGION_HPAGE)
-		return -EINVAL;
-	return 0;
-}
 
 int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
 			struct vm_area_struct *vma)
@@ -272,6 +261,59 @@
 	free_huge_page(page);
 }
 
+/*
+ * Same as generic free_pgtables(), except constant PGDIR_* and pgd_offset
+ * are hugetlb region specific.
+ */
+void hugetlb_free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *prev,
+	unsigned long start, unsigned long end)
+{
+	unsigned long first = start & HUGETLB_PGDIR_MASK;
+	unsigned long last = end + HUGETLB_PGDIR_SIZE - 1;
+	unsigned long start_index, end_index;
+	struct mm_struct *mm = tlb->mm;
+
+	if (!prev) {
+		prev = mm->mmap;
+		if (!prev)
+			goto no_mmaps;
+		if (prev->vm_end > start) {
+			if (last > prev->vm_start)
+				last = prev->vm_start;
+			goto no_mmaps;
+		}
+	}
+	for (;;) {
+		struct vm_area_struct *next = prev->vm_next;
+
+		if (next) {
+			if (next->vm_start < start) {
+				prev = next;
+				continue;
+			}
+			if (last > next->vm_start)
+				last = next->vm_start;
+		}
+		if (prev->vm_end > first)
+			first = prev->vm_end + HUGETLB_PGDIR_SIZE - 1;
+		break;
+	}
+no_mmaps:
+	if (last < first)	/* for arches with discontiguous pgd indices */
+		return;
+	/*
+	 * If the PGD bits are not consecutive in the virtual address, the
+	 * old method of shifting the VA >> by PGDIR_SHIFT doesn't work.
+	 */
+
+	start_index = pgd_index(htlbpage_to_page(first));
+	end_index = pgd_index(htlbpage_to_page(last));
+
+	if (end_index > start_index) {
+		clear_page_tables(tlb, start_index, end_index - start_index);
+	}
+}
+
 void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
 {
 	struct mm_struct *mm = vma->vm_mm;
@@ -518,7 +560,7 @@
 	return 1;
 }
 
-static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int unused)
+static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
diff -Nru a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
--- a/arch/ia64/mm/init.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ia64/mm/init.c	Thu Jan  8 23:00:23 2004
@@ -34,6 +34,7 @@
 #include <asm/tlb.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
+#include <asm/mca.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
@@ -277,6 +278,10 @@
 {
 	unsigned long psr, pta, impl_va_bits;
 	extern void __init tlb_init (void);
+#ifdef CONFIG_IA64_MCA
+	int cpu;
+#endif
+
 #ifdef CONFIG_DISABLE_VHPT
 #	define VHPT_ENABLE_BIT	0
 #else
@@ -335,6 +340,22 @@
 	ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | VHPT_ENABLE_BIT);
 
 	ia64_tlb_init();
+
+#ifdef	CONFIG_IA64_MCA
+	cpu = smp_processor_id();
+
+	/* mca handler uses cr.lid as key to pick the right entry */
+	ia64_mca_tlb_list[cpu].cr_lid = ia64_getreg(_IA64_REG_CR_LID);
+
+	/* insert this percpu data information into our list for MCA recovery purposes */
+	ia64_mca_tlb_list[cpu].percpu_paddr = pte_val(mk_pte_phys(__pa(my_cpu_data), PAGE_KERNEL));
+	/* Also save per-cpu tlb flush recipe for use in physical mode mca handler */
+	ia64_mca_tlb_list[cpu].ptce_base = local_cpu_data->ptce_base;
+	ia64_mca_tlb_list[cpu].ptce_count[0] = local_cpu_data->ptce_count[0];
+	ia64_mca_tlb_list[cpu].ptce_count[1] = local_cpu_data->ptce_count[1];
+	ia64_mca_tlb_list[cpu].ptce_stride[0] = local_cpu_data->ptce_stride[0];
+	ia64_mca_tlb_list[cpu].ptce_stride[1] = local_cpu_data->ptce_stride[1];
+#endif
 }
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
diff -Nru a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
--- a/arch/ia64/pci/pci.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ia64/pci/pci.c	Thu Jan  8 23:00:24 2004
@@ -153,7 +153,7 @@
 	res->end = end;
 	res->flags = flags;
 
-	if (request_resource(root, res))
+	if (insert_resource(root, res))
 		return -EBUSY;
 
 	return 0;
@@ -260,7 +260,6 @@
 	unsigned int windows = 0;
 	char *name;
 
-	printk("PCI: Probing PCI hardware on bus (%04x:%02x)\n", domain, bus);
 	controller = alloc_pci_controller(domain);
 	if (!controller)
 		goto out1;
diff -Nru a/arch/m68k/Kconfig b/arch/m68k/Kconfig
--- a/arch/m68k/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/m68k/Kconfig	Thu Jan  8 23:00:24 2004
@@ -1025,7 +1025,7 @@
 	  implementation entirely in software (which can sometimes fail to
 	  reboot the machine) and a driver for hardware watchdog boards, which
 	  are more robust and can also keep track of the temperature inside
-	  your computer. For details, read <file:Documentation/watchdog.txt>
+	  your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
 	  in the kernel source.
 
 	  The watchdog is usually used together with the watchdog daemon
diff -Nru a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
--- a/arch/m68k/kernel/ints.c	Thu Jan  8 23:00:24 2004
+++ b/arch/m68k/kernel/ints.c	Thu Jan  8 23:00:24 2004
@@ -253,19 +253,18 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
 	/* autovector interrupts */
 	if (mach_default_handler) {
-		for (i = 0; i < SYS_IRQS; i++) {
+		if (i < SYS_IRQS) {
 			seq_printf(p, "auto %2d: %10u ", i,
 			               i ? kstat_cpu(0).irqs[i] : num_spurious);
 			seq_puts(p, "  ");
 			seq_printf(p, "%s\n", irq_list[i].devname);
 		}
-	}
-
-	mach_get_irq_list(p, v);
+	} else if (i == SYS_IRQS)
+		mach_get_irq_list(p, v);
 	return 0;
 }
 
diff -Nru a/arch/m68knommu/platform/5307/ints.c b/arch/m68knommu/platform/5307/ints.c
--- a/arch/m68knommu/platform/5307/ints.c	Thu Jan  8 23:00:23 2004
+++ b/arch/m68knommu/platform/5307/ints.c	Thu Jan  8 23:00:23 2004
@@ -254,9 +254,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -269,7 +269,7 @@
 		seq_printf(p, "%s\n", irq_list[i].devname);
 	}
 
-	if (mach_get_irq_list)
+	if (i == NR_IRQS && mach_get_irq_list)
 		mach_get_irq_list(p, v);
 	return(0);
 }
diff -Nru a/arch/m68knommu/platform/68328/ints.c b/arch/m68knommu/platform/68328/ints.c
--- a/arch/m68knommu/platform/68328/ints.c	Thu Jan  8 23:00:23 2004
+++ b/arch/m68knommu/platform/68328/ints.c	Thu Jan  8 23:00:23 2004
@@ -198,9 +198,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -211,7 +211,8 @@
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
diff -Nru a/arch/m68knommu/platform/68360/ints.c b/arch/m68knommu/platform/68360/ints.c
--- a/arch/m68knommu/platform/68360/ints.c	Thu Jan  8 23:00:23 2004
+++ b/arch/m68knommu/platform/68360/ints.c	Thu Jan  8 23:00:23 2004
@@ -278,9 +278,9 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 
-	for (i = 0; i < NR_IRQS; i++) {
+	if (i < NR_IRQS) {
 		if (int_irq_list[i].flags & IRQ_FLG_STD)
 			continue;
 
@@ -291,7 +291,8 @@
 			seq_printf(p, "  ");
 		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
-	seq_printf(p, "   : %10u   spurious\n", num_spurious);
+	if (i == NR_IRQS)
+		seq_printf(p, "   : %10u   spurious\n", num_spurious);
 
 	return 0;
 }
diff -Nru a/arch/mips/Kconfig b/arch/mips/Kconfig
--- a/arch/mips/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/mips/Kconfig	Thu Jan  8 23:00:24 2004
@@ -1261,8 +1261,8 @@
 	  You want to read the Sound-HOWTO, available from
 	  <http://www.tldp.org/docs.html#howto>. General information about
 	  the modular sound system is contained in the files
-	  <file:Documentation/sound/Introduction>.  The file
-	  <file:Documentation/sound/README.OSS> contains some slightly
+	  <file:Documentation/sound/oss/Introduction>.  The file
+	  <file:Documentation/sound/oss/README.OSS> contains some slightly
 	  outdated but still useful information as well.
 
 	  If you have a PnP sound card and you want to configure it at boot
@@ -1270,7 +1270,7 @@
 	  <http://www.roestock.demon.co.uk/isapnptools/>), then you need to
 	  compile the sound card support as a module and load that module
 	  after the PnP configuration is finished. To do this, choose M here
-	  and read <file:Documentation/sound/README.modules>; the module
+	  and read <file:Documentation/sound/oss/README.modules>; the module
 	  will be called soundcore.
 
 	  I'm told that even without a sound card, you can make your computer
diff -Nru a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
--- a/arch/mips/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/mips/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -85,17 +85,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -117,10 +119,10 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+	} else if (i == NR_IRQS) {
+		seq_putc(p, '\n');
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 	}
-	seq_putc(p, '\n');
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-
 	return 0;
 }
 
@@ -825,45 +827,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS 8
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, unsigned long *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	unsigned long value;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	value = 0;
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		value = (value << 4) | c;
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -872,18 +835,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -896,7 +851,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -918,20 +873,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t *mask = (cpumask_t *)data, tmp;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	tmp = *mask;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -941,7 +886,7 @@
 	cpumask_t *mask = (cpumask_t *)data, new_value;
 	unsigned long full_count = count, err;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c
--- a/arch/mips/mm/highmem.c	Thu Jan  8 23:00:23 2004
+++ b/arch/mips/mm/highmem.c	Thu Jan  8 23:00:23 2004
@@ -40,6 +40,7 @@
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -64,6 +65,7 @@
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -79,6 +81,7 @@
 #endif
 
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 struct page *kmap_atomic_to_page(void *ptr)
diff -Nru a/arch/parisc/Kconfig b/arch/parisc/Kconfig
--- a/arch/parisc/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/Kconfig	Thu Jan  8 23:00:24 2004
@@ -169,50 +169,9 @@
 
 endmenu
 
-source "drivers/base/Kconfig"
-
-# source "drivers/mtd/Kconfig"
-
-source "drivers/parport/Kconfig"
-
-# source "drivers/pnp/Kconfig"
-
-source "drivers/block/Kconfig"
-
-source "drivers/ide/Kconfig"
-
-source "drivers/scsi/Kconfig"
-
-source "drivers/md/Kconfig"
-
-source drivers/message/fusion/Kconfig
-
-#source drivers/ieee1394/Kconfig
-
-#source drivers/message/i2o/Kconfig
-
-source "net/Kconfig"
-
-#source "drivers/isdn/Kconfig"
-
-#source "drivers/telephony/Kconfig"
-
-# input before char - char/joystick depends on it. As does USB.
-source "drivers/input/Kconfig"
-
-source "drivers/char/Kconfig"
-
-#source "drivers/misc/Kconfig"
-
-source "drivers/media/Kconfig"
+source "drivers/Kconfig"
 
 source "fs/Kconfig"
-
-source "drivers/video/Kconfig"
-
-source "sound/Kconfig"
-
-source "drivers/usb/Kconfig"
 
 source "arch/parisc/oprofile/Kconfig"
 
diff -Nru a/arch/parisc/configs/712_defconfig b/arch/parisc/configs/712_defconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/parisc/configs/712_defconfig	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,637 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_KMOD is not set
+
+#
+# Processor type and features
+#
+# CONFIG_PA7000 is not set
+CONFIG_PA7100LC=y
+# CONFIG_PA7200 is not set
+# CONFIG_PA8X00 is not set
+CONFIG_PA11=y
+# CONFIG_64BIT is not set
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_HPUX is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+# CONFIG_HPPB is not set
+# CONFIG_IOMMU_CCIO is not set
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+# CONFIG_EISA is not set
+# CONFIG_PCI is not set
+# CONFIG_CHASSIS_LCD_LED is not set
+# CONFIG_PDC_CHASSIS is not set
+# CONFIG_HOTPLUG is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+CONFIG_PARPORT_PC_CML1=y
+# CONFIG_PARPORT_SERIAL is not set
+CONFIG_PARPORT_GSC=y
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_PARIDE is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=y
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_REPORT_LUNS is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+CONFIG_SCSI_LASI700=y
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+# CONFIG_SCSI_ZALON is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_LINEAR=y
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID1=y
+CONFIG_MD_RAID5=y
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_BLK_DEV_DM is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# I2O device support
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+CONFIG_INET_ECN=y
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+CONFIG_LASI_82596=y
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PLIP is not set
+CONFIG_PPP=y
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+
+#
+# Token Ring devices
+#
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_HP_SDC is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_HIL_OLD is not set
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_PCSPKR is not set
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_INPUT_GSC=y
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_MUX is not set
+# CONFIG_PDC_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+# CONFIG_I2C_SENSOR is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+CONFIG_FB_STI=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_PCI_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_FAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_NETWORK is not set
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
diff -Nru a/arch/parisc/defconfig b/arch/parisc/defconfig
--- a/arch/parisc/defconfig	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/defconfig	Thu Jan  8 23:00:23 2004
@@ -3,7 +3,6 @@
 #
 CONFIG_PARISC=y
 CONFIG_MMU=y
-CONFIG_SWAP=y
 CONFIG_STACK_GROWSUP=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 
@@ -11,20 +10,27 @@
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+CONFIG_BROKEN_ON_SMP=y
 
 #
 # General setup
 #
+CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-# CONFIG_LOG_BUF_SHIFT_17 is not set
-# CONFIG_LOG_BUF_SHIFT_16 is not set
-CONFIG_LOG_BUF_SHIFT_15=y
-# CONFIG_LOG_BUF_SHIFT_14 is not set
-# CONFIG_LOG_BUF_SHIFT_13 is not set
-# CONFIG_LOG_BUF_SHIFT_12 is not set
 CONFIG_LOG_BUF_SHIFT=15
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
 
 #
 # Loadable module support
@@ -34,6 +40,15 @@
 #
 # Processor type and features
 #
+CONFIG_PA7000=y
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA8X00 is not set
+CONFIG_PA11=y
+# CONFIG_64BIT is not set
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_HPUX is not set
 
 #
 # Bus options (PCI, PCMCIA, EISA, GSC, ISA)
@@ -44,6 +59,8 @@
 CONFIG_GSC_LASI=y
 CONFIG_GSC_WAX=y
 CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+# CONFIG_ISA is not set
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
@@ -52,17 +69,30 @@
 CONFIG_IOSAPIC=y
 CONFIG_IOMMU_SBA=y
 CONFIG_SUPERIO=y
-# CONFIG_CHASSIS_LCD_LED is not set
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
 #
-CONFIG_KCORE_ELF=y
-CONFIG_BINFMT_SOM=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
 #
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
 # Parallel port support
 #
 CONFIG_PARPORT=y
@@ -76,6 +106,11 @@
 # CONFIG_PARPORT_1284 is not set
 
 #
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
@@ -85,20 +120,22 @@
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=y
 # CONFIG_BLK_DEV_NBD is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_INITRD=y
 
 #
-# ATA/IDE/MFM/RLL support
+# ATA/ATAPI/MFM/RLL support
 #
 # CONFIG_IDE is not set
 
 #
-# SCSI support
+# SCSI device support
 #
 CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
 
 #
 # SCSI support type (disk, tape, CD-ROM)
@@ -128,22 +165,17 @@
 # CONFIG_SCSI_AIC7XXX is not set
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_AM53C974 is not set
 # CONFIG_SCSI_MEGARAID is not set
+# CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_DMA is not set
 # CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 # CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INIA100 is not set
 # CONFIG_SCSI_PPA is not set
 # CONFIG_SCSI_IMM is not set
@@ -160,15 +192,11 @@
 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
 CONFIG_SCSI_NCR53C8XX_SYNC=20
 # CONFIG_SCSI_NCR53C8XX_PROFILE is not set
-# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set
-# CONFIG_SCSI_PCI2000 is not set
-# CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 # CONFIG_SCSI_SIM710 is not set
 # CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_NSP32 is not set
 # CONFIG_SCSI_DEBUG is not set
 
@@ -185,6 +213,21 @@
 # CONFIG_BLK_DEV_DM is not set
 
 #
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
 # Networking support
 #
 CONFIG_NET=y
@@ -195,8 +238,6 @@
 CONFIG_PACKET=y
 CONFIG_PACKET_MMAP=y
 CONFIG_NETLINK_DEV=y
-# CONFIG_NETFILTER is not set
-CONFIG_FILTER=y
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -213,8 +254,12 @@
 # CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
-# CONFIG_XFRM_USER is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
 # CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
@@ -223,9 +268,9 @@
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 # CONFIG_NET_DIVERT is not set
@@ -259,6 +304,7 @@
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
 CONFIG_LASI_82596=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
@@ -311,8 +357,14 @@
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_TIGON3 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
 # CONFIG_PLIP is not set
@@ -323,19 +375,23 @@
 # Wireless LAN (non-hamradio)
 #
 CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
 # CONFIG_STRIP is not set
-# CONFIG_AIRONET4500 is not set
 
 #
-# Wireless ISA/PCI cards support
+# Wireless 802.11b ISA/PCI cards support
 #
 CONFIG_AIRO=y
 # CONFIG_HERMES is not set
 CONFIG_NET_WIRELESS=y
 
 #
-# Token Ring devices (depends on LLC=y)
+# Token Ring devices
 #
+# CONFIG_TR is not set
 # CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
@@ -346,11 +402,31 @@
 # CONFIG_WAN is not set
 
 #
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
 # IrDA (infrared) support
 #
 # CONFIG_IRDA is not set
 
 #
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
 # Input device support
 #
 CONFIG_INPUT=y
@@ -358,7 +434,10 @@
 #
 # Userland interfaces
 #
-# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_JOYDEV is not set
 # CONFIG_INPUT_TSDEV is not set
 CONFIG_INPUT_EVDEV=y
@@ -370,11 +449,12 @@
 # CONFIG_GAMEPORT is not set
 CONFIG_SOUND_GAMEPORT=y
 CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
 # CONFIG_SERIO_SERPORT is not set
 # CONFIG_SERIO_CT82C710 is not set
 # CONFIG_SERIO_PARKBD is not set
 CONFIG_HP_SDC=y
+# CONFIG_HIL_MLC is not set
+# CONFIG_SERIO_PCIPS2 is not set
 
 #
 # Input Device Drivers
@@ -384,11 +464,10 @@
 # CONFIG_KEYBOARD_SUNKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_HIL is not set
+# CONFIG_KEYBOARD_HIL_OLD is not set
 CONFIG_INPUT_MOUSE=y
 # CONFIG_MOUSE_PS2 is not set
 # CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_HIL is not set
 CONFIG_INPUT_JOYSTICK=y
 # CONFIG_JOYSTICK_IFORCE is not set
 # CONFIG_JOYSTICK_WARRIOR is not set
@@ -407,7 +486,7 @@
 # CONFIG_INPUT_PCSPKR is not set
 # CONFIG_INPUT_UINPUT is not set
 CONFIG_INPUT_GSC=y
-# CONFIG_HP_SDC_RTC is not set
+CONFIG_HP_SDC_RTC=y
 
 #
 # Character devices
@@ -422,6 +501,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
@@ -432,8 +512,8 @@
 #
 # Non-8250 serial port support
 #
-CONFIG_SERIAL_MUX=y
-CONFIG_SERIAL_MUX_CONSOLE=y
+# CONFIG_SERIAL_MUX is not set
+# CONFIG_PDC_CONSOLE is not set
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
@@ -449,12 +529,17 @@
 # CONFIG_I2C is not set
 
 #
-# I2C Hardware Sensors Mainboard support
+# I2C Algorithms
+#
+
+#
+# I2C Hardware Bus support
 #
 
 #
 # I2C Hardware Sensors Chip support
 #
+# CONFIG_I2C_SENSOR is not set
 
 #
 # Mice
@@ -463,11 +548,15 @@
 # CONFIG_QIC02_TAPE is not set
 
 #
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
 # CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
 CONFIG_GEN_RTC=y
 # CONFIG_GEN_RTC_X is not set
 # CONFIG_DTLK is not set
@@ -488,126 +577,17 @@
 # CONFIG_VIDEO_DEV is not set
 
 #
-# File systems
-#
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_FS_XATTR is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_TMPFS is not set
-CONFIG_RAMFS=y
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_HPFS_FS is not set
-CONFIG_PROC_FS=y
-# CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UDF_FS is not set
-# CONFIG_UFS_FS is not set
-# CONFIG_XFS_FS is not set
-
-#
-# Network File Systems
-#
-# CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4 is not set
-CONFIG_ROOT_NFS=y
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_SUNRPC=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-# CONFIG_CIFS is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_AFS_FS is not set
-
-#
-# Partition Types
+# Digital Video Broadcasting Devices
 #
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
+# CONFIG_DVB is not set
 
 #
 # Graphics support
 #
 CONFIG_FB=y
-# CONFIG_FB_CLGEN is not set
-# CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_IMSTT is not set
-# CONFIG_FB_STI is not set
+CONFIG_FB_STI=y
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
 # CONFIG_FB_RADEON is not set
@@ -618,7 +598,6 @@
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_PM3 is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -632,12 +611,16 @@
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_PCI_CONSOLE=y
-# CONFIG_FBCON_ADVANCED is not set
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
 
 #
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
 # Sound
 #
 CONFIG_SOUND=y
@@ -651,6 +634,7 @@
 # Open Sound System
 #
 # CONFIG_SOUND_PRIME is not set
+# CONFIG_SOUND_HARMONY is not set
 
 #
 # USB support
@@ -694,6 +678,7 @@
 # CONFIG_USB_MOUSE is not set
 # CONFIG_USB_AIPTEK is not set
 # CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
 # CONFIG_USB_POWERMATE is not set
 # CONFIG_USB_XPAD is not set
 
@@ -718,7 +703,6 @@
 # USB Network adaptors
 #
 # CONFIG_USB_CATC is not set
-# CONFIG_USB_CDCETHER is not set
 # CONFIG_USB_KAWETH is not set
 # CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
@@ -742,11 +726,140 @@
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
+# CONFIG_USB_GADGET is not set
 
 #
-# Bluetooth support
+# File systems
 #
-# CONFIG_BT is not set
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_FAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
 
 #
 # Profiling support
@@ -760,7 +873,8 @@
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
-# CONFIG_KALLSYMS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_INFO is not set
 
 #
 # Security options
@@ -770,9 +884,25 @@
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_TEST is not set
 
 #
 # Library routines
 #
-# CONFIG_CRC32 is not set
+CONFIG_CRC32=y
diff -Nru a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile
--- a/arch/parisc/kernel/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/Makefile	Thu Jan  8 23:00:23 2004
@@ -8,6 +8,7 @@
 
 AFLAGS_entry.o	:= -traditional
 AFLAGS_pacache.o := -traditional
+CFLAGS_ioctl32.o := -Ifs/
 
 obj-y	     	:= cache.o pacache.o setup.o traps.o time.o irq.o \
 		   pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \
diff -Nru a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
--- a/arch/parisc/kernel/cache.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/cache.c	Thu Jan  8 23:00:23 2004
@@ -292,5 +292,10 @@
 		break;
 	}
 }
-
 EXPORT_SYMBOL(__flush_dcache_page);
+
+/* Defined in arch/parisc/kernel/pacache.S */
+EXPORT_SYMBOL(flush_kernel_dcache_range_asm);
+EXPORT_SYMBOL(flush_kernel_dcache_page);
+EXPORT_SYMBOL(flush_data_cache_local);
+EXPORT_SYMBOL(flush_kernel_icache_range_asm);
diff -Nru a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c
--- a/arch/parisc/kernel/drivers.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/drivers.c	Thu Jan  8 23:00:24 2004
@@ -560,9 +560,9 @@
 	static int count;
 
 	print_pa_hwpath(dev, hw_path);
-	printk(KERN_INFO "%d. %s (%d) at 0x%lx [%s], versions 0x%x, 0x%x, 0x%x",
-		++count, dev->name, dev->id.hw_type, dev->hpa, hw_path,
-		dev->id.hversion, dev->id.hversion_rev, dev->id.sversion);
+	printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
+		++count, dev->name, dev->hpa, hw_path, dev->id.hw_type,
+		dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
 
 	if (dev->num_addrs) {
 		int k;
diff -Nru a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
--- a/arch/parisc/kernel/entry.S	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/entry.S	Thu Jan  8 23:00:23 2004
@@ -77,13 +77,13 @@
 	ldil	L%KERNEL_PSW, %r1
 	ldo	R%KERNEL_PSW(%r1), %r1
 	mtctl	%r1, %cr22
-	mtctl	%r0, %cr17
-	mtctl	%r0, %cr17
+	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+	mtctl	%r0, %cr17	/* Clear IIASQ head */
 	ldil	L%4f, %r1
 	ldo	R%4f(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* Set IIAOQ tail */
 	ldo	4(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* Set IIAOQ head */
 	rfir
 	nop
 4:
diff -Nru a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c
--- a/arch/parisc/kernel/firmware.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/firmware.c	Thu Jan  8 23:00:23 2004
@@ -541,8 +541,8 @@
  *    o cable too long (ie SE scsi 10Mhz won't support 6m length),
  *    o bus width exported is less than what the interface chip supports.
  */
-int pdc_get_initiator( struct hardware_path *hwpath, unsigned char *scsi_id,
-	unsigned long *period, char *width, char *mode)
+int pdc_get_initiator(struct hardware_path *hwpath, unsigned char *scsi_id,
+		unsigned long *period, char *width, char *mode)
 {
 	int retval;
 
@@ -550,53 +550,49 @@
 
 /* BCJ-XXXX series boxes. E.G. "9000/785/C3000" */
 #define IS_SPROCKETS() (strlen(boot_cpu_data.pdc.sys_model_name) == 14 && \
-	strncmp(boot_cpu_data.pdc.sys_model_name, "9000/785", 9) == 0)
+	strncmp(boot_cpu_data.pdc.sys_model_name, "9000/785", 8) == 0)
 
 	retval = mem_pdc_call(PDC_INITIATOR, PDC_GET_INITIATOR, 
 			      __pa(pdc_result), __pa(hwpath));
 
+	if (retval < PDC_OK)
+		goto fail;
 
-	if (retval >= PDC_OK) {
-		*scsi_id = (unsigned char) pdc_result[0];
+	*scsi_id = (unsigned char) pdc_result[0];
 
-		/* convert Bus speed in Mhz to period (in 1/10 ns) */
-		switch(pdc_result[1]) {
+	/* convert Bus speed in Mhz to period (in 1/10 ns) */
+	switch (pdc_result[1]) {
 		/*
-		** case  0:   driver determines rate
-		** case -1:   Settings are uninitialized.
-		*/
+		 * case  0:   driver determines rate
+		 * case -1:   Settings are uninitialized.
+		 */
 		case  5:  *period = 2000; break;
 		case 10:  *period = 1000; break;
 		case 20:  *period = 500; break;
 		case 40:  *period = 250; break;
 		default: /* Do nothing */ break;
-		}
+	}
 
-		/* 
-		** pdc_result[2]	PDC suggested SCSI id
-		** pdc_result[3]	PDC suggested SCSI rate
-		*/
-
-		if (IS_SPROCKETS()) {
-			/*
-			** Revisit: PAT PDC do the same thing?
-			** A500 also exports 50-pin SE SCSI.
-			**	0 == 8-bit
-			**	1 == 16-bit
-			*/
-			*width = (char) pdc_result[4];
-
-			/* ...in case someone needs it in the future.
-			** sym53c8xx.c comments say it can't autodetect
-			** for 825/825A/875 chips.
-			**	0 == SE, 1 == HVD, 2 == LVD
-			*/
-			*mode = (char) pdc_result[5]; 
-		}
+	/* 
+	 * pdc_result[2]	PDC suggested SCSI id
+	 * pdc_result[3]	PDC suggested SCSI rate
+	 */
+
+	if (IS_SPROCKETS()) {
+		/* 0 == 8-bit, 1 == 16-bit */
+		*width = (char) pdc_result[4];
+
+		/* ...in case someone needs it in the future.
+		 * sym53c8xx.c comments say it can't autodetect
+		 * for 825/825A/875 chips.
+		 *	0 == SE, 1 == HVD, 2 == LVD
+		 */
+		*mode = (char) pdc_result[5]; 
 	}
 
+ fail:
 	spin_unlock_irq(&pdc_lock);
-	return retval >= PDC_OK;
+	return (retval >= PDC_OK);
 }
 EXPORT_SYMBOL(pdc_get_initiator);
 
diff -Nru a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c
--- a/arch/parisc/kernel/hardware.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/hardware.c	Thu Jan  8 23:00:23 2004
@@ -772,6 +772,7 @@
 	{HPHW_FIO, 0x00D, 0x0007B, 0x0, "Strider-33 Audio"}, 
 	{HPHW_FIO, 0x00E, 0x0007B, 0x0, "Trailways-50 Audio"}, 
 	{HPHW_FIO, 0x00F, 0x0007B, 0x0, "Trailways-33 Audio"}, 
+	{HPHW_FIO, 0x015, 0x0007B, 0x0, "KittyHawk GSY Core Audio"}, 
 	{HPHW_FIO, 0x016, 0x0007B, 0x0, "Gecko Audio"}, 
 	{HPHW_FIO, 0x019, 0x0007B, 0x0, "Scorpio Sr. Audio"}, 
 	{HPHW_FIO, 0x01A, 0x0007B, 0x0, "Anole 64 Audio"}, 
@@ -824,6 +825,7 @@
 	{HPHW_FIO, 0x026, 0x0007F, 0x0, "CoralII Jaguar Audio"}, 
 	{HPHW_FIO, 0x010, 0x00080, 0x0, "Pace Core HPIB"}, 
 	{HPHW_FIO, 0x024, 0x00080, 0x0, "Fast Pace Core HPIB"}, 
+	{HPHW_FIO, 0x015, 0x00082, 0x0, "KittyHawk GSY Core SCSI"},
 	{HPHW_FIO, 0x016, 0x00082, 0x0, "Gecko Core SCSI"}, 
 	{HPHW_FIO, 0x01A, 0x00082, 0x0, "Anole 64 Core SCSI"}, 
 	{HPHW_FIO, 0x01B, 0x00082, 0x0, "Anole 100 Core SCSI"}, 
diff -Nru a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S
--- a/arch/parisc/kernel/head.S	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/head.S	Thu Jan  8 23:00:24 2004
@@ -221,13 +221,13 @@
 	** Clear the two-level IIA Space Queue, effectively setting
 	** Kernel space.
 	*/
-	mtctl		%r0,%cr17
-	mtctl		%r0,%cr17
+	mtctl		%r0,%cr17	/* Clear IIASQ tail */
+	mtctl		%r0,%cr17	/* Clear IIASQ head */
 
 	/* Load RFI target into PC queue */
-	mtctl		%r11,%cr18
+	mtctl		%r11,%cr18	/* IIAOQ head */
 	ldo		4(%r11),%r11
-	mtctl		%r11,%cr18
+	mtctl		%r11,%cr18	/* IIAOQ tail */
 
 	/* Jump to hyperspace */
 	rfi
diff -Nru a/arch/parisc/kernel/head64.S b/arch/parisc/kernel/head64.S
--- a/arch/parisc/kernel/head64.S	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/head64.S	Thu Jan  8 23:00:23 2004
@@ -267,13 +267,13 @@
 	** Clear the two-level IIA Space Queue, effectively setting
 	** Kernel space.
 	*/
-	mtctl		%r0,%cr17
-	mtctl		%r0,%cr17
+	mtctl		%r0,%cr17	/* Clear IIASQ tail */
+	mtctl		%r0,%cr17	/* Clear IIASQ head */
 
 	/* Load RFI target into PC queue */
-	mtctl		%r11,%cr18
+	mtctl		%r11,%cr18	/* IIAOQ head */
 	ldo		4(%r11),%r11
-	mtctl		%r11,%cr18
+	mtctl		%r11,%cr18	/* IIAOQ tail */
 
 	/* Jump to hyperspace */
 	rfi
diff -Nru a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c
--- a/arch/parisc/kernel/inventory.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/inventory.c	Thu Jan  8 23:00:23 2004
@@ -532,7 +532,12 @@
 	 * Otherwise the machine might crash during iommu setup.
 	 */
 	pdc_io_reset();
-	pdc_io_reset_devices();
+
+	/*
+	 * Unfortunately if we reset devices here, serial console
+	 * stops working :-(
+	 */
+	/* pdc_io_reset_devices(); */
 #endif
 
 	for (i = 0; status != PDC_BAD_PROC && status != PDC_NE_MOD; i++) {
diff -Nru a/arch/parisc/kernel/ioctl32.c b/arch/parisc/kernel/ioctl32.c
--- a/arch/parisc/kernel/ioctl32.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/ioctl32.c	Thu Jan  8 23:00:23 2004
@@ -8,1783 +8,21 @@
  * ioctls.
  */
 
-#include <linux/config.h>
-#include <linux/compat.h>
-#include <linux/ioctl.h>
-#include <linux/ioctl32.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/ioctl.h>
-#include <linux/if.h>
-#include <linux/slab.h>
-#include <linux/hdreg.h>
-#include <linux/raid/md.h>
-#include <linux/kd.h>
-#include <linux/route.h>
-#include <linux/skbuff.h>
-#include <linux/netlink.h>
-#include <linux/vt.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/fd.h>
-#include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
-#include <linux/if_pppox.h>
-#include <linux/if_tun.h>
-#include <linux/mtio.h>
-#include <linux/cdrom.h>
-#include <linux/loop.h>
-#include <linux/auto_fs4.h>
-#include <linux/devfs_fs.h>
-#include <linux/ncp_fs.h>
-#include <linux/tty.h>
-#include <linux/vt_kern.h>
-#include <linux/fb.h>
-#include <linux/ext2_fs.h>
-#include <linux/videodev.h>
-#include <linux/netdevice.h>
-#include <linux/raw.h>
-#include <linux/smb_fs.h>
-#include <linux/blkpg.h>
-#include <linux/elevator.h>
-#include <linux/rtc.h>
-#include <linux/pci.h>
-#include <linux/serial.h>
-#include <linux/watchdog.h>
-#include <net/sock.h>		/* siocdevprivate_ioctl */
-
-#include <scsi/scsi.h>
-/* Ugly hack. */
-#undef __KERNEL__
-#include <scsi/scsi_ioctl.h>
-#define __KERNEL__
-#include <scsi/sg.h>
+#define INCLUDES
+#include "compat_ioctl.c"
 
-#include <linux/raid/md_u.h>
-#include <linux/dm-ioctl.h>
-
-#include <asm/types.h>
-#include <asm/uaccess.h>
 #include <asm/perf.h>
-#include <linux/ethtool.h>
-#include <linux/soundcard.h>
-#include <linux/lp.h>
-
-#include <linux/atm.h>
-#include <linux/atmarp.h>
-#include <linux/atmclip.h>
-#include <linux/atmdev.h>
-#include <linux/atmioc.h>
-#include <linux/atmlec.h>
-#include <linux/atmmpc.h>
-#include <linux/atmsvc.h>
-#include <linux/atm_tcp.h>
-#include <linux/sonet.h>
-#include <linux/atm_suni.h>
-#include <linux/mtd/mtd.h>
-
-#include <net/bluetooth/bluetooth.h>
-#include <net/bluetooth/hci.h>
-
-#include <linux/usb.h>
-#include <linux/usbdevice_fs.h>
-#include <linux/nbd.h>
-#include <linux/random.h>
-
 #include <asm/ioctls.h>
 
+#define CODE
+#include "compat_ioctl.c"
+
 /* Use this to get at 32-bit user passed pointers. 
    See sys_sparc32.c for description about these. */
 #define A(__x) ((unsigned long)(__x))
 /* The same for use with copy_from_user() and copy_to_user(). */
 #define B(__x) ((void *)(unsigned long)(__x))
 
-/* Aiee. Someone does not find a difference between int and long */
-#define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
-#define EXT2_IOC32_SETFLAGS               _IOW('f', 2, int)
-#define EXT2_IOC32_GETVERSION             _IOR('v', 1, int)
-#define EXT2_IOC32_SETVERSION             _IOW('v', 2, int)
-
-static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err;
-	unsigned long val;
-	
-	set_fs (KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&val);
-	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
-		return -EFAULT;
-	return err;
-}
- 
-static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err;
-	unsigned long val;
-	
-	if(get_user(val, (u32 *)arg))
-		return -EFAULT;
-	set_fs (KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&val);
-	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
-		return -EFAULT;
-	return err;
-}
-
-static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	/* These are just misnamed, they actually get/put from/to user an int */
-	switch (cmd) {
-	case EXT2_IOC32_GETFLAGS: cmd = EXT2_IOC_GETFLAGS; break;
-	case EXT2_IOC32_SETFLAGS: cmd = EXT2_IOC_SETFLAGS; break;
-	case EXT2_IOC32_GETVERSION: cmd = EXT2_IOC_GETVERSION; break;
-	case EXT2_IOC32_SETVERSION: cmd = EXT2_IOC_SETVERSION; break;
-	}
-	return sys_ioctl(fd, cmd, arg);
-}
- 
-static int do_siocgstamp(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct compat_timeval *up = (struct compat_timeval *)arg;
-	struct timeval ktv;
-	mm_segment_t old_fs = get_fs();
-	int err;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&ktv);
-	set_fs(old_fs);
-	if(!err) {
-		err = put_user(ktv.tv_sec, &up->tv_sec);
-		err |= __put_user(ktv.tv_usec, &up->tv_usec);
-	}
-	return err;
-}
-
-struct ifmap32 {
-	u32 mem_start;
-	u32 mem_end;
-	unsigned short base_addr;
-	unsigned char irq;
-	unsigned char dma;
-	unsigned char port;
-};
-
-struct ifreq32 {
-#define IFHWADDRLEN     6
-#define IFNAMSIZ        16
-        union {
-                char    ifrn_name[IFNAMSIZ];            /* if name, e.g. "en0" */
-        } ifr_ifrn;
-        union {
-                struct  sockaddr ifru_addr;
-                struct  sockaddr ifru_dstaddr;
-                struct  sockaddr ifru_broadaddr;
-                struct  sockaddr ifru_netmask;
-                struct  sockaddr ifru_hwaddr;
-                short   ifru_flags;
-                int     ifru_ivalue;
-                int     ifru_mtu;
-                struct  ifmap32 ifru_map;
-                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
-		char	ifru_newname[IFNAMSIZ];
-                compat_caddr_t ifru_data;
-        } ifr_ifru;
-};
-
-struct ifconf32 {
-        int		ifc_len;		/* size of buffer       */
-        compat_caddr_t	ifcbuf;
-};
-
-static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct net_device *dev;
-	struct ifreq32 ifr32;
-	int err;
-
-	if (copy_from_user(&ifr32, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
-		return -EFAULT;
-
-	dev = dev_get_by_index(ifr32.ifr_ifindex);
-	if (!dev)
-		return -ENODEV;
-
-	strcpy(ifr32.ifr_name, dev->name);
-	dev_put(dev);
-
-	err = copy_to_user((struct ifreq32 *)arg, &ifr32, sizeof(struct ifreq32));
-	return (err ? -EFAULT : 0);
-}
-
-static inline int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ifconf32 ifc32;
-	struct ifconf ifc;
-	struct ifreq32 *ifr32;
-	struct ifreq *ifr;
-	mm_segment_t old_fs;
-	unsigned int i, j;
-	int err;
-
-	if (copy_from_user(&ifc32, (struct ifconf32 *)arg, sizeof(struct ifconf32)))
-		return -EFAULT;
-
-	if(ifc32.ifcbuf == 0) {
-		ifc32.ifc_len = 0;
-		ifc.ifc_len = 0;
-		ifc.ifc_buf = NULL;
-	} else {
-		ifc.ifc_len = ((ifc32.ifc_len / sizeof (struct ifreq32)) + 1) *
-			sizeof (struct ifreq);
-		ifc.ifc_buf = kmalloc (ifc.ifc_len, GFP_KERNEL);
-		if (!ifc.ifc_buf)
-			return -ENOMEM;
-	}
-	ifr = ifc.ifc_req;
-	ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
-	for (i = 0; i < ifc32.ifc_len; i += sizeof (struct ifreq32)) {
-		if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
-			kfree (ifc.ifc_buf);
-			return -EFAULT;
-		}
-	}
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);	
-	set_fs (old_fs);
-	if (!err) {
-		ifr = ifc.ifc_req;
-		ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
-		for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len;
-		     i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
-			if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
-				err = -EFAULT;
-				break;
-			}
-		}
-		if (!err) {
-			if (i <= ifc32.ifc_len)
-				ifc32.ifc_len = i;
-			else
-				ifc32.ifc_len = i - sizeof (struct ifreq32);
-			if (copy_to_user((struct ifconf32 *)arg, &ifc32, sizeof(struct ifconf32)))
-				err = -EFAULT;
-		}
-	}
-	if(ifc.ifc_buf != NULL)
-		kfree (ifc.ifc_buf);
-	return err;
-}
-
-static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ifreq ifr;
-	mm_segment_t old_fs;
-	int err;
-	
-	switch (cmd) {
-	case SIOCSIFMAP:
-		err = copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(ifr.ifr_name));
-		err |= __get_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
-		err |= __get_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
-		err |= __get_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
-		err |= __get_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
-		err |= __get_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
-		err |= __get_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
-		if (err)
-			return -EFAULT;
-		break;
-	case SIOCGPPPSTATS:
-	case SIOCGPPPCSTATS:
-	case SIOCGPPPVER:
-	case SIOCETHTOOL:
-		if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
-			return -EFAULT;
-		ifr.ifr_data = (__kernel_caddr_t)get_zeroed_page(GFP_KERNEL);
-		if (!ifr.ifr_data)
-			return -EAGAIN;
-		if(cmd == SIOCETHTOOL) {
-			u32 data;
-
-			__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
-			if(copy_from_user(ifr.ifr_data,
-					  (char *)A(data),
-					  sizeof(struct ethtool_cmd))) {
-				free_page((unsigned long)ifr.ifr_data);
-				return -EFAULT;
-			}
-		}
-		break;
-	default:
-		if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
-			return -EFAULT;
-		break;
-	}
-	old_fs = get_fs();
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
-	set_fs (old_fs);
-	if (!err) {
-		switch (cmd) {
-		case SIOCGIFFLAGS:
-		case SIOCGIFMETRIC:
-		case SIOCGIFMTU:
-		case SIOCGIFMEM:
-		case SIOCGIFHWADDR:
-		case SIOCGIFINDEX:
-		case SIOCGIFADDR:
-		case SIOCGIFBRDADDR:
-		case SIOCGIFDSTADDR:
-		case SIOCGIFNETMASK:
-		case SIOCGIFTXQLEN:
-			if (copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(struct ifreq32)))
-				return -EFAULT;
-			break;
-		case SIOCGPPPSTATS:
-		case SIOCGPPPCSTATS:
-		case SIOCGPPPVER:
-		case SIOCETHTOOL:
-		{
-			u32 data;
-			int len;
-
-			__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
-			if(cmd == SIOCETHTOOL)
-				len = sizeof(struct ethtool_cmd);
-			if(cmd == SIOCGPPPVER)
-				len = strlen((char *)ifr.ifr_data) + 1;
-			else if(cmd == SIOCGPPPCSTATS)
-				len = sizeof(struct ppp_comp_stats);
-			else
-				len = sizeof(struct ppp_stats);
-
-			len = copy_to_user((char *)A(data), ifr.ifr_data, len);
-			free_page((unsigned long)ifr.ifr_data);
-			if(len)
-				return -EFAULT;
-			break;
-		}
-		case SIOCGIFMAP:
-			err = copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(ifr.ifr_name));
-			err |= __put_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
-			err |= __put_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
-			err |= __put_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
-			err |= __put_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
-			err |= __put_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
-			err |= __put_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
-			if (err)
-				err = -EFAULT;
-			break;
-		}
-	}
-	return err;
-}
-
-struct rtentry32 {
-        u32   		rt_pad1;
-        struct sockaddr rt_dst;         /* target address               */
-        struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
-        struct sockaddr rt_genmask;     /* target network mask (IP)     */
-        unsigned short  rt_flags;
-        short           rt_pad2;
-        u32   		rt_pad3;
-        unsigned char   rt_tos;
-        unsigned char   rt_class;
-        short           rt_pad4;
-        short           rt_metric;      /* +1 for binary compatibility! */
-        /* char * */ u32 rt_dev;        /* forcing the device at add    */
-        u32   		rt_mtu;         /* per route MTU/Window         */
-        u32   		rt_window;      /* Window clamping              */
-        unsigned short  rt_irtt;        /* Initial RTT                  */
-
-};
-
-static inline int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct rtentry r;
-	char devname[16];
-	u32 rtdev;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	ret = copy_from_user (&r.rt_dst, &(((struct rtentry32 *)arg)->rt_dst), 3 * sizeof(struct sockaddr));
-	ret |= __get_user (r.rt_flags, &(((struct rtentry32 *)arg)->rt_flags));
-	ret |= __get_user (r.rt_metric, &(((struct rtentry32 *)arg)->rt_metric));
-	ret |= __get_user (r.rt_mtu, &(((struct rtentry32 *)arg)->rt_mtu));
-	ret |= __get_user (r.rt_window, &(((struct rtentry32 *)arg)->rt_window));
-	ret |= __get_user (r.rt_irtt, &(((struct rtentry32 *)arg)->rt_irtt));
-	ret |= __get_user (rtdev, &(((struct rtentry32 *)arg)->rt_dev));
-	if (rtdev) {
-		ret |= copy_from_user (devname, (char *)A(rtdev), 15);
-		r.rt_dev = devname; devname[15] = 0;
-	} else
-		r.rt_dev = 0;
-	if (ret)
-		return -EFAULT;
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl (fd, cmd, (long)&r);
-	set_fs (old_fs);
-	return ret;
-}
-
-struct hd_geometry32 {
-	unsigned char heads;
-	unsigned char sectors;
-	unsigned short cylinders;
-	u32 start;
-};
-                        
-static inline int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct hd_geometry geo;
-	int err;
-	
-	set_fs (KERNEL_DS);
-	err = sys_ioctl(fd, HDIO_GETGEO, (unsigned long)&geo);
-	set_fs (old_fs);
-	if (!err) {
-		err = copy_to_user ((struct hd_geometry32 *)arg, &geo, 4);
-		err |= __put_user (geo.start, &(((struct hd_geometry32 *)arg)->start));
-	}
-	return err ? -EFAULT : 0;
-}
-
-
-#if 0
-/* looks like SPARC only - eg sbus video */
-struct  fbcmap32 {
-	int             index;          /* first element (0 origin) */
-	int             count;
-	u32		red;
-	u32		green;
-	u32		blue;
-};
-
-
-static inline int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct fbcmap f;
-	int ret;
-	char red[256], green[256], blue[256];
-	u32 r, g, b;
-	mm_segment_t old_fs = get_fs();
-	
-	ret = get_user(f.index, &(((struct fbcmap32 *)arg)->index));
-	ret |= __get_user(f.count, &(((struct fbcmap32 *)arg)->count));
-	ret |= __get_user(r, &(((struct fbcmap32 *)arg)->red));
-	ret |= __get_user(g, &(((struct fbcmap32 *)arg)->green));
-	ret |= __get_user(b, &(((struct fbcmap32 *)arg)->blue));
-	if (ret)
-		return -EFAULT;
-	if ((f.index < 0) || (f.index > 255)) return -EINVAL;
-	if (f.index + f.count > 256)
-		f.count = 256 - f.index;
-	if (cmd == FBIOPUTCMAP32) {
-		ret = copy_from_user (red, (char *)A(r), f.count);
-		ret |= copy_from_user (green, (char *)A(g), f.count);
-		ret |= copy_from_user (blue, (char *)A(b), f.count);
-		if (ret)
-			return -EFAULT;
-	}
-	f.red = red; f.green = green; f.blue = blue;
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl (fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (long)&f);
-	set_fs (old_fs);
-	if (!ret && cmd == FBIOGETCMAP32) {
-		ret = copy_to_user ((char *)A(r), red, f.count);
-		ret |= copy_to_user ((char *)A(g), green, f.count);
-		ret |= copy_to_user ((char *)A(b), blue, f.count);
-	}
-	return ret ? -EFAULT : 0;
-}
-
-struct fbcursor32 {
-	short set;		/* what to set, choose from the list above */
-	short enable;		/* cursor on/off */
-	struct fbcurpos pos;	/* cursor position */
-	struct fbcurpos hot;	/* cursor hot spot */
-	struct fbcmap32 cmap;	/* color map info */
-	struct fbcurpos size;	/* cursor bit map size */
-	u32	image;		/* cursor image bits */
-	u32	mask;		/* cursor mask bits */
-};
-	
-static inline int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct fbcursor f;
-	int ret;
-	char red[2], green[2], blue[2];
-	char image[128], mask[128];
-	u32 r, g, b;
-	u32 m, i;
-	mm_segment_t old_fs = get_fs();
-	
-	ret = copy_from_user (&f, (struct fbcursor32 *)arg, 2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
-	ret |= __get_user(f.size.fbx, &(((struct fbcursor32 *)arg)->size.fbx));
-	ret |= __get_user(f.size.fby, &(((struct fbcursor32 *)arg)->size.fby));
-	ret |= __get_user(f.cmap.index, &(((struct fbcursor32 *)arg)->cmap.index));
-	ret |= __get_user(f.cmap.count, &(((struct fbcursor32 *)arg)->cmap.count));
-	ret |= __get_user(r, &(((struct fbcursor32 *)arg)->cmap.red));
-	ret |= __get_user(g, &(((struct fbcursor32 *)arg)->cmap.green));
-	ret |= __get_user(b, &(((struct fbcursor32 *)arg)->cmap.blue));
-	ret |= __get_user(m, &(((struct fbcursor32 *)arg)->mask));
-	ret |= __get_user(i, &(((struct fbcursor32 *)arg)->image));
-	if (ret)
-		return -EFAULT;
-	if (f.set & FB_CUR_SETCMAP) {
-		if ((uint) f.size.fby > 32)
-			return -EINVAL;
-		ret = copy_from_user (mask, (char *)A(m), f.size.fby * 4);
-		ret |= copy_from_user (image, (char *)A(i), f.size.fby * 4);
-		if (ret)
-			return -EFAULT;
-		f.image = image; f.mask = mask;
-	}
-	if (f.set & FB_CUR_SETCMAP) {
-		ret = copy_from_user (red, (char *)A(r), 2);
-		ret |= copy_from_user (green, (char *)A(g), 2);
-		ret |= copy_from_user (blue, (char *)A(b), 2);
-		if (ret)
-			return -EFAULT;
-		f.cmap.red = red; f.cmap.green = green; f.cmap.blue = blue;
-	}
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl (fd, FBIOSCURSOR, (long)&f);
-	set_fs (old_fs);
-	return ret;
-}
-#endif /* 0 */
-
-struct fb_fix_screeninfo32 {
-	char		id[16];
-        compat_caddr_t	smem_start;
-	__u32		smem_len;
-	__u32		type;
-	__u32		type_aux;
-	__u32		visual;
-	__u16		xpanstep;
-	__u16		ypanstep;
-	__u16		ywrapstep;
-	__u32		line_length;
-        compat_caddr_t	mmio_start;
-	__u32		mmio_len;
-	__u32		accel;
-	__u16		reserved[3];
-};
-
-struct fb_cmap32 {
-	__u32		start;
-	__u32		len;
-	compat_caddr_t	red;
-	compat_caddr_t	green;
-	compat_caddr_t	blue;
-	compat_caddr_t	transp;
-};
-
-static int fb_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	u32 red = 0, green = 0, blue = 0, transp = 0;
-	struct fb_fix_screeninfo fix;
-	struct fb_cmap cmap;
-	void *karg;
-	int err = 0;
-
-	memset(&cmap, 0, sizeof(cmap));
-	switch (cmd) {
-	case FBIOGET_FSCREENINFO:
-		karg = &fix;
-		break;
-	case FBIOGETCMAP:
-	case FBIOPUTCMAP:
-		karg = &cmap;
-		err = __get_user(cmap.start, &((struct fb_cmap32 *)arg)->start);
-		err |= __get_user(cmap.len, &((struct fb_cmap32 *)arg)->len);
-		err |= __get_user(red, &((struct fb_cmap32 *)arg)->red);
-		err |= __get_user(green, &((struct fb_cmap32 *)arg)->green);
-		err |= __get_user(blue, &((struct fb_cmap32 *)arg)->blue);
-		err |= __get_user(transp, &((struct fb_cmap32 *)arg)->transp);
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-		err = -ENOMEM;
-		cmap.red = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-		if (!cmap.red)
-			goto out;
-		cmap.green = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-		if (!cmap.green)
-			goto out;
-		cmap.blue = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-		if (!cmap.blue)
-			goto out;
-		if (transp) {
-			cmap.transp = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-			if (!cmap.transp)
-				goto out;
-		}
-			
-		if (cmd == FBIOGETCMAP)
-			break;
-
-		err = __copy_from_user(cmap.red, (char *)A(red), cmap.len * sizeof(__u16));
-		err |= __copy_from_user(cmap.green, (char *)A(green), cmap.len * sizeof(__u16));
-		err |= __copy_from_user(cmap.blue, (char *)A(blue), cmap.len * sizeof(__u16));
-		if (cmap.transp) err |= __copy_from_user(cmap.transp, (char *)A(transp), cmap.len * sizeof(__u16));
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-		break;
-	default:
-		do {
-			static int count = 0;
-			if (++count <= 20)
-				printk(KERN_WARNING
-					"%s: Unknown fb ioctl cmd fd(%d) "
-					"cmd(%08x) arg(%08lx)\n",
-					__FUNCTION__, fd, cmd, arg);
-		} while(0);
-		return -ENOSYS;
-	}
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)karg);
-	set_fs(old_fs);
-	if (err)
-		goto out;
-	switch (cmd) {
-		struct fb_fix_screeninfo32 fix32;
-	case FBIOGET_FSCREENINFO:
-		memset(&fix32, 0, sizeof(fix32));
-		memcpy(fix32.id, fix.id, sizeof(fix32.id));
-		fix32.smem_start = (__u32)(unsigned long)fix.smem_start;
-		fix32.smem_len	= fix.smem_len;
-		fix32.type	= fix.type;
-		fix32.type_aux	= fix.type_aux;
-		fix32.visual	= fix.visual;
-		fix32.xpanstep	= fix.xpanstep;
-		fix32.ypanstep	= fix.ypanstep;
-		fix32.ywrapstep = fix.ywrapstep;
-		fix32.line_length = fix.line_length;
-		fix32.mmio_start = (__u32)(unsigned long)fix.mmio_start;
-		fix32.mmio_len	= fix.mmio_len;
-		fix32.accel	= fix.accel;
-		memcpy(fix32.reserved, fix.reserved, sizeof(fix32.reserved));
-		err = __copy_to_user((void *) arg, (const void *) &fix32, sizeof(fix32));
-
-printk("fix  : %lx %x  %x %x %x  %x %x %x %x  %lx %x %x\n",
-	fix.smem_start, fix.smem_len,
-	fix.type, fix.type_aux, fix.visual,
-	fix.xpanstep, fix.ypanstep, fix.ywrapstep, fix.line_length,
-	fix.mmio_start, fix.mmio_len, fix.accel);
-printk("fix32: %x %x  %x %x %x  %x %x %x %x  %x %x %x\n",
-	fix32.smem_start, fix32.smem_len,
-	fix32.type, fix32.type_aux, fix32.visual,
-	fix32.xpanstep, fix32.ypanstep, fix32.ywrapstep, fix32.line_length,
-	fix32.mmio_start, fix32.mmio_len, fix32.accel);
-
-		break;
-	case FBIOGETCMAP:
-		err = __copy_to_user((char *)A(red), cmap.red, cmap.len * sizeof(__u16));
-		err |= __copy_to_user((char *)A(green), cmap.blue, cmap.len * sizeof(__u16));
-		err |= __copy_to_user((char *)A(blue), cmap.blue, cmap.len * sizeof(__u16));
-		if (cmap.transp)
-			err |= __copy_to_user((char *)A(transp), cmap.transp, cmap.len * sizeof(__u16));
-		break;
-	case FBIOPUTCMAP:
-		break;
-	}
-	if (err)
-		err = -EFAULT;
-
-out:	if (cmap.red) kfree(cmap.red);
-	if (cmap.green) kfree(cmap.green);
-	if (cmap.blue) kfree(cmap.blue);
-	if (cmap.transp) kfree(cmap.transp);
-	return err;
-}
-
-static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	unsigned long kval;
-	unsigned int *uvp;
-	int error;
-
-	set_fs(KERNEL_DS);
-	error = sys_ioctl(fd, cmd, (long)&kval);
-	set_fs(old_fs);
-
-	if(error == 0) {
-		uvp = (unsigned int *)arg;
-		if(put_user(kval, uvp))
-			error = -EFAULT;
-	}
-	return error;
-}
-
-struct floppy_struct32 {
-	unsigned int	size;
-	unsigned int	sect;
-	unsigned int	head;
-	unsigned int	track;
-	unsigned int	stretch;
-	unsigned char	gap;
-	unsigned char	rate;
-	unsigned char	spec1;
-	unsigned char	fmt_gap;
-	const compat_caddr_t name;
-};
-
-struct floppy_drive_params32 {
-	char		cmos;
-	u32		max_dtr;
-	u32		hlt;
-	u32		hut;
-	u32		srt;
-	u32		spinup;
-	u32		spindown;
-	unsigned char	spindown_offset;
-	unsigned char	select_delay;
-	unsigned char	rps;
-	unsigned char	tracks;
-	u32		timeout;
-	unsigned char	interleave_sect;
-	struct floppy_max_errors max_errors;
-	char		flags;
-	char		read_track;
-	short		autodetect[8];
-	int		checkfreq;
-	int		native_format;
-};
-
-struct floppy_drive_struct32 {
-	signed char	flags;
-	u32		spinup_date;
-	u32		select_date;
-	u32		first_read_date;
-	short		probed_format;
-	short		track;
-	short		maxblock;
-	short		maxtrack;
-	int		generation;
-	int		keep_data;
-	int		fd_ref;
-	int		fd_device;
-	int		last_checked;
-	compat_caddr_t	dmabuf;
-	int		bufblocks;
-};
-
-struct floppy_fdc_state32 {
-	int		spec1;
-	int		spec2;
-	int		dtr;
-	unsigned char	version;
-	unsigned char	dor;
-	u32		address;
-	unsigned int	rawcmd:2;
-	unsigned int	reset:1;
-	unsigned int	need_configure:1;
-	unsigned int	perp_mode:2;
-	unsigned int	has_fifo:1;
-	unsigned int	driver_version;
-	unsigned char	track[4];
-};
-
-struct floppy_write_errors32 {
-	unsigned int	write_errors;
-	u32		first_error_sector;
-	int		first_error_generation;
-	u32		last_error_sector;
-	int		last_error_generation;
-	unsigned int	badness;
-};
-
-#define FDSETPRM32 _IOW(2, 0x42, struct floppy_struct32)
-#define FDDEFPRM32 _IOW(2, 0x43, struct floppy_struct32)
-#define FDGETPRM32 _IOR(2, 0x04, struct floppy_struct32)
-#define FDSETDRVPRM32 _IOW(2, 0x90, struct floppy_drive_params32)
-#define FDGETDRVPRM32 _IOR(2, 0x11, struct floppy_drive_params32)
-#define FDGETDRVSTAT32 _IOR(2, 0x12, struct floppy_drive_struct32)
-#define FDPOLLDRVSTAT32 _IOR(2, 0x13, struct floppy_drive_struct32)
-#define FDGETFDCSTAT32 _IOR(2, 0x15, struct floppy_fdc_state32)
-#define FDWERRORGET32  _IOR(2, 0x17, struct floppy_write_errors32)
-
-static struct {
-	unsigned int	cmd32;
-	unsigned int	cmd;
-} fd_ioctl_trans_table[] = {
-	{ FDSETPRM32, FDSETPRM },
-	{ FDDEFPRM32, FDDEFPRM },
-	{ FDGETPRM32, FDGETPRM },
-	{ FDSETDRVPRM32, FDSETDRVPRM },
-	{ FDGETDRVPRM32, FDGETDRVPRM },
-	{ FDGETDRVSTAT32, FDGETDRVSTAT },
-	{ FDPOLLDRVSTAT32, FDPOLLDRVSTAT },
-	{ FDGETFDCSTAT32, FDGETFDCSTAT },
-	{ FDWERRORGET32, FDWERRORGET }
-};
-
-#define NR_FD_IOCTL_TRANS (sizeof(fd_ioctl_trans_table)/sizeof(fd_ioctl_trans_table[0]))
-
-static int fd_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	void *karg = NULL;
-	unsigned int kcmd = 0;
-	int i, err;
-
-	for (i = 0; i < NR_FD_IOCTL_TRANS; i++)
-		if (cmd == fd_ioctl_trans_table[i].cmd32) {
-			kcmd = fd_ioctl_trans_table[i].cmd;
-			break;
-		}
-	if (!kcmd)
-		return -EINVAL;
-
-	switch (cmd) {
-		case FDSETPRM32:
-		case FDDEFPRM32:
-		case FDGETPRM32:
-		{
-			struct floppy_struct *f;
-
-			f = karg = kmalloc(sizeof(struct floppy_struct), GFP_KERNEL);
-			if (!karg)
-				return -ENOMEM;
-			if (cmd == FDGETPRM32)
-				break;
-			err = __get_user(f->size, &((struct floppy_struct32 *)arg)->size);
-			err |= __get_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
-			err |= __get_user(f->head, &((struct floppy_struct32 *)arg)->head);
-			err |= __get_user(f->track, &((struct floppy_struct32 *)arg)->track);
-			err |= __get_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
-			err |= __get_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
-			err |= __get_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
-			err |= __get_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
-			err |= __get_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
-			err |= __get_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
-			if (err) {
-				err = -EFAULT;
-				goto out;
-			}
-			break;
-		}
-		case FDSETDRVPRM32:
-		case FDGETDRVPRM32:
-		{
-			struct floppy_drive_params *f;
-
-			f = karg = kmalloc(sizeof(struct floppy_drive_params), GFP_KERNEL);
-			if (!karg)
-				return -ENOMEM;
-			if (cmd == FDGETDRVPRM32)
-				break;
-			err = __get_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
-			err |= __get_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
-			err |= __get_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
-			err |= __get_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
-			err |= __get_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
-			err |= __get_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
-			err |= __get_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
-			err |= __get_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
-			err |= __get_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
-			err |= __get_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
-			err |= __get_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
-			err |= __get_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
-			err |= __get_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
-			err |= __copy_from_user(&f->max_errors, &((struct floppy_drive_params32 *)arg)->max_errors, sizeof(f->max_errors));
-			err |= __get_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
-			err |= __get_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
-			err |= __copy_from_user(f->autodetect, ((struct floppy_drive_params32 *)arg)->autodetect, sizeof(f->autodetect));
-			err |= __get_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
-			err |= __get_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
-			if (err) {
-				err = -EFAULT;
-				goto out;
-			}
-			break;
-		}
-		case FDGETDRVSTAT32:
-		case FDPOLLDRVSTAT32:
-			karg = kmalloc(sizeof(struct floppy_drive_struct), GFP_KERNEL);
-			if (!karg)
-				return -ENOMEM;
-			break;
-		case FDGETFDCSTAT32:
-			karg = kmalloc(sizeof(struct floppy_fdc_state), GFP_KERNEL);
-			if (!karg)
-				return -ENOMEM;
-			break;
-		case FDWERRORGET32:
-			karg = kmalloc(sizeof(struct floppy_write_errors), GFP_KERNEL);
-			if (!karg)
-				return -ENOMEM;
-			break;
-		default:
-			return -EINVAL;
-	}
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
-	set_fs (old_fs);
-	if (err)
-		goto out;
-	switch (cmd) {
-		case FDGETPRM32:
-		{
-			struct floppy_struct *f = karg;
-
-			err = __put_user(f->size, &((struct floppy_struct32 *)arg)->size);
-			err |= __put_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
-			err |= __put_user(f->head, &((struct floppy_struct32 *)arg)->head);
-			err |= __put_user(f->track, &((struct floppy_struct32 *)arg)->track);
-			err |= __put_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
-			err |= __put_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
-			err |= __put_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
-			err |= __put_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
-			err |= __put_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
-			err |= __put_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
-			break;
-		}
-		case FDGETDRVPRM32:
-		{
-			struct floppy_drive_params *f = karg;
-
-			err = __put_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
-			err |= __put_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
-			err |= __put_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
-			err |= __put_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
-			err |= __put_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
-			err |= __put_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
-			err |= __put_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
-			err |= __put_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
-			err |= __put_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
-			err |= __put_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
-			err |= __put_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
-			err |= __put_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
-			err |= __put_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
-			err |= __copy_to_user(&((struct floppy_drive_params32 *)arg)->max_errors, &f->max_errors, sizeof(f->max_errors));
-			err |= __put_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
-			err |= __put_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
-			err |= __copy_to_user(((struct floppy_drive_params32 *)arg)->autodetect, f->autodetect, sizeof(f->autodetect));
-			err |= __put_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
-			err |= __put_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
-			break;
-		}
-		case FDGETDRVSTAT32:
-		case FDPOLLDRVSTAT32:
-		{
-			struct floppy_drive_struct *f = karg;
-
-			err = __put_user(f->flags, &((struct floppy_drive_struct32 *)arg)->flags);
-			err |= __put_user(f->spinup_date, &((struct floppy_drive_struct32 *)arg)->spinup_date);
-			err |= __put_user(f->select_date, &((struct floppy_drive_struct32 *)arg)->select_date);
-			err |= __put_user(f->first_read_date, &((struct floppy_drive_struct32 *)arg)->first_read_date);
-			err |= __put_user(f->probed_format, &((struct floppy_drive_struct32 *)arg)->probed_format);
-			err |= __put_user(f->track, &((struct floppy_drive_struct32 *)arg)->track);
-			err |= __put_user(f->maxblock, &((struct floppy_drive_struct32 *)arg)->maxblock);
-			err |= __put_user(f->maxtrack, &((struct floppy_drive_struct32 *)arg)->maxtrack);
-			err |= __put_user(f->generation, &((struct floppy_drive_struct32 *)arg)->generation);
-			err |= __put_user(f->keep_data, &((struct floppy_drive_struct32 *)arg)->keep_data);
-			err |= __put_user(f->fd_ref, &((struct floppy_drive_struct32 *)arg)->fd_ref);
-			err |= __put_user(f->fd_device, &((struct floppy_drive_struct32 *)arg)->fd_device);
-			err |= __put_user(f->last_checked, &((struct floppy_drive_struct32 *)arg)->last_checked);
-			err |= __put_user((u64)f->dmabuf, &((struct floppy_drive_struct32 *)arg)->dmabuf);
-			err |= __put_user((u64)f->bufblocks, &((struct floppy_drive_struct32 *)arg)->bufblocks);
-			break;
-		}
-		case FDGETFDCSTAT32:
-		{
-			struct floppy_fdc_state *f = karg;
-
-			err = __put_user(f->spec1, &((struct floppy_fdc_state32 *)arg)->spec1);
-			err |= __put_user(f->spec2, &((struct floppy_fdc_state32 *)arg)->spec2);
-			err |= __put_user(f->dtr, &((struct floppy_fdc_state32 *)arg)->dtr);
-			err |= __put_user(f->version, &((struct floppy_fdc_state32 *)arg)->version);
-			err |= __put_user(f->dor, &((struct floppy_fdc_state32 *)arg)->dor);
-			err |= __put_user(f->address, &((struct floppy_fdc_state32 *)arg)->address);
-			err |= __copy_to_user((char *)&((struct floppy_fdc_state32 *)arg)->address
-			    		   + sizeof(((struct floppy_fdc_state32 *)arg)->address),
-					   (char *)&f->address + sizeof(f->address), sizeof(int));
-			err |= __put_user(f->driver_version, &((struct floppy_fdc_state32 *)arg)->driver_version);
-			err |= __copy_to_user(((struct floppy_fdc_state32 *)arg)->track, f->track, sizeof(f->track));
-			break;
-		}
-		case FDWERRORGET32:
-		{
-			struct floppy_write_errors *f = karg;
-
-			err = __put_user(f->write_errors, &((struct floppy_write_errors32 *)arg)->write_errors);
-			err |= __put_user(f->first_error_sector, &((struct floppy_write_errors32 *)arg)->first_error_sector);
-			err |= __put_user(f->first_error_generation, &((struct floppy_write_errors32 *)arg)->first_error_generation);
-			err |= __put_user(f->last_error_sector, &((struct floppy_write_errors32 *)arg)->last_error_sector);
-			err |= __put_user(f->last_error_generation, &((struct floppy_write_errors32 *)arg)->last_error_generation);
-			err |= __put_user(f->badness, &((struct floppy_write_errors32 *)arg)->badness);
-			break;
-		}
-		default:
-			break;
-	}
-	if (err)
-		err = -EFAULT;
-
-out:	if (karg) kfree(karg);
-	return err;
-}
-
-struct ppp_option_data32 {
-	compat_caddr_t	ptr;
-	__u32		length;
-	int		transmit;
-};
-#define PPPIOCSCOMPRESS32	_IOW('t', 77, struct ppp_option_data32)
-
-struct ppp_idle32 {
-	compat_time_t xmit_idle;
-	compat_time_t recv_idle;
-};
-#define PPPIOCGIDLE32		_IOR('t', 63, struct ppp_idle32)
-
-static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct ppp_option_data32 data32;
-	struct ppp_option_data data;
-	struct ppp_idle32 idle32;
-	struct ppp_idle idle;
-	unsigned int kcmd;
-	void *karg;
-	int err = 0;
-
-	switch (cmd) {
-	case PPPIOCGIDLE32:
-		kcmd = PPPIOCGIDLE;
-		karg = &idle;
-		break;
-	case PPPIOCSCOMPRESS32:
-		if (copy_from_user(&data32, (struct ppp_option_data32 *)arg, sizeof(struct ppp_option_data32)))
-			return -EFAULT;
-		data.ptr = kmalloc (data32.length, GFP_KERNEL);
-		if (!data.ptr)
-			return -ENOMEM;
-		if (copy_from_user(data.ptr, (__u8 *)A(data32.ptr), data32.length)) {
-			kfree(data.ptr);
-			return -EFAULT;
-		}
-		data.length = data32.length;
-		data.transmit = data32.transmit;
-		kcmd = PPPIOCSCOMPRESS;
-		karg = &data;
-		break;
-	default:
-		do {
-			static int count = 0;
-			if (++count <= 20)
-				printk(KERN_WARNING
-					"ppp_ioctl: Unknown cmd fd(%d) "
-					"cmd(%08x) arg(%08x)\n",
-					(int)fd, (unsigned int)cmd, (unsigned int)arg);
-		} while(0);
-		return -EINVAL;
-	}
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
-	set_fs (old_fs);
-	switch (cmd) {
-	case PPPIOCGIDLE32:
-		if (err)
-			return err;
-		idle32.xmit_idle = idle.xmit_idle;
-		idle32.recv_idle = idle.recv_idle;
-		if (copy_to_user((struct ppp_idle32 *)arg, &idle32, sizeof(struct ppp_idle32)))
-			return -EFAULT;
-		break;
-	case PPPIOCSCOMPRESS32:
-		kfree(data.ptr);
-		break;
-	default:
-		break;
-	}
-	return err;
-}
-
-
-struct mtget32 {
-	__u32	mt_type;
-	__u32	mt_resid;
-	__u32	mt_dsreg;
-	__u32	mt_gstat;
-	__u32	mt_erreg;
-	compat_daddr_t	mt_fileno;
-	compat_daddr_t	mt_blkno;
-};
-#define MTIOCGET32	_IOR('m', 2, struct mtget32)
-
-struct mtpos32 {
-	__u32	mt_blkno;
-};
-#define MTIOCPOS32	_IOR('m', 3, struct mtpos32)
-
-struct mtconfiginfo32 {
-	__u32	mt_type;
-	__u32	ifc_type;
-	__u16	irqnr;
-	__u16	dmanr;
-	__u16	port;
-	__u32	debug;
-	__u32	have_dens:1;
-	__u32	have_bsf:1;
-	__u32	have_fsr:1;
-	__u32	have_bsr:1;
-	__u32	have_eod:1;
-	__u32	have_seek:1;
-	__u32	have_tell:1;
-	__u32	have_ras1:1;
-	__u32	have_ras2:1;
-	__u32	have_ras3:1;
-	__u32	have_qfa:1;
-	__u32	pad1:5;
-	char	reserved[10];
-};
-#define	MTIOCGETCONFIG32	_IOR('m', 4, struct mtconfiginfo32)
-#define	MTIOCSETCONFIG32	_IOW('m', 5, struct mtconfiginfo32)
-
-static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct mtconfiginfo info;
-	struct mtget get;
-	struct mtpos pos;
-	unsigned long kcmd;
-	void *karg;
-	int err = 0;
-
-	switch(cmd) {
-	case MTIOCPOS32:
-		kcmd = MTIOCPOS;
-		karg = &pos;
-		break;
-	case MTIOCGET32:
-		kcmd = MTIOCGET;
-		karg = &get;
-		break;
-	case MTIOCGETCONFIG32:
-		kcmd = MTIOCGETCONFIG;
-		karg = &info;
-		break;
-	case MTIOCSETCONFIG32:
-		kcmd = MTIOCSETCONFIG;
-		karg = &info;
-		err = __get_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
-		err |= __get_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
-		err |= __get_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
-		err |= __get_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
-		err |= __get_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
-		err |= __get_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
-		err |= __copy_from_user((char *)&info.debug + sizeof(info.debug),
-				     (char *)&((struct mtconfiginfo32 *)arg)->debug
-				     + sizeof(((struct mtconfiginfo32 *)arg)->debug), sizeof(__u32));
-		if (err)
-			return -EFAULT;
-		break;
-	default:
-		do {
-			static int count = 0;
-			if (++count <= 20)
-				printk(KERN_WARNING
-					"mt_ioctl: Unknown cmd fd(%d) "
-					"cmd(%08x) arg(%08x)\n",
-					(int)fd, (unsigned int)cmd, (unsigned int)arg);
-		} while(0);
-		return -EINVAL;
-	}
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
-	set_fs (old_fs);
-	if (err)
-		return err;
-	switch (cmd) {
-	case MTIOCPOS32:
-		err = __put_user(pos.mt_blkno, &((struct mtpos32 *)arg)->mt_blkno);
-		break;
-	case MTIOCGET32:
-		err = __put_user(get.mt_type, &((struct mtget32 *)arg)->mt_type);
-		err |= __put_user(get.mt_resid, &((struct mtget32 *)arg)->mt_resid);
-		err |= __put_user(get.mt_dsreg, &((struct mtget32 *)arg)->mt_dsreg);
-		err |= __put_user(get.mt_gstat, &((struct mtget32 *)arg)->mt_gstat);
-		err |= __put_user(get.mt_erreg, &((struct mtget32 *)arg)->mt_erreg);
-		err |= __put_user(get.mt_fileno, &((struct mtget32 *)arg)->mt_fileno);
-		err |= __put_user(get.mt_blkno, &((struct mtget32 *)arg)->mt_blkno);
-		break;
-	case MTIOCGETCONFIG32:
-		err = __put_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
-		err |= __put_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
-		err |= __put_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
-		err |= __put_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
-		err |= __put_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
-		err |= __put_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
-		err |= __copy_to_user((char *)&((struct mtconfiginfo32 *)arg)->debug
-			    		   + sizeof(((struct mtconfiginfo32 *)arg)->debug),
-					   (char *)&info.debug + sizeof(info.debug), sizeof(__u32));
-		break;
-	case MTIOCSETCONFIG32:
-		break;
-	}
-	return err ? -EFAULT: 0;
-}
-
-struct cdrom_read32 {
-	int		cdread_lba;
-	compat_caddr_t	cdread_bufaddr;
-	int		cdread_buflen;
-};
-
-struct cdrom_read_audio32 {
-	union cdrom_addr	addr;
-	u_char			addr_format;
-	int			nframes;
-	compat_caddr_t		buf;
-};
-
-struct cdrom_generic_command32 {
-	unsigned char	cmd[CDROM_PACKET_SIZE];
-	compat_caddr_t	buffer;
-	unsigned int	buflen;
-	int		stat;
-	compat_caddr_t	sense;
-	compat_caddr_t	reserved[3];
-};
-
-static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct cdrom_read cdread;
-	struct cdrom_read_audio cdreadaudio;
-	struct cdrom_generic_command cgc;
-	compat_caddr_t addr;
-	char *data = 0;
-	void *karg;
-	int err = 0;
-
-	switch(cmd) {
-	case CDROMREADMODE2:
-	case CDROMREADMODE1:
-	case CDROMREADRAW:
-	case CDROMREADCOOKED:
-		karg = &cdread;
-		err = __get_user(cdread.cdread_lba, &((struct cdrom_read32 *)arg)->cdread_lba);
-		err |= __get_user(addr, &((struct cdrom_read32 *)arg)->cdread_bufaddr);
-		err |= __get_user(cdread.cdread_buflen, &((struct cdrom_read32 *)arg)->cdread_buflen);
-		if (err)
-			return -EFAULT;
-		data = kmalloc(cdread.cdread_buflen, GFP_KERNEL);
-		if (!data)
-			return -ENOMEM;
-		cdread.cdread_bufaddr = data;
-		break;
-	case CDROMREADAUDIO:
-		karg = &cdreadaudio;
-		err = copy_from_user(&cdreadaudio.addr, &((struct cdrom_read_audio32 *)arg)->addr, sizeof(cdreadaudio.addr));
-		err |= __get_user(cdreadaudio.addr_format, &((struct cdrom_read_audio32 *)arg)->addr_format);
-		err |= __get_user(cdreadaudio.nframes, &((struct cdrom_read_audio32 *)arg)->nframes); 
-		err |= __get_user(addr, &((struct cdrom_read_audio32 *)arg)->buf);
-		if (err)
-			return -EFAULT;
-		data = kmalloc(cdreadaudio.nframes * 2352, GFP_KERNEL);
-		if (!data)
-			return -ENOMEM;
-		cdreadaudio.buf = data;
-		break;
-	case CDROM_SEND_PACKET:
-		karg = &cgc;
-		err = copy_from_user(cgc.cmd, &((struct cdrom_generic_command32 *)arg)->cmd, sizeof(cgc.cmd));
-		err |= __get_user(addr, &((struct cdrom_generic_command32 *)arg)->buffer);
-		err |= __get_user(cgc.buflen, &((struct cdrom_generic_command32 *)arg)->buflen);
-		if (err)
-			return -EFAULT;
-		if ((data = kmalloc(cgc.buflen, GFP_KERNEL)) == NULL)
-			return -ENOMEM;
-		cgc.buffer = data;
-		break;
-	default:
-		do {
-			static int count = 0;
-			if (++count <= 20)
-				printk(KERN_WARNING
-					"cdrom_ioctl: Unknown cmd fd(%d) "
-					"cmd(%08x) arg(%08x)\n",
-					(int)fd, (unsigned int)cmd, (unsigned int)arg);
-		} while(0);
-		return -EINVAL;
-	}
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, cmd, (unsigned long)karg);
-	set_fs (old_fs);
-	if (err)
-		goto out;
-	switch (cmd) {
-	case CDROMREADMODE2:
-	case CDROMREADMODE1:
-	case CDROMREADRAW:
-	case CDROMREADCOOKED:
-		err = copy_to_user((char *)A(addr), data, cdread.cdread_buflen);
-		break;
-	case CDROMREADAUDIO:
-		err = copy_to_user((char *)A(addr), data, cdreadaudio.nframes * 2352);
-		break;
-	case CDROM_SEND_PACKET:
-		err = copy_to_user((char *)A(addr), data, cgc.buflen);
-		break;
-	default:
-		break;
-	}
-out:	if (data)
-		kfree(data);
-	return err ? -EFAULT : 0;
-}
-
-struct loop_info32 {
-	int		lo_number;      /* ioctl r/o */
-	compat_dev_t	lo_device;      /* ioctl r/o */
-	unsigned int	lo_inode;       /* ioctl r/o */
-	compat_dev_t	lo_rdevice;     /* ioctl r/o */
-	int		lo_offset;
-	int		lo_encrypt_type;
-	int		lo_encrypt_key_size;    /* ioctl w/o */
-	int		lo_flags;       /* ioctl r/o */
-	char		lo_name[LO_NAME_SIZE];
-	unsigned char	lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
-	unsigned int	lo_init[2];
-	char		reserved[4];
-};
-
-static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct loop_info l;
-	int err = -EINVAL;
-
-	switch(cmd) {
-	case LOOP_SET_STATUS:
-		err = get_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
-		err |= __get_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
-		err |= __get_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
-		err |= __get_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
-		err |= __copy_from_user((char *)&l.lo_offset, (char *)&((struct loop_info32 *)arg)->lo_offset,
-					   8 + (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
-		if (err) {
-			err = -EFAULT;
-		} else {
-			set_fs (KERNEL_DS);
-			err = sys_ioctl (fd, cmd, (unsigned long)&l);
-			set_fs (old_fs);
-		}
-		break;
-	case LOOP_GET_STATUS:
-		set_fs (KERNEL_DS);
-		err = sys_ioctl (fd, cmd, (unsigned long)&l);
-		set_fs (old_fs);
-		if (!err) {
-			err = put_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
-			err |= __put_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
-			err |= __put_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
-			err |= __put_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
-			err |= __copy_to_user((char *)&((struct loop_info32 *)arg)->lo_offset,
-					   (char *)&l.lo_offset, (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
-			if (err)
-				err = -EFAULT;
-		}
-		break;
-	default: {
-		static int count = 0;
-		if (++count <= 20)
-			printk(KERN_WARNING
-				"%s: Unknown loop ioctl cmd, fd(%d) "
-				"cmd(%08x) arg(%08lx)\n",
-				__FUNCTION__, fd, cmd, arg);
-	}
-	}
-	return err;
-}
-
-#ifdef CONFIG_VT
-extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
-
-static int vt_check(struct file *file)
-{
-	struct tty_struct *tty;
-	struct inode *inode = file->f_dentry->d_inode;
-	
-	if (file->f_op->ioctl != tty_ioctl)
-		return -EINVAL;
-	                
-	tty = (struct tty_struct *)file->private_data;
-	if (tty_paranoia_check(tty, inode, "tty_ioctl"))
-		return -EINVAL;
-	                                                
-	if (tty->driver->ioctl != vt_ioctl)
-		return -EINVAL;
-	
-	/*
-	 * To have permissions to do most of the vt ioctls, we either have
-	 * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG
-	 */
-	if (current->tty == tty || capable(CAP_SYS_TTY_CONFIG))
-		return 1;
-	return 0;                                                    
-}
-
-struct consolefontdesc32 {
-	unsigned short charcount;       /* characters in font (256 or 512) */
-	unsigned short charheight;      /* scan lines per character (1-32) */
-	u32 chardata;			/* font data in expanded form */
-};
-
-static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file)
-{
-	struct consolefontdesc cfdarg;
-	struct console_font_op op;
-	int i, perm;
-
-	perm = vt_check(file);
-	if (perm < 0) return perm;
-	
-	if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc32)))
-		return -EFAULT;
-	
-	cfdarg.chardata = (unsigned char *)A(((struct consolefontdesc32 *)&cfdarg)->chardata);
- 	
-	switch (cmd) {
-	case PIO_FONTX:
-		if (!perm)
-			return -EPERM;
-		op.op = KD_FONT_OP_SET;
-		op.flags = 0;
-		op.width = 8;
-		op.height = cfdarg.charheight;
-		op.charcount = cfdarg.charcount;
-		op.data = cfdarg.chardata;
-		return con_font_op(fg_console, &op);
-	case GIO_FONTX:
-		if (!cfdarg.chardata)
-			return 0;
-		op.op = KD_FONT_OP_GET;
-		op.flags = 0;
-		op.width = 8;
-		op.height = cfdarg.charheight;
-		op.charcount = cfdarg.charcount;
-		op.data = cfdarg.chardata;
-		i = con_font_op(fg_console, &op);
-		if (i)
-			return i;
-		cfdarg.charheight = op.height;
-		cfdarg.charcount = op.charcount;
-		((struct consolefontdesc32 *)&cfdarg)->chardata	= (unsigned long)cfdarg.chardata;
-		if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc32)))
-			return -EFAULT;
-		return 0;
-	}
-	return -EINVAL;
-}
-
-struct console_font_op32 {
-	unsigned int op;        /* operation code KD_FONT_OP_* */
-	unsigned int flags;     /* KD_FONT_FLAG_* */
-	unsigned int width, height;     /* font size */
-	unsigned int charcount;
-	u32 data;    /* font data with height fixed to 32 */
-};
-                                        
-static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file)
-{
-	struct console_font_op op;
-	int perm = vt_check(file), i;
-	struct vt_struct *vt;
-	
-	if (perm < 0) return perm;
-	
-	if (copy_from_user(&op, (void *) fontop, sizeof(struct console_font_op32)))
-		return -EFAULT;
-	if (!perm && op.op != KD_FONT_OP_GET)
-		return -EPERM;
-	op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data);
-	op.flags |= KD_FONT_FLAG_OLD;
-	vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
-	i = con_font_op(vt->vc_num, &op);
-	if (i) return i;
-	((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
-	if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32)))
-		return -EFAULT;
-	return 0;
-}
-
-struct unimapdesc32 {
-	unsigned short entry_ct;
-	u32 entries;
-};
-
-static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file)
-{
-	struct unimapdesc32 tmp;
-	int perm = vt_check(file);
-	
-	if (perm < 0) return perm;
-	if (copy_from_user(&tmp, user_ud, sizeof tmp))
-		return -EFAULT;
-	switch (cmd) {
-	case PIO_UNIMAP:
-		if (!perm) return -EPERM;
-		return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries));
-	case GIO_UNIMAP:
-		return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries));
-	}
-	return 0;
-}
-#endif
-
-#if 0
-static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	__kernel_uid_t kuid;
-	int err;
-
-	cmd = SMB_IOC_GETMOUNTUID;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
-	set_fs(old_fs);
-
-	if (err >= 0)
-		err = put_user(kuid, (compat_uid_t *)arg);
-
-	return err;
-}
-#endif
-
-struct atmif_sioc32 {
-        int		number;
-        int		length;
-        compat_caddr_t	arg;
-};
-
-struct atm_iobuf32 {
-	int		length;
-	compat_caddr_t	buffer;
-};
-
-#define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32)
-#define ATM_GETNAMES32    _IOW('a', ATMIOC_ITF+3, struct atm_iobuf32)
-#define ATM_GETTYPE32     _IOW('a', ATMIOC_ITF+4, struct atmif_sioc32)
-#define ATM_GETESI32	  _IOW('a', ATMIOC_ITF+5, struct atmif_sioc32)
-#define ATM_GETADDR32	  _IOW('a', ATMIOC_ITF+6, struct atmif_sioc32)
-#define ATM_RSTADDR32	  _IOW('a', ATMIOC_ITF+7, struct atmif_sioc32)
-#define ATM_ADDADDR32	  _IOW('a', ATMIOC_ITF+8, struct atmif_sioc32)
-#define ATM_DELADDR32	  _IOW('a', ATMIOC_ITF+9, struct atmif_sioc32)
-#define ATM_GETCIRANGE32  _IOW('a', ATMIOC_ITF+10, struct atmif_sioc32)
-#define ATM_SETCIRANGE32  _IOW('a', ATMIOC_ITF+11, struct atmif_sioc32)
-#define ATM_SETESI32      _IOW('a', ATMIOC_ITF+12, struct atmif_sioc32)
-#define ATM_SETESIF32     _IOW('a', ATMIOC_ITF+13, struct atmif_sioc32)
-#define ATM_GETSTAT32     _IOW('a', ATMIOC_SARCOM+0, struct atmif_sioc32)
-#define ATM_GETSTATZ32    _IOW('a', ATMIOC_SARCOM+1, struct atmif_sioc32)
-#define ATM_GETLOOP32	  _IOW('a', ATMIOC_SARCOM+2, struct atmif_sioc32)
-#define ATM_SETLOOP32	  _IOW('a', ATMIOC_SARCOM+3, struct atmif_sioc32)
-#define ATM_QUERYLOOP32	  _IOW('a', ATMIOC_SARCOM+4, struct atmif_sioc32)
-
-static struct {
-        unsigned int cmd32;
-        unsigned int cmd;
-} atm_ioctl_map[] = {
-        { ATM_GETLINKRATE32, ATM_GETLINKRATE },
-	{ ATM_GETNAMES32,    ATM_GETNAMES },
-        { ATM_GETTYPE32,     ATM_GETTYPE },
-        { ATM_GETESI32,      ATM_GETESI },
-        { ATM_GETADDR32,     ATM_GETADDR },
-        { ATM_RSTADDR32,     ATM_RSTADDR },
-        { ATM_ADDADDR32,     ATM_ADDADDR },
-        { ATM_DELADDR32,     ATM_DELADDR },
-        { ATM_GETCIRANGE32,  ATM_GETCIRANGE },
-	{ ATM_SETCIRANGE32,  ATM_SETCIRANGE },
-	{ ATM_SETESI32,      ATM_SETESI },
-	{ ATM_SETESIF32,     ATM_SETESIF },
-	{ ATM_GETSTAT32,     ATM_GETSTAT },
-	{ ATM_GETSTATZ32,    ATM_GETSTATZ },
-	{ ATM_GETLOOP32,     ATM_GETLOOP },
-	{ ATM_SETLOOP32,     ATM_SETLOOP },
-	{ ATM_QUERYLOOP32,   ATM_QUERYLOOP }
-};
-
-#define NR_ATM_IOCTL (sizeof(atm_ioctl_map)/sizeof(atm_ioctl_map[0]))
-
-
-static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct atm_iobuf32 iobuf32;
-	struct atm_iobuf   iobuf = { 0, NULL };
-	mm_segment_t old_fs;
-	int err;
-
-	err = copy_from_user(&iobuf32, (struct atm_iobuf32*)arg,
-	    sizeof(struct atm_iobuf32));
-	if (err)
-		return -EFAULT;
-
-	iobuf.length = iobuf32.length;
-
-	if (iobuf32.buffer == (compat_caddr_t) NULL || iobuf32.length == 0) {
-		iobuf.buffer = (void*)(unsigned long)iobuf32.buffer;
-	} else {
-		iobuf.buffer = kmalloc(iobuf.length, GFP_KERNEL);
-		if (iobuf.buffer == NULL) {
-			err = -ENOMEM;
-			goto out;
-		}
-
-		err = copy_from_user(iobuf.buffer, B(iobuf32.buffer), iobuf.length);
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, cmd, (unsigned long)&iobuf);      
-	set_fs (old_fs);
-        if(err)
-		goto out;
-
-        if(iobuf.buffer && iobuf.length > 0) {
-		err = copy_to_user(B(iobuf32.buffer), iobuf.buffer, iobuf.length);
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-	err = __put_user(iobuf.length, &(((struct atm_iobuf32*)arg)->length));
-
- out:
-        if(iobuf32.buffer && iobuf32.length > 0)
-		kfree(iobuf.buffer);
-
-	return err;
-}
-
-
-static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-        struct atmif_sioc32 sioc32;
-        struct atmif_sioc   sioc = { 0, 0, NULL };
-        mm_segment_t old_fs;
-        int err;
-        
-        err = copy_from_user(&sioc32, (struct atmif_sioc32*)arg,
-			     sizeof(struct atmif_sioc32));
-        if (err)
-                return -EFAULT;
-
-        sioc.number = sioc32.number;
-        sioc.length = sioc32.length;
-        
-	if (sioc32.arg == (compat_caddr_t) NULL || sioc32.length == 0) {
-		sioc.arg = (void*)(unsigned long)sioc32.arg;
-        } else {
-                sioc.arg = kmalloc(sioc.length, GFP_KERNEL);
-                if (sioc.arg == NULL) {
-                        err = -ENOMEM;
-			goto out;
-		}
-                
-                err = copy_from_user(sioc.arg, B(sioc32.arg), sioc32.length);
-                if (err) {
-                        err = -EFAULT;
-                        goto out;
-                }
-        }
-        
-        old_fs = get_fs(); set_fs (KERNEL_DS);
-        err = sys_ioctl (fd, cmd, (unsigned long)&sioc);	
-        set_fs (old_fs);
-        if(err) {
-                goto out;
-	}
-        
-        if(sioc.arg && sioc.length > 0) {
-                err = copy_to_user(B(sioc32.arg), sioc.arg, sioc.length);
-                if (err) {
-                        err = -EFAULT;
-                        goto out;
-                }
-        }
-        err = __put_user(sioc.length, &(((struct atmif_sioc32*)arg)->length));
-        
- out:
-        if(sioc32.arg && sioc32.length > 0)
-		kfree(sioc.arg);
-        
-	return err;
-}
-
-
-static int do_atm_ioctl(unsigned int fd, unsigned int cmd32, unsigned long arg)
-{
-        int i;
-        unsigned int cmd = 0;
-        
-	switch (cmd32) {
-	case SONET_GETSTAT:
-	case SONET_GETSTATZ:
-	case SONET_GETDIAG:
-	case SONET_SETDIAG:
-	case SONET_CLRDIAG:
-	case SONET_SETFRAMING:
-	case SONET_GETFRAMING:
-	case SONET_GETFRSENSE:
-		return do_atmif_sioc(fd, cmd32, arg);
-	}
-
-		for (i = 0; i < NR_ATM_IOCTL; i++) {
-			if (cmd32 == atm_ioctl_map[i].cmd32) {
-				cmd = atm_ioctl_map[i].cmd;
-				break;
-			}
-		}
-	        if (i == NR_ATM_IOCTL) {
-	        return -EINVAL;
-	        }
-        
-        switch (cmd) {
-	case ATM_GETNAMES:
-		return do_atm_iobuf(fd, cmd, arg);
-	    
-	case ATM_GETLINKRATE:
-        case ATM_GETTYPE:
-        case ATM_GETESI:
-        case ATM_GETADDR:
-        case ATM_RSTADDR:
-        case ATM_ADDADDR:
-        case ATM_DELADDR:
-        case ATM_GETCIRANGE:
-	case ATM_SETCIRANGE:
-	case ATM_SETESI:
-	case ATM_SETESIF:
-	case ATM_GETSTAT:
-	case ATM_GETSTATZ:
-	case ATM_GETLOOP:
-	case ATM_SETLOOP:
-	case ATM_QUERYLOOP:
-                return do_atmif_sioc(fd, cmd, arg);
-        }
-
-        return -EINVAL;
-}
-
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 /* This really belongs in include/linux/drm.h -DaveM */
 #include "../../../drivers/char/drm/drm.h"
@@ -2323,137 +561,6 @@
 
 #endif
 
-static int ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return -EINVAL;
-}
-
-static int broken_blkgetsize(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	/* The mkswap binary hard codes it to Intel value :-((( */
-	return w_long(fd, BLKGETSIZE, arg);
-}
-
-struct blkpg_ioctl_arg32 {
-	int op;
-	int flags;
-	int datalen;
-	u32 data;
-};
-                                
-static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, struct blkpg_ioctl_arg32 *arg)
-{
-	struct blkpg_ioctl_arg a;
-	struct blkpg_partition p;
-	int err;
-	mm_segment_t old_fs = get_fs();
-	
-	err = get_user(a.op, &arg->op);
-	err |= __get_user(a.flags, &arg->flags);
-	err |= __get_user(a.datalen, &arg->datalen);
-	err |= __get_user((long)a.data, &arg->data);
-	if (err) return err;
-	switch (a.op) {
-	case BLKPG_ADD_PARTITION:
-	case BLKPG_DEL_PARTITION:
-		if (a.datalen < sizeof(struct blkpg_partition))
-			return -EINVAL;
-                if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition)))
-			return -EFAULT;
-		a.data = &p;
-		set_fs (KERNEL_DS);
-		err = sys_ioctl(fd, cmd, (unsigned long)&a);
-		set_fs (old_fs);
-	default:
-		return -EINVAL;
-	}                                        
-	return err;
-}
-
-/* Fix sizeof(sizeof()) breakage */
-#define BLKBSZGET_32	_IOR(0x12,112,int)
-#define BLKBSZSET_32	_IOW(0x12,113,int)
-#define BLKGETSIZE64_32	_IOR(0x12,114,int)
-
-static int do_blkbszget(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return sys_ioctl(fd, BLKBSZGET, arg);
-}
-
-static int do_blkbszset(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return sys_ioctl(fd, BLKBSZSET, arg);
-}
-
-static int do_blkgetsize64(unsigned int fd, unsigned int cmd,
-			   unsigned long arg)
-{
-	return sys_ioctl(fd, BLKGETSIZE64, arg);
-}
-
-static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
-}
-
-/* USB to be done */
-
-
-struct serial_struct32 {
-	int	type;
-	int	line;
-	unsigned int	port;
-	int	irq;
-	int	flags;
-	int	xmit_fifo_size;
-	int	custom_divisor;
-	int	baud_base;
-	unsigned short	close_delay;
-	char	io_type;
-	char	reserved_char[1];
-	int	hub6;
-	unsigned short	closing_wait; /* time to wait before closing */
-	unsigned short	closing_wait2; /* no longer used... */
-	unsigned int	iomem_base;	/* char * really */
-	unsigned short	iomem_reg_shift;
-	unsigned int	port_high;
-	int	reserved[1];
-};
-
-static int do_tiocgserial(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct serial_struct ss;
-	int ret;
-	struct serial_struct32 * uptr = (struct serial_struct32 *)arg;
-	mm_segment_t old_fs = get_fs();
-
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl(fd, cmd, (unsigned long) &ss);
-	set_fs(old_fs);
-
-	if (!ret) {
-		/* structs match up to iomem_base */
-		ret = copy_to_user(uptr, &ss, sizeof(struct serial_struct32));
-		ret |= put_user(ss.iomem_base, &uptr->iomem_base);
-		ret |= put_user(ss.iomem_reg_shift, &uptr->iomem_reg_shift);
-		ret |= put_user(ss.port_high, &uptr->port_high);
-		if (ret)
-			ret = -EFAULT;
-	}
-	return ret;
-}
-
-int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	int err = sys_ioctl(fd, cmd, arg);
-	if ((unsigned) err > -4095)
-		printk(KERN_WARNING 
-			"ioctl(%d, 0x%x, %p) -- SIOCDEVPRIVATE-based ioctls aren't really\n"
-			"supported, though some will work by accident.\n",
-		    fd, cmd, (void *)arg);
-	return err;
-}
-
 #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, 0 },
 #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) 
 
@@ -2463,6 +570,9 @@
 IOCTL_TABLE_START
 #include <linux/compat_ioctl.h>
 
+#define DECLARES
+#include "compat_ioctl.c"
+
 /* Might be moved to compat_ioctl.h with some ifdefs... */
 COMPATIBLE_IOCTL(TIOCSTART)
 COMPATIBLE_IOCTL(TIOCSTOP)
@@ -2474,132 +584,10 @@
 COMPATIBLE_IOCTL(PA_PERF_VERSION)
 
 /* And these ioctls need translation */
-HANDLE_IOCTL(TIOCGSERIAL, do_tiocgserial)
-HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
-HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
-HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMETRIC, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMETRIC, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMTU, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMTU, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMEM, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMEM, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFHWADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFHWADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCADDMULTI, dev_ifsioc)
-HANDLE_IOCTL(SIOCDELMULTI, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFINDEX, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMAP, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMAP, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFBRDADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFBRDADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFDSTADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFDSTADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFNETMASK, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFNETMASK, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
 HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
 HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
 HANDLE_IOCTL(SIOCGPPPVER, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
-HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
-HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
-/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
-HANDLE_IOCTL(SIOCRTMSG, ret_einval)
-HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
-HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)
-HANDLE_IOCTL(BLKGETSIZE, w_long)
-HANDLE_IOCTL(0x1260, broken_blkgetsize)
-HANDLE_IOCTL(BLKSECTGET, w_long)
-HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
-/* take care of sizeof(sizeof()) breakage */
-/* block stuff */
-HANDLE_IOCTL(BLKBSZGET_32, do_blkbszget)
-HANDLE_IOCTL(BLKBSZSET_32, do_blkbszset)
-HANDLE_IOCTL(BLKGETSIZE64_32, do_blkgetsize64)
-
-HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans)
-HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans)
-HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans)
-
-HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_MULTCOUNT, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_NOWERR, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_NICE, hdio_ioctl_trans)
-HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
-HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
-HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)
-HANDLE_IOCTL(FDSETDRVPRM32, fd_ioctl_trans)
-HANDLE_IOCTL(FDGETDRVPRM32, fd_ioctl_trans)
-HANDLE_IOCTL(FDGETDRVSTAT32, fd_ioctl_trans)
-HANDLE_IOCTL(FDPOLLDRVSTAT32, fd_ioctl_trans)
-HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans)
-HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
-HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
-HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
-HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCGETCONFIG32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCSETCONFIG32, mt_ioctl_trans)
-HANDLE_IOCTL(CDROMREADMODE2, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROMREADMODE1, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROMREADRAW, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROMREADCOOKED, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROMREADALL, cdrom_ioctl_trans)
-HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
-HANDLE_IOCTL(LOOP_SET_STATUS, loop_status)
-HANDLE_IOCTL(LOOP_GET_STATUS, loop_status)
-#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
-HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
-#ifdef CONFIG_VT
-HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl)
-HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl)
-HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl)
-HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl)
-HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
-#endif
-HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
-#if 0
-/* One SMB ioctl needs translations. */
-#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
-HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
-#endif
-HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETTYPE32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETESI32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETADDR32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_RSTADDR32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_ADDADDR32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_DELADDR32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETCIRANGE32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_SETCIRANGE32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_SETESI32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_SETESIF32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETSTAT32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETSTATZ32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_GETLOOP32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_SETLOOP32, do_atm_ioctl)
-HANDLE_IOCTL(ATM_QUERYLOOP32, do_atm_ioctl)
-HANDLE_IOCTL(SONET_GETSTAT, do_atm_ioctl)
-HANDLE_IOCTL(SONET_GETSTATZ, do_atm_ioctl)
-HANDLE_IOCTL(SONET_GETDIAG, do_atm_ioctl)
-HANDLE_IOCTL(SONET_SETDIAG, do_atm_ioctl)
-HANDLE_IOCTL(SONET_CLRDIAG, do_atm_ioctl)
-HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
-HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
-HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
+
 #if defined(CONFIG_GEN_RTC)
 COMPATIBLE_IOCTL(RTC_AIE_ON)
 COMPATIBLE_IOCTL(RTC_AIE_OFF)
@@ -2618,6 +606,7 @@
 HANDLE_IOCTL(RTC_EPOCH_READ, w_long)
 COMPATIBLE_IOCTL(RTC_EPOCH_SET)
 #endif
+
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version);
 HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique);
diff -Nru a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
--- a/arch/parisc/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -215,29 +215,30 @@
 int show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_PROC_FS
-	unsigned int regnr = 0;
+	unsigned int regnr = *(loff_t *) v, i = 0;
 
-	seq_puts(p, "     ");
+	if (regnr == 0) {
+		seq_puts(p, "     ");
 #ifdef CONFIG_SMP
-	for (regnr = 0; regnr < NR_CPUS; regnr++)
+		for (i = 0; i < NR_CPUS; i++)
 #endif
-		seq_printf(p, "      CPU%02d ", regnr);
+			seq_printf(p, "      CPU%02d ", i);
 
 #ifdef PARISC_IRQ_CR16_COUNTS
-	seq_printf(p, "[min/avg/max] (CPU cycle counts)");
+		seq_printf(p, "[min/avg/max] (CPU cycle counts)");
 #endif
-	seq_putc(p, '\n');
+		seq_putc(p, '\n');
+	}
 
 	/* We don't need *irqsave lock variants since this is
 	** only allowed to change while in the base context.
 	*/
 	spin_lock(&irq_lock);
-	for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
-	    unsigned int i;
+	if (regnr < NR_IRQ_REGS) {
 	    struct irq_region *region = irq_region[regnr];
 
             if (!region || !region->action)
-		continue;
+		    goto skip;
 
 	    for (i = 0; i <= MAX_CPU_IRQ; i++) {
 		struct irqaction *action = &region->action[i];
@@ -286,9 +287,9 @@
 		seq_putc(p, '\n');
 	    }
 	}
+  skip:
 	spin_unlock(&irq_lock);
 
-	seq_putc(p, '\n');
 #endif	/* CONFIG_PROC_FS */
 	return 0;
 }
diff -Nru a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
--- a/arch/parisc/kernel/pacache.S	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/pacache.S	Thu Jan  8 23:00:23 2004
@@ -79,13 +79,13 @@
 	ldil    L%REAL_MODE_PSW, %r1
 	ldo     R%REAL_MODE_PSW(%r1), %r1
 	mtctl	%r1, %cr22
-	mtctl	%r0, %cr17
-	mtctl	%r0, %cr17
+	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+	mtctl	%r0, %cr17	/* Clear IIASQ head */
 	ldil    L%PA(1f),%r1
 	ldo     R%PA(1f)(%r1),%r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ head */
 	ldo	4(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ tail */
 	rfi
 	nop
 
@@ -185,13 +185,13 @@
 	ldo	R%KERNEL_PSW(%r1), %r1
 	or      %r1,%r19,%r1    /* Set I bit if set on entry */
 	mtctl	%r1, %cr22
-	mtctl	%r0, %cr17
-	mtctl	%r0, %cr17
+	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+	mtctl	%r0, %cr17	/* Clear IIASQ head */
 	ldil    L%(2f), %r1
 	ldo     R%(2f)(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ head */
 	ldo	4(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ tail */
 	rfi
 	nop
 
@@ -837,13 +837,13 @@
 	ldil    L%REAL_MODE_PSW, %r1
 	ldo     R%REAL_MODE_PSW(%r1), %r1
 	mtctl	%r1, %cr22
-	mtctl	%r0, %cr17
-	mtctl	%r0, %cr17
+	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+	mtctl	%r0, %cr17	/* Clear IIASQ head */
 	ldil    L%PA(1f),%r1
 	ldo     R%PA(1f)(%r1),%r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ head */
 	ldo	4(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ tail */
 	rfi
 	nop
 
@@ -889,13 +889,13 @@
 	ldil	L%KERNEL_PSW, %r1
 	ldo	R%KERNEL_PSW(%r1), %r1
 	mtctl	%r1, %cr22
-	mtctl	%r0, %cr17
-	mtctl	%r0, %cr17
+	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+	mtctl	%r0, %cr17	/* Clear IIASQ head */
 	ldil    L%(2f), %r1
 	ldo     R%(2f)(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ head */
 	ldo	4(%r1), %r1
-	mtctl	%r1, %cr18
+	mtctl	%r1, %cr18	/* IIAOQ tail */
 	rfi
 	nop
 
diff -Nru a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c
--- a/arch/parisc/kernel/parisc_ksyms.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/parisc_ksyms.c	Thu Jan  8 23:00:24 2004
@@ -26,10 +26,6 @@
 EXPORT_SYMBOL(strstr);
 EXPORT_SYMBOL(strpbrk);
 
-#include <asm/processor.h>
-EXPORT_SYMBOL(kernel_thread);
-EXPORT_SYMBOL(boot_cpu_data);
-
 #include <linux/pm.h>
 EXPORT_SYMBOL(pm_power_off);
 
@@ -63,15 +59,6 @@
 EXPORT_SYMBOL(__memcpy_toio);
 EXPORT_SYMBOL(__memcpy_fromio);
 EXPORT_SYMBOL(__memset_io);
-
-#include <asm/cache.h>
-EXPORT_SYMBOL(flush_kernel_dcache_range_asm);
-EXPORT_SYMBOL(flush_kernel_dcache_page);
-EXPORT_SYMBOL(flush_data_cache_local);
-EXPORT_SYMBOL(flush_kernel_icache_range_asm);
-EXPORT_SYMBOL(flush_all_caches);
-EXPORT_SYMBOL(dcache_stride);
-EXPORT_SYMBOL(flush_cache_all_local);
 
 #include <asm/unistd.h>
 extern long sys_open(const char *, int, int);
diff -Nru a/arch/parisc/kernel/pdc_chassis.c b/arch/parisc/kernel/pdc_chassis.c
--- a/arch/parisc/kernel/pdc_chassis.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/pdc_chassis.c	Thu Jan  8 23:00:24 2004
@@ -2,7 +2,7 @@
  *		arch/parisc/kernel/pdc_chassis.c
  *
  * 		Copyright (C) 2002 Laurent Canet <canetl@esiee.fr>
- *		Copyright (C) 2002 Thibaut Varene <varenet@esiee.fr>
+ *		Copyright (C) 2002-2003 Thibaut Varene <varenet@esiee.fr>
  *
  *
  *		This program is free software; you can redistribute it and/or modify
@@ -35,6 +35,8 @@
 #include <asm/pdc_chassis.h>
 #include <asm/processor.h>
 
+
+#ifdef CONFIG_PDC_CHASSIS
 static int pdc_chassis_old = 0;	
 
 
@@ -102,6 +104,7 @@
 	.notifier_call = pdc_chassis_reboot_event,
 	.priority = INT_MAX,
 };
+#endif /* CONFIG_PDC_CHASSIS */
 
 
 /**
@@ -110,16 +113,33 @@
 
 void __init parisc_pdc_chassis_init(void)
 {
-	DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
-
-	/* initialize panic notifier chain */
-	notifier_chain_register(&panic_notifier_list, &pdc_chassis_panic_block);
+#ifdef CONFIG_PDC_CHASSIS
+	int handle = 0;
 
-	/* initialize reboot notifier chain */
-	register_reboot_notifier(&pdc_chassis_reboot_block);
+	DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
 
-	/* Check for old LED Panel */
+	/* Let see if we have something to handle... */
+	/* Check for PDC_PAT or old LED Panel */
 	pdc_chassis_checkold();
+	if (is_pdc_pat()) {
+#ifdef __LP64__	/* see pdc_chassis_send_status() */
+		printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
+		handle = 1;
+#endif /* __LP64__ */
+	}
+	else if (pdc_chassis_old) {
+		printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
+		handle = 1;
+	}
+	
+	if (handle) {
+		/* initialize panic notifier chain */
+		notifier_chain_register(&panic_notifier_list, &pdc_chassis_panic_block);
+
+		/* initialize reboot notifier chain */
+		register_reboot_notifier(&pdc_chassis_reboot_block);
+	}
+#endif /* CONFIG_PDC_CHASSIS */
 }
 
 
@@ -128,7 +148,8 @@
  * and changes the front panel LEDs according to the new system state
  * @retval: PDC call return value.
  *
- * Only machines with 64 bits PDC PAT and E-class are supported atm.
+ * Only machines with 64 bits PDC PAT and those reported in
+ * pdc_chassis_checkold() are supported atm.
  * 
  * returns 0 if no error, -1 if no supported PDC is present or invalid message,
  * else returns the appropriate PDC error code.
@@ -140,7 +161,7 @@
 {
 	/* Maybe we should do that in an other way ? */
 	int retval = 0;
-
+#ifdef CONFIG_PDC_CHASSIS
 	DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
 
 #ifdef __LP64__	/* pdc_pat_chassis_send_log is defined only when #ifdef __LP64__ */
@@ -199,7 +220,7 @@
 				retval = -1;
 		}
 	} else retval = -1;
-#endif
-		
+#endif /* __LP64__ */
+#endif /* CONFIG_PDC_CHASSIS */
 	return retval;
 }
diff -Nru a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c
--- a/arch/parisc/kernel/pdc_cons.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/pdc_cons.c	Thu Jan  8 23:00:23 2004
@@ -61,16 +61,6 @@
 	*index = c->index ? c->index-1 : fg_console;
 	return &console_driver;
 }
-
-#elif defined(CONFIG_SERIAL_MUX)
-#warning CONFIG_SERIAL_MUX
-#define PDC_CONSOLE_DEVICE pdc_console_device
-#warning "FIXME - should be: static struct tty_driver * pdc_console_device (struct console *c, int *index)"
-static kdev_t pdc_console_device (struct console *c, int *index)
-{
-        return mk_kdev(MUX_MAJOR, 0);
-}
-
 #else
 #define PDC_CONSOLE_DEVICE NULL
 #endif
@@ -105,7 +95,7 @@
 
 void __init pdc_console_init(void)
 {
-#if defined(EARLY_BOOTUP_DEBUG) || defined(CONFIG_PDC_CONSOLE) || defined(CONFIG_SERIAL_MUX)
+#if defined(EARLY_BOOTUP_DEBUG) || defined(CONFIG_PDC_CONSOLE)
 	pdc_console_init_force();
 #endif
 #ifdef EARLY_BOOTUP_DEBUG
diff -Nru a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
--- a/arch/parisc/kernel/process.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/process.c	Thu Jan  8 23:00:24 2004
@@ -179,6 +179,7 @@
 
 	return __kernel_thread(fn, arg, flags);
 }
+EXPORT_SYMBOL(kernel_thread);
 
 /*
  * Free current thread data structures etc..
diff -Nru a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c
--- a/arch/parisc/kernel/processor.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/processor.c	Thu Jan  8 23:00:24 2004
@@ -27,14 +27,12 @@
  *
  */
 #include <linux/config.h>
+#include <linux/delay.h>
+#include <linux/init.h>
 #include <linux/mm.h>
-#include <linux/slab.h>
+#include <linux/module.h>
 #include <linux/seq_file.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#define PCI_DEBUG
-#include <linux/pci.h>
-#undef PCI_DEBUG
+#include <linux/slab.h>
 
 #include <asm/cache.h>
 #include <asm/hardware.h>	/* for register_parisc_driver() stuff */
@@ -45,6 +43,8 @@
 #include <asm/parisc-device.h>
 
 struct system_cpuinfo_parisc boot_cpu_data;
+EXPORT_SYMBOL(boot_cpu_data);
+
 struct cpuinfo_parisc cpu_data[NR_CPUS];
 
 /*
@@ -105,11 +105,11 @@
 		status = pdc_pat_cell_module(&bytecnt, dev->pcell_loc,
 			dev->mod_index, PA_VIEW, &pa_pdc_cell);
 
-		ASSERT(PDC_OK == status);
+		BUG_ON(PDC_OK != status);
 
 		/* verify it's the same as what do_pat_inventory() found */
-		ASSERT(dev->mod_info == pa_pdc_cell.mod_info);
-		ASSERT(dev->pmod_loc == pa_pdc_cell.mod_location);
+		BUG_ON(dev->mod_info != pa_pdc_cell.mod_info);
+		BUG_ON(dev->pmod_loc != pa_pdc_cell.mod_location);
 
 		txn_addr = pa_pdc_cell.mod[0];   /* id_eid for IO sapic */
 
@@ -122,7 +122,7 @@
 		/* get the cpu number */
 		status = pdc_pat_cpu_get_number(&cpu_info, dev->hpa);
 
-		ASSERT(PDC_OK == status);
+		BUG_ON(PDC_OK != status);
 
 		if (cpu_info.cpu_num >= NR_CPUS) {
 			printk(KERN_WARNING "IGNORING CPU at 0x%x,"
diff -Nru a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S
--- a/arch/parisc/kernel/real2.S	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/real2.S	Thu Jan  8 23:00:24 2004
@@ -154,12 +154,12 @@
 	nop
 	
 	rsm             (PSW_SM_Q|PSW_SM_I),%r0  /* disable Q & I bits to load iia queue */
-	mtctl		0, %cr17	/* space 0 */
-	mtctl		0, %cr17
+	mtctl		%r0, %cr17	/* Clear IIASQ tail */
+	mtctl		%r0, %cr17	/* Clear IIASQ head */
 	load32		PA(rfi_v2r_1), %r1
-	mtctl		%r1, %cr18
+	mtctl		%r1, %cr18	/* IIAOQ head */
 	ldo		4(%r1), %r1
-	mtctl		%r1, %cr18
+	mtctl		%r1, %cr18	/* IIAOQ tail */
 	load32          REAL_MODE_PSW, %r1
 	mtctl		%r1, %cr22
 	rfi
@@ -191,12 +191,12 @@
 	nop
 	
 	rsm             PSW_SM_Q,%r0    /* disable Q bit to load iia queue */
-	mtctl		0, %cr17	/* space 0 */
-	mtctl		0, %cr17
+	mtctl		%r0, %cr17	/* Clear IIASQ tail */
+	mtctl		%r0, %cr17	/* Clear IIASQ head */
 	load32		(rfi_r2v_1), %r1
-	mtctl		%r1, %cr18
+	mtctl		%r1, %cr18	/* IIAOQ head */
 	ldo		4(%r1), %r1
-	mtctl		%r1, %cr18
+	mtctl		%r1, %cr18	/* IIAOQ tail */
 	load32		KERNEL_PSW, %r1
 	mtctl		%r1, %cr22
 	rfi
diff -Nru a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
--- a/arch/parisc/kernel/signal.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/signal.c	Thu Jan  8 23:00:24 2004
@@ -33,13 +33,22 @@
 #include <asm/pgalloc.h>
 #include <asm/cacheflush.h>
 
-#define DEBUG_SIG 0
+#ifdef CONFIG_COMPAT
+#include <linux/compat.h>
+#include "signal32.h"
+#endif
+
+#define DEBUG_SIG 0 
+#define DEBUG_SIG_LEVEL 2
 
 #if DEBUG_SIG
-#define DBG(x)	printk x
+#define DBG(LEVEL, ...) \
+        ((DEBUG_SIG_LEVEL >= LEVEL) \
+	? printk(__VA_ARGS__) : (void) 0)
 #else
-#define DBG(x)
+#define DBG(LEVEL, ...)
 #endif
+	
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
@@ -52,43 +61,6 @@
 
 int do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall);
 
-int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
-{
-	if (from->si_code < 0)
-		return __copy_to_user(to, from, sizeof(siginfo_t));
-	else {
-		int err;
-
-		/*
-		 * If you change siginfo_t structure, please be sure
-		 * this code is fixed accordingly.  It should never
-		 * copy any pad contained in the structure to avoid
-		 * security leaks, but must copy the generic 3 ints
-		 * plus the relevant union member.
-		 */
-		err = __put_user(from->si_signo, &to->si_signo);
-		err |= __put_user(from->si_errno, &to->si_errno);
-		err |= __put_user((short)from->si_code, &to->si_code);
-		switch (from->si_code >> 16) {
-		      case __SI_FAULT >> 16:
-			/* FIXME: should we put the interruption code here? */
-		      case __SI_POLL >> 16:
-			err |= __put_user(from->si_addr, &to->si_addr);
-			break;
-		      case __SI_CHLD >> 16:
-			err |= __put_user(from->si_utime, &to->si_utime);
-			err |= __put_user(from->si_stime, &to->si_stime);
-			err |= __put_user(from->si_status, &to->si_status);
-		      default:
-			err |= __put_user(from->si_uid, &to->si_uid);
-			err |= __put_user(from->si_pid, &to->si_pid);
-			break;
-		      /* case __SI_RT: This is not generated by the kernel as of now.  */
-		}
-		return err;
-	}
-}
-
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
  */
@@ -101,26 +73,27 @@
 {
 	sigset_t saveset, newset;
 #ifdef __LP64__
-	/* XXX FIXME -- assumes 32-bit user app! */
 	compat_sigset_t newset32;
 
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(compat_sigset_t))
-		return -EINVAL;
-
-	if (copy_from_user(&newset32, (compat_sigset_t *)unewset, sizeof(newset32)))
-		return -EFAULT;
-
-	newset.sig[0] = newset32.sig[0] | ((unsigned long)newset32.sig[1] << 32);
-#else
-
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(sigset_t))
-		return -EINVAL;
-
-	if (copy_from_user(&newset, unewset, sizeof(newset)))
-		return -EFAULT;
+	if(personality(current->personality) == PER_LINUX32){
+		/* XXX: Don't preclude handling different sized sigset_t's.  */
+		if (sigsetsize != sizeof(compat_sigset_t))
+			return -EINVAL;
+		if (copy_from_user(&newset32, (compat_sigset_t *)unewset, sizeof(newset32)))
+			return -EFAULT;
+		sigset_32to64(&newset,&newset32);
+		
+	} else 
 #endif
+	{
+		/* XXX: Don't preclude handling different sized sigset_t's.  */
+		if (sigsetsize != sizeof(sigset_t))
+			return -EINVAL;
+	
+		if (copy_from_user(&newset, unewset, sizeof(newset)))
+			return -EFAULT;
+	}
+
 	sigdelsetmask(&newset, ~_BLOCKABLE);
 
 	spin_lock_irq(&current->sighand->siglock);
@@ -161,7 +134,9 @@
 	err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
 	err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
 	err |= __get_user(regs->sar, &sc->sc_sar);
-	DBG(("restore_sigcontext: r28 is %ld\n", regs->gr[28]));
+	DBG(2,"restore_sigcontext: iaoq is 0x%#lx / 0x%#lx\n", 
+			regs->iaoq[0],regs->iaoq[1]);
+	DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]);
 	return err;
 }
 
@@ -174,6 +149,9 @@
 	unsigned long usp = (regs->gr[30] & ~(0x01UL));
 	unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
 #ifdef __LP64__
+	compat_sigset_t compat_set;
+	struct compat_rt_sigframe * compat_frame;
+	
 	if(personality(current->personality) == PER_LINUX32)
 		sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
 #endif
@@ -182,11 +160,23 @@
 	/* Unwind the user stack to get the rt_sigframe structure. */
 	frame = (struct rt_sigframe *)
 		(usp - sigframe_size);
-	DBG(("in sys_rt_sigreturn, frame is %p\n", frame));
-
-	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-		goto give_sigsegv;
+	DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
 
+#ifdef __LP64__
+	compat_frame = (struct compat_rt_sigframe *)frame;
+	
+	if(personality(current->personality) == PER_LINUX32){
+		DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
+		if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
+			goto give_sigsegv;
+		sigset_32to64(&set,&compat_set);
+	} else
+#endif
+	{
+		if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+			goto give_sigsegv;
+	}
+		
 	sigdelsetmask(&set, ~_BLOCKABLE);
 	spin_lock_irq(&current->sighand->siglock);
 	current->blocked = set;
@@ -194,17 +184,32 @@
 	spin_unlock_irq(&current->sighand->siglock);
 
 	/* Good thing we saved the old gr[30], eh? */
-	if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
-		goto give_sigsegv;
-
-	DBG(("usp: %#08lx stack %p", usp, &frame->uc.uc_stack));
+#ifdef __LP64__
+	if(personality(current->personality) == PER_LINUX32){
+		DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
+				&compat_frame->uc.uc_mcontext);
+// FIXME: Load upper half from register file
+		if (restore_sigcontext32(&compat_frame->uc.uc_mcontext, 
+					&compat_frame->regs, regs))
+			goto give_sigsegv;
+		DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
+				usp, &compat_frame->uc.uc_stack);
+		if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT)
+			goto give_sigsegv;
+	} else
+#endif
+	{
+		DBG(1,"sys_rt_sigreturn: frame->uc.uc_mcontext 0x%p\n",
+				&frame->uc.uc_mcontext);
+		if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
+			goto give_sigsegv;
+		DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
+				usp, &frame->uc.uc_stack);
+		if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
+			goto give_sigsegv;
+	}
+		
 
-	/* I don't know why everyone else assumes they can call this
-           with a pointer to a stack_t on the kernel stack.  That
-           makes no sense.  Anyway we'll do it like m68k, since we
-           also are using segmentation in the same way as them. */
-	if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
-		goto give_sigsegv;
 
 	/* If we are on the syscall path IAOQ will not be restored, and
 	 * if we are on the interrupt path we must not corrupt gr31.
@@ -212,14 +217,13 @@
 	if (in_syscall)
 		regs->gr[31] = regs->iaoq[0];
 #if DEBUG_SIG
-	DBG(("returning to %#lx\n", regs->iaoq[0]));
-	DBG(("in sys_rt_sigreturn:\n"));
+	DBG(1,"sys_rt_sigreturn: returning to %#lx, DUMPING REGS:\n", regs->iaoq[0]);
 	show_regs(regs);
 #endif
 	return;
 
 give_sigsegv:
-	DBG(("sys_rt_sigreturn sending SIGSEGV\n"));
+	DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
 	si.si_signo = SIGSEGV;
 	si.si_errno = 0;
 	si.si_code = SI_KERNEL;
@@ -237,9 +241,16 @@
 static inline void *
 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
 {
+	/*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
+	  don't use the parameter it doesn't matter */
+
+	DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
+			(unsigned long)ka, sp, frame_size);
+	
 	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp))
 		sp = current->sas_ss_sp; /* Stacks grow up! */
 
+	DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
 	return (void *) sp; /* Stacks grow up.  Fun. */
 }
 
@@ -259,20 +270,20 @@
 		err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
 		err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
 		err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
-		DBG(("setup_sigcontext: iaoq %#lx/%#lx\n",
-			regs->gr[31], regs->gr[31]));
+		DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (in syscall)\n",
+			regs->gr[31], regs->gr[31]+4);
 	} else {
 		err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
 		err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
-		DBG(("setup_sigcontext: iaoq %#lx/%#lx\n", 
-			regs->iaoq[0], regs->iaoq[1]));
+		DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (not in syscall)\n", 
+			regs->iaoq[0], regs->iaoq[1]);
 	}
 
 	err |= __put_user(flags, &sc->sc_flags);
 	err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
 	err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
 	err |= __put_user(regs->sar, &sc->sc_sar);
-	DBG(("setup_sigcontext: r28 is %ld\n", regs->gr[28]));
+	DBG(1,"setup_sigcontext: r28 is %ld\n", regs->gr[28]);
 
 	return err;
 }
@@ -286,46 +297,85 @@
 	unsigned long haddr, sigframe_size;
 	struct siginfo si;
 	int err = 0;
-
+#ifdef __LP64__
+	compat_int_t compat_val;
+	struct compat_rt_sigframe * compat_frame;
+	compat_sigset_t compat_set;
+#endif
+	
 	usp = (regs->gr[30] & ~(0x01UL));
+	/*FIXME: frame_size parameter is unused, remove it. */
 	frame = get_sigframe(ka, usp, sizeof(*frame));
 
-	DBG(("setup_rt_frame 1: frame %p info %p\n", frame, info));
+	DBG(1,"SETUP_RT_FRAME: START\n");
+	DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info);
 
-	err |= __copy_to_user(&frame->info, info, sizeof(siginfo_t));
-	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-	err |= __put_user(sas_ss_flags(regs->gr[30]),
-			  &frame->uc.uc_stack.ss_flags);
-	err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
-	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+	
+#ifdef __LP64__
+
+	compat_frame = (struct compat_rt_sigframe *)frame;
+	
+	if(personality(current->personality) == PER_LINUX32) {
+		DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
+		err |= compat_copy_siginfo_to_user(&compat_frame->info, info);
+		DBG(1,"SETUP_RT_FRAME: 1\n");
+		compat_val = (compat_int_t)current->sas_ss_sp;
+		err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
+		DBG(1,"SETUP_RT_FRAME: 2\n");
+		compat_val = (compat_int_t)current->sas_ss_size;
+		err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
+		DBG(1,"SETUP_RT_FRAME: 3\n");
+		compat_val = sas_ss_flags(regs->gr[30]);		
+		err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);		
+		DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
+		DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
+		err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 
+					&compat_frame->regs, regs, in_syscall);
+		sigset_64to32(&compat_set,set);
+		err |= __copy_to_user(&compat_frame->uc.uc_sigmask, &compat_set, sizeof(compat_set));
+	} else
+#endif
+	{	
+		DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
+		err |= copy_siginfo_to_user(&frame->info, info);
+		err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
+		err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+		err |= __put_user(sas_ss_flags(regs->gr[30]),
+				  &frame->uc.uc_stack.ss_flags);
+		DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
+		DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
+		err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
+		/* FIXME: Should probably be converted aswell for the compat case */
+		err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+	}
+	
 	if (err)
 		goto give_sigsegv;
 
 	/* Set up to return from userspace.  If provided, use a stub
 	   already in userspace.  */
 	err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
-			&frame->tramp[0]);
-	err |= __put_user(INSN_LDI_R20, &frame->tramp[1]);
-	err |= __put_user(INSN_BLE_SR2_R0, &frame->tramp[2]);
-	err |= __put_user(INSN_NOP, &frame->tramp[3]);
+			&frame->tramp[SIGRETURN_TRAMP+0]);
+	err |= __put_user(INSN_LDI_R20, &frame->tramp[SIGRETURN_TRAMP+1]);
+	err |= __put_user(INSN_BLE_SR2_R0, &frame->tramp[SIGRETURN_TRAMP+2]);
+	err |= __put_user(INSN_NOP, &frame->tramp[SIGRETURN_TRAMP+3]);
 
 #if DEBUG_SIG
 	/* Assert that we're flushing in the correct space... */
 	{
 		int sid;
 		asm ("mfsp %%sr3,%0" : "=r" (sid));
-		DBG(("flushing 64 bytes at space %#x offset %p\n",
-		       sid, frame->tramp));
+		DBG(1,"setup_rt_frame: Flushing 64 bytes at space %#x offset %p\n",
+		       sid, frame->tramp);
 	}
 #endif
 
-	flush_user_dcache_range((unsigned long) &frame->tramp[0],
-			   (unsigned long) &frame->tramp[4]);
-	flush_user_icache_range((unsigned long) &frame->tramp[0],
-			   (unsigned long) &frame->tramp[4]);
+	flush_user_dcache_range((unsigned long) &frame->tramp[SIGRETURN_TRAMP],
+			   (unsigned long) &frame->tramp[TRAMP_SIZE]);
+	flush_user_icache_range((unsigned long) &frame->tramp[SIGRETURN_TRAMP],
+			   (unsigned long) &frame->tramp[TRAMP_SIZE]);
 
-	rp = (unsigned long) frame->tramp;
+	rp = (unsigned long) &frame->tramp[SIGRETURN_TRAMP];
 
 	if (err)
 		goto give_sigsegv;
@@ -359,8 +409,8 @@
 		
 		haddr = fdesc.addr;
 		regs->gr[19] = fdesc.gp;
-		DBG(("64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
-		     haddr, regs->gr[19], in_syscall));
+		DBG(1,"setup_rt_frame: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
+		     haddr, regs->gr[19], in_syscall);
 	}
 #endif
 
@@ -391,24 +441,33 @@
 
 	regs->gr[2]  = rp;                /* userland return pointer */
 	regs->gr[26] = sig;               /* signal number */
-	regs->gr[25] = A(&frame->info); /* siginfo pointer */
-	regs->gr[24] = A(&frame->uc);   /* ucontext pointer */
 	
-	DBG(("making sigreturn frame: %#lx + %#x = %#lx\n",
+#ifdef __LP64__
+	if(personality(current->personality) == PER_LINUX32){
+		regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
+		regs->gr[24] = A(&compat_frame->uc);   /* ucontext pointer */
+	} else
+#endif
+	{		
+		regs->gr[25] = A(&frame->info); /* siginfo pointer */
+		regs->gr[24] = A(&frame->uc);   /* ucontext pointer */
+	}
+	
+	DBG(1,"setup_rt_frame: making sigreturn frame: %#lx + %#lx = %#lx\n",
 	       regs->gr[30], sigframe_size,
-	       regs->gr[30] + sigframe_size));
+	       regs->gr[30] + sigframe_size);
 	/* Raise the user stack pointer to make a proper call frame. */
 	regs->gr[30] = (A(frame) + sigframe_size);
 
 
-	DBG(("SIG deliver (%s:%d): frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
+	DBG(1,"setup_rt_frame: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
 	       current->comm, current->pid, frame, regs->gr[30],
-	       regs->iaoq[0], regs->iaoq[1], rp));
+	       regs->iaoq[0], regs->iaoq[1], rp);
 
 	return 1;
 
 give_sigsegv:
-	DBG(("setup_rt_frame sending SIGSEGV\n"));
+	DBG(1,"setup_rt_frame: sending SIGSEGV\n");
 	if (sig == SIGSEGV)
 		ka->sa.sa_handler = SIG_DFL;
 	si.si_signo = SIGSEGV;
@@ -431,8 +490,8 @@
 {
 	struct k_sigaction *ka = &current->sighand->action[sig-1];
 
-	DBG(("handle_signal(sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p)\n",
-	       sig, ka, info, oldset, regs));
+	DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
+	       sig, ka, info, oldset, regs);
 	
 	/* Set up the stack frame */
 	if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
@@ -470,8 +529,8 @@
 	struct k_sigaction *ka;
 	int signr;
 
-	DBG(("do_signal(oldset=0x%p, regs=0x%p, sr7 %#lx, pending %d, in_syscall=%d\n",
-	       oldset, regs, regs->sr[7], current->sigpending, in_syscall));
+	DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n",
+	       oldset, regs, regs->sr[7], in_syscall);
 
 	/* Everyone else checks to see if they are in kernel mode at
 	   this point and exits if that's the case.  I'm not sure why
@@ -481,11 +540,13 @@
 	if (!oldset)
 		oldset = &current->blocked;
 
-	DBG(("do_signal: oldset %08lx:%08lx\n", 
-		oldset->sig[0], oldset->sig[1]));
+	DBG(1,"do_signal: oldset %08lx / %08lx\n", 
+		oldset->sig[0], oldset->sig[1]);
 
 
 	signr = get_signal_to_deliver(&info, regs, NULL);
+	DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); 
+	
 	if (signr > 0) {
 		/* Restart a system call if necessary. */
 		if (in_syscall) {
@@ -494,14 +555,14 @@
 		        case -ERESTART_RESTARTBLOCK:
 				current_thread_info()->restart_block.fn = do_no_restart_syscall;
 			case -ERESTARTNOHAND:
-				DBG(("ERESTARTNOHAND: returning -EINTR\n"));
+				DBG(1,"ERESTARTNOHAND: returning -EINTR\n");
 				regs->gr[28] = -EINTR;
 				break;
 
 			case -ERESTARTSYS:
 				ka = &current->sighand->action[signr-1];
 				if (!(ka->sa.sa_flags & SA_RESTART)) {
-					DBG(("ERESTARTSYS: putting -EINTR\n"));
+					DBG(1,"ERESTARTSYS: putting -EINTR\n");
 					regs->gr[28] = -EINTR;
 					break;
 				}
@@ -520,9 +581,8 @@
 		   delivery failed, we need to continue to iterate in
 		   this loop so we can deliver the SIGSEGV... */
 		if (handle_signal(signr, &info, oldset, regs, in_syscall)) {
-			DBG((KERN_DEBUG
-				"Exiting do_signal (success), regs->gr[28] = %ld\n",
-				regs->gr[28]));
+			DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
+				regs->gr[28]);
 			return 1;
 		}
 	}
@@ -530,10 +590,42 @@
 	/* Did we come from a system call? */
 	if (in_syscall) {
 		/* Restart the system call - no handlers present */
-		if (regs->gr[28] == -ERESTART_RESTARTBLOCK ||
-		    regs->gr[28] == -ERESTARTNOHAND ||
-		    regs->gr[28] == -ERESTARTSYS ||
-		    regs->gr[28] == -ERESTARTNOINTR) {
+		if (regs->gr[28] == -ERESTART_RESTARTBLOCK) {
+			unsigned int *usp = (unsigned int *)regs->gr[30];
+
+			/* Setup a trampoline to restart the syscall
+			 * with __NR_restart_syscall
+			 *
+			 *  0: <return address (orig r31)>
+			 *  4: <2nd half for 64-bit>
+			 *  8: ldw 0(%sp), %r31
+			 * 12: be 0x100(%sr2, %r0)
+			 * 16: ldi __NR_restart_syscall, %r20
+			 */
+#ifndef __LP64__
+			put_user(regs->gr[31], &usp[0]);
+			put_user(0x0fc0109f, &usp[2]);
+#else
+			put_user(regs->gr[31] >> 32, &usp[0]);
+			put_user(regs->gr[31] & 0xffffffff, &usp[1]);
+			put_user(0x0fc010df, &usp[2]);
+#endif
+			put_user(0xe0008200, &usp[3]);
+			put_user(0x34140000, &usp[4]);
+
+			/* Stack is 64-byte aligned, and we only 
+			 * need to flush 1 cache line */
+			asm("fdc 0(%%sr3, %0)\n"
+			    "fic 0(%%sr3, %0)\n"
+			    "sync\n"
+			    : : "r"(regs->gr[30]));
+
+			regs->gr[31] = regs->gr[30] + 8;
+			/* Preserve original r28. */
+			regs->gr[28] = regs->orig_r28;
+		} else if (regs->gr[28] == -ERESTARTNOHAND ||
+		           regs->gr[28] == -ERESTARTSYS ||
+		           regs->gr[28] == -ERESTARTNOINTR) {
 			/* Hooray for delayed branching.  We don't
                            have to restore %r20 (the system call
                            number) because it gets loaded in the delay
@@ -544,8 +636,8 @@
 		}
 	}
 	
-	DBG(("Exiting do_signal (not delivered), regs->gr[28] = %ld\n", 
-		regs->gr[28]));
+	DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", 
+		regs->gr[28]);
 
 	return 0;
 }
diff -Nru a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c
--- a/arch/parisc/kernel/signal32.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/signal32.c	Thu Jan  8 23:00:23 2004
@@ -10,20 +10,32 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 
+#include <asm/compat_signal.h>
 #include <asm/uaccess.h>
+
+#include "signal32.h"
 #include "sys32.h"
 
-struct k_sigaction32 {
-	struct sigaction32 sa;
-};
+#define DEBUG_COMPAT_SIG 0 
+#define DEBUG_COMPAT_SIG_LEVEL 2
+
+#if DEBUG_COMPAT_SIG
+#define DBG(LEVEL, ...) \
+	((DEBUG_COMPAT_SIG_LEVEL >= LEVEL) \
+	? printk(__VA_ARGS__) : (void) 0)
+#else
+#define DBG(LEVEL, ...)
+#endif
 
-static inline void
+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+
+inline void
 sigset_32to64(sigset_t *s64, compat_sigset_t *s32)
 {
 	s64->sig[0] = s32->sig[0] | ((unsigned long)s32->sig[1] << 32);
 }
 
-static inline void
+inline void
 sigset_64to32(compat_sigset_t *s32, sigset_t *s64)
 {
 	s32->sig[0] = s64->sig[0] & 0xffffffffUL;
@@ -120,16 +132,10 @@
 	return ret;
 }
 
-typedef struct {
-	unsigned int ss_sp;
-	int ss_flags;
-	compat_size_t ss_size;
-} stack_t32;
-
 int 
-do_sigaltstack32 (const stack_t32 *uss32, stack_t32 *uoss32, unsigned long sp)
+do_sigaltstack32 (const compat_stack_t *uss32, compat_stack_t *uoss32, unsigned long sp)
 {
-	stack_t32 ss32, oss32;
+	compat_stack_t ss32, oss32;
 	stack_t ss, oss;
 	stack_t *ssp = NULL, *ossp = NULL;
 	int ret;
@@ -159,4 +165,219 @@
 	}
 
 	return ret;
+}
+
+long
+restore_sigcontext32(struct compat_sigcontext *sc, struct compat_regfile * rf,
+		struct pt_regs *regs)
+{
+	long err = 0;
+	compat_uint_t compat_reg;
+	compat_uint_t compat_regt;
+	int regn;
+	
+	/* When loading 32-bit values into 64-bit registers make
+	   sure to clear the upper 32-bits */
+	DBG(2,"restore_sigcontext32: PER_LINUX32 process\n");
+	DBG(2,"restore_sigcontext32: sc = 0x%p, rf = 0x%p, regs = 0x%p\n", sc, rf, regs);
+	DBG(2,"restore_sigcontext32: compat_sigcontext is %#lx bytes\n", sizeof(*sc));
+	for(regn=0; regn < 32; regn++){
+		err |= __get_user(compat_reg,&sc->sc_gr[regn]);
+		regs->gr[regn] = compat_reg;
+		/* Load upper half */
+		err |= __get_user(compat_regt,&rf->rf_gr[regn]);
+		regs->gr[regn] = ((u64)compat_regt << 32) | (u64)compat_reg;
+		DBG(3,"restore_sigcontext32: gr%02d = %#lx (%#x / %#x)\n", 
+				regn, regs->gr[regn], compat_regt, compat_reg);
+	}
+	DBG(2,"restore_sigcontext32: sc->sc_fr = 0x%p (%#lx)\n",sc->sc_fr, sizeof(sc->sc_fr));
+	/* XXX: BE WARNED FR's are 64-BIT! */
+	err |= __copy_from_user(regs->fr, sc->sc_fr, sizeof(regs->fr));
+		
+	/* Better safe than sorry, pass __get_user two things of
+	   the same size and let gcc do the upward conversion to 
+	   64-bits */		
+	err |= __get_user(compat_reg, &sc->sc_iaoq[0]);
+	/* Load upper half */
+	err |= __get_user(compat_regt, &rf->rf_iaoq[0]);
+	regs->iaoq[0] = ((u64)compat_regt << 32) | (u64)compat_reg;
+	DBG(2,"restore_sigcontext32: upper half of iaoq[0] = %#lx\n", compat_regt);
+	DBG(2,"restore_sigcontext32: sc->sc_iaoq[0] = %p => %#x\n", 
+			&sc->sc_iaoq[0], compat_reg);
+
+	err |= __get_user(compat_reg, &sc->sc_iaoq[1]);
+	/* Load upper half */
+	err |= __get_user(compat_regt, &rf->rf_iaoq[1]);
+	regs->iaoq[1] = ((u64)compat_regt << 32) | (u64)compat_reg;
+	DBG(2,"restore_sigcontext32: upper half of iaoq[1] = %#lx\n", compat_regt);
+	DBG(2,"restore_sigcontext32: sc->sc_iaoq[1] = %p => %#x\n", 
+			&sc->sc_iaoq[1],compat_reg);	
+	DBG(2,"restore_sigcontext32: iaoq is %#lx / %#lx\n", 
+			regs->iaoq[0],regs->iaoq[1]);		
+		
+	err |= __get_user(compat_reg, &sc->sc_iasq[0]);
+	/* Load the upper half for iasq */
+	err |= __get_user(compat_regt, &rf->rf_iasq[0]);
+	regs->iasq[0] = ((u64)compat_regt << 32) | (u64)compat_reg;
+	DBG(2,"restore_sigcontext32: upper half of iasq[0] = %#lx\n", compat_regt);
+	
+	err |= __get_user(compat_reg, &sc->sc_iasq[1]);
+	/* Load the upper half for iasq */
+	err |= __get_user(compat_regt, &rf->rf_iasq[1]);
+	regs->iasq[1] = ((u64)compat_regt << 32) | (u64)compat_reg;
+	DBG(2,"restore_sigcontext32: upper half of iasq[1] = %#lx\n", compat_regt);
+	DBG(2,"restore_sigcontext32: iasq is %#lx / %#lx\n", 
+		regs->iasq[0],regs->iasq[1]);		
+
+	err |= __get_user(compat_reg, &sc->sc_sar);
+	/* Load the upper half for sar */
+	err |= __get_user(compat_regt, &rf->rf_sar);
+	regs->sar = ((u64)compat_regt << 32) | (u64)compat_reg;	
+	DBG(2,"restore_sigcontext32: upper_half & sar = %#lx\n", compat_regt);	
+	DBG(2,"restore_sigcontext32: sar is %#lx\n", regs->sar);		
+	DBG(2,"restore_sigcontext32: r28 is %ld\n", regs->gr[28]);
+	
+	return err;
+}
+
+/*
+ * Set up the sigcontext structure for this process.
+ * This is not an easy task if the kernel is 64-bit, it will require
+ * that we examine the process personality to determine if we need to
+ * truncate for a 32-bit userspace.
+ */
+long
+setup_sigcontext32(struct compat_sigcontext *sc, struct compat_regfile * rf, 
+		struct pt_regs *regs, int in_syscall)		 
+{
+	compat_int_t flags = 0;
+	long err = 0;
+	compat_uint_t compat_reg;
+	compat_uint_t compat_regb;
+	int regn;
+	
+	if (on_sig_stack((unsigned long) sc))
+		flags |= PARISC_SC_FLAG_ONSTACK;
+	
+	if (in_syscall) {
+		
+		DBG(1,"setup_sigcontext32: in_syscall\n");
+		
+		flags |= PARISC_SC_FLAG_IN_SYSCALL;
+		/* Truncate gr31 */
+		compat_reg = (compat_uint_t)(regs->gr[31]);
+		/* regs->iaoq is undefined in the syscall return path */
+		err |= __put_user(compat_reg, &sc->sc_iaoq[0]);
+		DBG(2,"setup_sigcontext32: sc->sc_iaoq[0] = %p <= %#x\n",
+				&sc->sc_iaoq[0], compat_reg);
+		
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->gr[32] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iaoq[0]);
+		DBG(2,"setup_sigcontext32: upper half iaoq[0] = %#x\n", compat_reg);
+		
+		
+		compat_reg = (compat_uint_t)(regs->gr[31]+4);
+		err |= __put_user(compat_reg, &sc->sc_iaoq[1]);
+		DBG(2,"setup_sigcontext32: sc->sc_iaoq[1] = %p <= %#x\n",
+				&sc->sc_iaoq[1], compat_reg);
+		/* Store upper half */
+		compat_reg = (compat_uint_t)((regs->gr[32]+4) >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iaoq[1]);
+		DBG(2,"setup_sigcontext32: upper half iaoq[1] = %#x\n", compat_reg);
+		
+		/* Truncate sr3 */
+		compat_reg = (compat_uint_t)(regs->sr[3]);
+		err |= __put_user(compat_reg, &sc->sc_iasq[0]);
+		err |= __put_user(compat_reg, &sc->sc_iasq[1]);		
+		
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->sr[3] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iasq[0]);
+		err |= __put_user(compat_reg, &rf->rf_iasq[1]);		
+		
+		DBG(2,"setup_sigcontext32: upper half iasq[0] = %#x\n", compat_reg);
+		DBG(2,"setup_sigcontext32: upper half iasq[1] = %#x\n", compat_reg);		
+		DBG(1,"setup_sigcontext32: iaoq %#lx / %#lx\n",				
+			regs->gr[31], regs->gr[31]+4);
+		
+	} else {
+		
+		compat_reg = (compat_uint_t)(regs->iaoq[0]);
+		err |= __put_user(compat_reg, &sc->sc_iaoq[0]);
+		DBG(2,"setup_sigcontext32: sc->sc_iaoq[0] = %p <= %#x\n",
+				&sc->sc_iaoq[0], compat_reg);
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->iaoq[0] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iaoq[0]);	
+		DBG(2,"setup_sigcontext32: upper half iaoq[0] = %#x\n", compat_reg);
+		
+		compat_reg = (compat_uint_t)(regs->iaoq[1]);
+		err |= __put_user(compat_reg, &sc->sc_iaoq[1]);
+		DBG(2,"setup_sigcontext32: sc->sc_iaoq[1] = %p <= %#x\n",
+				&sc->sc_iaoq[1], compat_reg);
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->iaoq[1] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iaoq[1]);
+		DBG(2,"setup_sigcontext32: upper half iaoq[1] = %#x\n", compat_reg);
+		
+		
+		compat_reg = (compat_uint_t)(regs->iasq[0]);
+		err |= __put_user(compat_reg, &sc->sc_iasq[0]);
+		DBG(2,"setup_sigcontext32: sc->sc_iasq[0] = %p <= %#x\n",
+				&sc->sc_iasq[0], compat_reg);
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->iasq[0] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iasq[0]);
+		DBG(2,"setup_sigcontext32: upper half iasq[0] = %#x\n", compat_reg);
+		
+		
+		compat_reg = (compat_uint_t)(regs->iasq[1]);
+		err |= __put_user(compat_reg, &sc->sc_iasq[1]);
+		DBG(2,"setup_sigcontext32: sc->sc_iasq[1] = %p <= %#x\n",
+				&sc->sc_iasq[1], compat_reg);
+		/* Store upper half */
+		compat_reg = (compat_uint_t)(regs->iasq[1] >> 32);
+		err |= __put_user(compat_reg, &rf->rf_iasq[1]);
+		DBG(2,"setup_sigcontext32: upper half iasq[1] = %#x\n", compat_reg);
+
+		/* Print out the IAOQ for debugging */		
+		DBG(1,"setup_sigcontext32: ia0q %#lx / %#lx\n", 
+			regs->iaoq[0], regs->iaoq[1]);
+	}
+
+	err |= __put_user(flags, &sc->sc_flags);
+	
+	DBG(1,"setup_sigcontext32: Truncating general registers.\n");
+	
+	for(regn=0; regn < 32; regn++){
+		/* Truncate a general register */
+		compat_reg = (compat_uint_t)(regs->gr[regn]);
+		err |= __put_user(compat_reg, &sc->sc_gr[regn]);
+		/* Store upper half */
+		compat_regb = (compat_uint_t)(regs->gr[regn] >> 32);
+		err |= __put_user(compat_regb, &rf->rf_gr[regn]);
+
+		/* DEBUG: Write out the "upper / lower" register data */
+		DBG(2,"setup_sigcontext32: gr%02d = %#x / %#x\n", regn, 
+				compat_regb, compat_reg);
+	}
+	
+	/* Copy the floating point registers (same size)
+	   XXX: BE WARNED FR's are 64-BIT! */	
+	DBG(1,"setup_sigcontext32: Copying from regs to sc, "
+	      "sc->sc_fr size = %#lx, regs->fr size = %#lx\n",
+		sizeof(regs->fr), sizeof(sc->sc_fr));
+	err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
+
+	compat_reg = (compat_uint_t)(regs->sar);
+	err |= __put_user(compat_reg, &sc->sc_sar);
+	DBG(2,"setup_sigcontext32: sar is %#x\n", compat_reg);
+	/* Store upper half */
+	compat_reg = (compat_uint_t)(regs->sar >> 32);
+	err |= __put_user(compat_reg, &rf->rf_sar);	
+	DBG(2,"setup_sigcontext32: upper half sar = %#x\n", compat_reg);
+	DBG(1,"setup_sigcontext32: r28 is %ld\n", regs->gr[28]);
+
+	return err;
 }
diff -Nru a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/parisc/kernel/signal32.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,25 @@
+#ifndef _PARISC64_KERNEL_SIGNAL32_H
+#define _PARISC64_KERNEL_SIGNAL32_H
+
+#include <linux/compat.h>
+#include <asm/compat_signal.h>
+#include <asm/compat_rt_sigframe.h>
+
+/* ELF32 signal handling */
+
+struct k_sigaction32 {
+	struct compat_sigaction sa;
+};
+
+void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
+void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
+int do_sigaltstack32 (const compat_stack_t *uss32, 
+		compat_stack_t *uoss32, unsigned long sp);
+long restore_sigcontext32(struct compat_sigcontext *sc, 
+		struct compat_regfile *rf,
+		struct pt_regs *regs);
+long setup_sigcontext32(struct compat_sigcontext *sc, 
+		struct compat_regfile *rf,
+		struct pt_regs *regs, int in_syscall);
+
+#endif
diff -Nru a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c
--- a/arch/parisc/kernel/smp.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/smp.c	Thu Jan  8 23:00:24 2004
@@ -257,7 +257,7 @@
 				printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n",
 					this_cpu, which);
 				ops &= ~(1 << which);
-				return;
+				return IRQ_NONE;
 			} /* Switch */
 		} /* while (ops) */
 	}
@@ -326,7 +326,7 @@
 smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
 {
 	struct smp_call_struct data;
-	long timeout;
+	unsigned long timeout;
 	static spinlock_t lock = SPIN_LOCK_UNLOCKED;
 	
 	data.func = func;
@@ -375,6 +375,8 @@
 
 	return 0;
 }
+
+EXPORT_SYMBOL(smp_call_function);
 
 
 
diff -Nru a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c
--- a/arch/parisc/kernel/sys_parisc.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/sys_parisc.c	Thu Jan  8 23:00:24 2004
@@ -241,108 +241,6 @@
 }
 
 /*
- * FIXME, please remove this crap as soon as possible
- *
- * This is here to fix up broken glibc structures, 
- * which are already fixed in newer glibcs
- */
-#include <linux/msg.h>
-#include <linux/sem.h>
-#include <linux/shm.h>
-#include "sys32.h"
-
-struct broken_ipc_perm
-{
-    key_t key;			/* Key.  */
-    uid_t uid;			/* Owner's user ID.  */
-    gid_t gid;			/* Owner's group ID.  */
-    uid_t cuid;			/* Creator's user ID.  */
-    gid_t cgid;			/* Creator's group ID.  */
-    unsigned short int mode;		/* Read/write permission.  */
-    unsigned short int __pad1;
-    unsigned short int seq;		/* Sequence number.  */
-    unsigned short int __pad2;
-    unsigned long int __unused1;
-    unsigned long int __unused2;
-};
-		    
-struct broken_shmid64_ds {
-	struct broken_ipc_perm	shm_perm;	/* operation perms */
-	size_t			shm_segsz;	/* size of segment (bytes) */
-#ifndef __LP64__
-	unsigned int		__pad1;
-#endif
-	__kernel_time_t		shm_atime;	/* last attach time */
-#ifndef __LP64__
-	unsigned int		__pad2;
-#endif
-	__kernel_time_t		shm_dtime;	/* last detach time */
-#ifndef __LP64__
-	unsigned int		__pad3;
-#endif
-	__kernel_time_t		shm_ctime;	/* last change time */
-	__kernel_pid_t		shm_cpid;	/* pid of creator */
-	__kernel_pid_t		shm_lpid;	/* pid of last operator */
-	unsigned int		shm_nattch;	/* no. of current attaches */
-	unsigned int		__unused1;
-	unsigned int		__unused2;
-};
-
-static void convert_broken_perm (struct broken_ipc_perm *out, struct ipc64_perm *in)
-{
-	out->key  = in->key;
-	out->uid  = in->uid;
-	out->gid  = in->gid;
-	out->cuid = in->cuid;
-	out->cgid = in->cgid;
-	out->mode = in->mode;
-	out->seq  = in->seq;
-}
-
-static int copyout_broken_shmid64(struct broken_shmid64_ds *buf, struct shmid64_ds *sbuf)
-{
-	struct broken_shmid64_ds tbuf;
-	
-	memset(&tbuf, 0, sizeof tbuf);
-	convert_broken_perm (&tbuf.shm_perm, &sbuf->shm_perm);
-	tbuf.shm_segsz = sbuf->shm_segsz;
-	tbuf.shm_atime = sbuf->shm_atime;
-	tbuf.shm_dtime = sbuf->shm_dtime;
-	tbuf.shm_ctime = sbuf->shm_ctime;
-	tbuf.shm_cpid = sbuf->shm_cpid;
-	tbuf.shm_lpid = sbuf->shm_lpid;
-	tbuf.shm_nattch = sbuf->shm_nattch;
-	return copy_to_user(buf, &tbuf, sizeof tbuf) ? -EFAULT : 0;
-}
-
-int sys_msgctl_broken(int msqid, int cmd, struct msqid_ds *buf)
-{
-	return sys_msgctl (msqid, cmd & ~IPC_64, buf);
-}
-
-int sys_semctl_broken(int semid, int semnum, int cmd, union semun arg)
-{
-	return sys_semctl (semid, semnum, cmd & ~IPC_64, arg);
-}
-
-int sys_shmctl_broken(int shmid, int cmd, struct shmid64_ds *buf)
-{
-	struct shmid64_ds sbuf;
-	int err;
-
-	if (cmd & IPC_64) {
-		cmd &= ~IPC_64;
-		if (cmd == IPC_STAT || cmd == SHM_STAT) {
-			KERNEL_SYSCALL(err, sys_shmctl, shmid, cmd, (struct shmid_ds *)&sbuf);
-			if (err == 0)
-				err = copyout_broken_shmid64((struct broken_shmid64_ds *)buf, &sbuf);
-			return err;
-		}
-	}
-	return sys_shmctl (shmid, cmd, (struct shmid_ds *)buf);
-}
-
-/*
  * This changes the io permissions bitmap in the current task.
  */
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on)
diff -Nru a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
--- a/arch/parisc/kernel/sys_parisc32.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/sys_parisc32.c	Thu Jan  8 23:00:23 2004
@@ -1352,12 +1352,10 @@
 	return sys_lseek(fd, offset, origin);
 }
 
-asmlinkage long sys32_semctl_broken(int semid, int semnum, int cmd, union semun arg)
+asmlinkage long sys32_semctl(int semid, int semnum, int cmd, union semun arg)
 {
         union semun u;
 	
-	cmd &= ~IPC_64; /* should be removed together with the _broken suffix */
-
         if (cmd == SETVAL) {
                 /* Ugh.  arg is a union of int,ptr,ptr,ptr, so is 8 bytes.
                  * The int should be in the first 4, but our argument
diff -Nru a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S
--- a/arch/parisc/kernel/syscall_table.S	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/syscall_table.S	Thu Jan  8 23:00:23 2004
@@ -28,7 +28,7 @@
 #define ENTRY_COMP(_name_) .word sys_##_name_
 #endif
 
-	ENTRY_SAME(ni_syscall)	/* 0  -  old "setup()" system call*/
+	ENTRY_SAME(restart_syscall)	/* 0 */
 	ENTRY_SAME(exit)
 	ENTRY_SAME(fork_wrapper)
 	ENTRY_SAME(read)
@@ -260,15 +260,15 @@
 	ENTRY_COMP(recvmsg)
 	ENTRY_SAME(semop)		/* 185 */
 	ENTRY_SAME(semget)
-	ENTRY_DIFF(semctl_broken)
+	ENTRY_DIFF(semctl)
 	ENTRY_DIFF(msgsnd)
 	ENTRY_DIFF(msgrcv)
 	ENTRY_SAME(msgget)		/* 190 */
-	ENTRY_SAME(msgctl_broken)
+	ENTRY_SAME(msgctl)
 	ENTRY_SAME(shmat_wrapper)
 	ENTRY_SAME(shmdt)
 	ENTRY_SAME(shmget)
-	ENTRY_SAME(shmctl_broken)	/* 195 */
+	ENTRY_SAME(shmctl)		/* 195 */
 	ENTRY_SAME(ni_syscall)		/* streams1 */
 	ENTRY_SAME(ni_syscall)		/* streams2 */
 	ENTRY_SAME(lstat64)
diff -Nru a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c
--- a/arch/parisc/kernel/time.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/time.c	Thu Jan  8 23:00:23 2004
@@ -232,7 +232,6 @@
 	write_sequnlock_irq(&xtime_lock);
 	return 0;
 }
-
 EXPORT_SYMBOL(do_settimeofday);
 
 /*
diff -Nru a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
--- a/arch/parisc/kernel/traps.c	Thu Jan  8 23:00:24 2004
+++ b/arch/parisc/kernel/traps.c	Thu Jan  8 23:00:24 2004
@@ -430,9 +430,19 @@
 	if (!console_drivers)
 		pdc_console_restart();
 
-	if (code == 1)
-	    transfer_pim_to_trap_frame(regs);
+	/* Not all paths will gutter the processor... */
+	switch(code){
+
+	case 1:
+		transfer_pim_to_trap_frame(regs);
+		break;
+
+	default:
+		/* Fall through */
+		break;
 
+	}
+	    
 	show_stack(NULL, (unsigned long *)regs->gr[30]);
 
 	printk("\n");
@@ -447,6 +457,7 @@
 	 * system will shut down immediately right here. */
 	pdc_soft_power_button(0);
 	
+	/* Gutter the processor! */
 	for(;;)
 	    ;
 }
@@ -557,20 +568,45 @@
 		si.si_addr = (void *) regs->iaoq[0];
 		force_sig_info(SIGFPE, &si, current);
 		return;
-
+		
+	case 13:
+		/* Conditional Trap
+		   The condition succees in an instruction which traps 
+		   on condition  */
+		if(user_mode(regs)){
+			si.si_signo = SIGFPE;
+			/* Set to zero, and let the userspace app figure it out from
+		   	   the insn pointed to by si_addr */
+			si.si_code = 0;
+			si.si_addr = (void *) regs->iaoq[0];
+			force_sig_info(SIGFPE, &si, current);
+			return;
+		} else 
+			/* The kernel doesn't want to handle condition codes */
+			break;
+		
 	case 14:
 		/* Assist Exception Trap, i.e. floating point exception. */
 		die_if_kernel("Floating point exception", regs, 0); /* quiet */
 		handle_fpe(regs);
 		return;
-
+		
+	case 15:
+		/* Data TLB miss fault/Data page fault */
+		/* Fall through */
+	case 16:
+		/* Non-access instruction TLB miss fault */
+		/* The instruction TLB entry needed for the target address of the FIC
+		   is absent, and hardware can't find it, so we get to cleanup */
+		/* Fall through */
 	case 17:
 		/* Non-access data TLB miss fault/Non-access data page fault */
 		/* TODO: Still need to add slow path emulation code here */
-		pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
-		
+		/* TODO: Understand what is meant by the TODO listed
+		         above this one. (Carlos) */
 		fault_address = regs->ior;
-		parisc_terminate("Non access data tlb fault!",regs,code,fault_address);
+		fault_space = regs->isr;
+		break;
 
 	case 18:
 		/* PCXS only -- later cpu's split this into types 26,27 & 28 */
@@ -580,9 +616,8 @@
 			return;
 		}
 		/* Fall Through */
-
-	case 15: /* Data TLB miss fault/Data page fault */
-	case 26: /* PCXL: Data memory access rights trap */
+	case 26: 
+		/* PCXL: Data memory access rights trap */
 		fault_address = regs->ior;
 		fault_space   = regs->isr;
 		break;
@@ -638,7 +673,6 @@
 			up_read(&current->mm->mmap_sem);
 		}
 		/* Fall Through */
-
 	case 27: 
 		/* Data memory protection ID trap */
 		die_if_kernel("Protection id trap", regs, code);
diff -Nru a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c
--- a/arch/parisc/kernel/unaligned.c	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/kernel/unaligned.c	Thu Jan  8 23:00:23 2004
@@ -21,27 +21,8 @@
  */
 
 #include <linux/config.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ptrace.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/spinlock.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
 #include <linux/module.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/atomic.h>
-
-#include <asm/smp.h>
-#include <asm/pdc.h>
 
 /* #define DEBUG_UNALIGNED 1 */
 
@@ -93,13 +74,17 @@
 #define OPCODE_STDA	OPCODE1(0x03,1,0xf)
 
 #define OPCODE_FLDWX	OPCODE1(0x09,0,0x0)
-#define OPCODE_FSTWX	OPCODE1(0x09,0,0x4)
+#define OPCODE_FLDWXR	OPCODE1(0x09,0,0x1)
+#define OPCODE_FSTWX	OPCODE1(0x09,0,0x8)
+#define OPCODE_FSTWXR	OPCODE1(0x09,0,0x9)
 #define OPCODE_FLDWS	OPCODE1(0x09,1,0x0)
-#define OPCODE_FSTWS	OPCODE1(0x09,1,0x4)
+#define OPCODE_FLDWSR	OPCODE1(0x09,1,0x1)
+#define OPCODE_FSTWS	OPCODE1(0x09,1,0x8)
+#define OPCODE_FSTWSR	OPCODE1(0x09,1,0x9)
 #define OPCODE_FLDDX	OPCODE1(0x0b,0,0x0)
-#define OPCODE_FSTDX	OPCODE1(0x0b,0,0x4)
+#define OPCODE_FSTDX	OPCODE1(0x0b,0,0x8)
 #define OPCODE_FLDDS	OPCODE1(0x0b,1,0x0)
-#define OPCODE_FSTDS	OPCODE1(0x0b,1,0x4)
+#define OPCODE_FSTDS	OPCODE1(0x0b,1,0x8)
 
 #define OPCODE_LDD_L	OPCODE2(0x14,0)
 #define OPCODE_FLDD_L	OPCODE2(0x14,1)
@@ -128,6 +113,9 @@
 #define IM5_3(i) IM((i),5)
 #define IM14(i) IM((i),14)
 
+#define ERR_NOTHANDLED	-1
+#define ERR_PAGEFAULT	-2
+
 int unaligned_enabled = 1;
 
 void die_if_kernel (char *str, struct pt_regs *regs, long err);
@@ -136,16 +124,28 @@
 {
 	unsigned long saddr = regs->ior;
 	unsigned long val = 0;
+	int ret;
 
 	DPRINTF("load " RFMT ":" RFMT " to r%d for 2 bytes\n", 
 		regs->isr, regs->ior, toreg);
 
 	__asm__ __volatile__  (
-"	mtsp	%3, %%sr1\n"
-"	ldbs	0(%%sr1,%2), %%r20\n"
-"	ldbs	1(%%sr1,%2), %0\n"
-	"depw	%%r20, 23, 24, %0\n"
-	: "=r" (val)
+"	mtsp	%4, %%sr1\n"
+"1:	ldbs	0(%%sr1,%3), %%r20\n"
+"2:	ldbs	1(%%sr1,%3), %0\n"
+"	depw	%%r20, 23, 24, %0\n"
+"	cmpclr,= %%r0, %%r0, %1\n"
+"3:	ldo	-2(%%r0), %1\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(3b-1b)\n"
+"	.dword  2b,(3b-2b)\n"
+#else
+"	.word	1b,(3b-1b)\n"
+"	.word	2b,(3b-2b)\n"
+#endif
+"	.previous\n"
+	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
 	: "r20" );
 
@@ -154,26 +154,39 @@
 	if (toreg)
 		regs->gr[toreg] = val;
 
-	return 0;
+	return ret;
 }
+
 static int emulate_ldw(struct pt_regs *regs, int toreg, int flop)
 {
 	unsigned long saddr = regs->ior;
 	unsigned long val = 0;
+	int ret;
 
 	DPRINTF("load " RFMT ":" RFMT " to r%d for 4 bytes\n", 
 		regs->isr, regs->ior, toreg);
 
 	__asm__ __volatile__  (
-"	zdep	%2,28,2,%%r19\n"		/* r19=(ofs&3)*8 */
-"	mtsp	%3, %%sr1\n"
-"	depw	%%r0,31,2,%2\n"
-"	ldw	0(%%sr1,%2),%0\n"
-"	ldw	4(%%sr1,%2),%%r20\n"
+"	zdep	%3,28,2,%%r19\n"		/* r19=(ofs&3)*8 */
+"	mtsp	%4, %%sr1\n"
+"	depw	%%r0,31,2,%3\n"
+"1:	ldw	0(%%sr1,%3),%0\n"
+"2:	ldw	4(%%sr1,%3),%%r20\n"
 "	subi	32,%%r19,%%r19\n"
 "	mtctl	%%r19,11\n"
 "	vshd	%0,%%r20,%0\n"
-	: "=r" (val)
+"	cmpclr,= %%r0, %%r0, %1\n"
+"3:	ldo	-2(%%r0), %1\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(3b-1b)\n"
+"	.dword  2b,(3b-2b)\n"
+#else
+"	.word	1b,(3b-1b)\n"
+"	.word	2b,(3b-2b)\n"
+#endif
+"	.previous\n"
+	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
 	: "r19", "r20" );
 
@@ -184,12 +197,13 @@
 	else if (toreg)
 		regs->gr[toreg] = val;
 
-	return 0;
+	return ret;
 }
 static int emulate_ldd(struct pt_regs *regs, int toreg, int flop)
 {
 	unsigned long saddr = regs->ior;
 	__u64 val = 0;
+	int ret;
 
 	DPRINTF("load " RFMT ":" RFMT " to r%d for 8 bytes\n", 
 		regs->isr, regs->ior, toreg);
@@ -200,51 +214,77 @@
 		return -1;
 #endif
 	__asm__ __volatile__  (
-"	depd,z	%2,60,3,%%r19\n"		/* r19=(ofs&7)*8 */
-"	mtsp	%3, %%sr1\n"
-"	depd	%%r0,63,3,%2\n"
-"	ldd	0(%%sr1,%2),%0\n"
-"	ldd	8(%%sr1,%2),%%r20\n"
+"	depd,z	%3,60,3,%%r19\n"		/* r19=(ofs&7)*8 */
+"	mtsp	%4, %%sr1\n"
+"	depd	%%r0,63,3,%3\n"
+"1:	ldd	0(%%sr1,%3),%0\n"
+"2:	ldd	8(%%sr1,%3),%%r20\n"
 "	subi	64,%%r19,%%r19\n"
 "	mtsar	%%r19\n"
 "	shrpd	%0,%%r20,%%sar,%0\n"
-	: "=r" (val)
+"	cmpclr,= %%r0, %%r0, %1\n"
+"3:	ldo	-2(%%r0), %1\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(3b-1b)\n"
+"	.dword  2b,(3b-2b)\n"
+#else
+"	.word	1b,(3b-1b)\n"
+"	.word	2b,(3b-2b)\n"
+#endif
+"	.previous\n"
+	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
 	: "r19", "r20" );
 #else
     {
 	unsigned long valh=0,vall=0;
 	__asm__ __volatile__  (
-"	zdep	%4,29,2,%%r19\n"		/* r19=(ofs&3)*8 */
-"	mtsp	%5, %%sr1\n"
-"	dep	%%r0,31,2,%4\n"
-"	ldw	0(%%sr1,%5),%0\n"
-"	ldw	4(%%sr1,%5),%1\n"
-"	ldw	8(%%sr1,%5),%%r20\n"
+"	zdep	%5,29,2,%%r19\n"		/* r19=(ofs&3)*8 */
+"	mtsp	%6, %%sr1\n"
+"	dep	%%r0,31,2,%5\n"
+"1:	ldw	0(%%sr1,%5),%0\n"
+"2:	ldw	4(%%sr1,%5),%1\n"
+"3:	ldw	8(%%sr1,%5),%%r20\n"
 "	subi	32,%%r19,%%r19\n"
 "	mtsar	%%r19\n"
 "	vshd	%0,%1,%0\n"
 "	vshd	%1,%%r20,%1\n"
-	: "=r" (valh), "=r" (vall)
+"	cmpclr,= %%r0, %%r0, %2\n"
+"4:	ldo	-2(%%r0), %2\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(4b-1b)\n"
+"	.dword  2b,(4b-2b)\n"
+"	.dword	3b,(4b-3b)\n"
+#else
+"	.word	1b,(4b-1b)\n"
+"	.word	2b,(4b-2b)\n"
+"	.word	3b,(4b-3b)\n"
+#endif
+"	.previous\n"
+	: "=r" (valh), "=r" (vall), "=r" (ret)
 	: "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr)
 	: "r19", "r20" );
 	val=((__u64)valh<<32)|(__u64)vall;
     }
 #endif
 
-	DPRINTF("val = 0x" RFMT "\n", val);
+	DPRINTF("val = 0xllx\n", val);
 
 	if (flop)
 		regs->fr[toreg] = val;
 	else if (toreg)
 		regs->gr[toreg] = val;
 
-	return 0;
+	return ret;
 }
 
 static int emulate_sth(struct pt_regs *regs, int frreg)
 {
 	unsigned long val = regs->gr[frreg];
+	int ret;
+
 	if (!frreg)
 		val = 0;
 
@@ -252,19 +292,32 @@
 		val, regs->isr, regs->ior);
 
 	__asm__ __volatile__ (
-"	mtsp %2, %%sr1\n"
-"	extrw,u %0, 23, 8, %%r19\n"
-"	stb %0, 1(%%sr1, %1)\n"
-"	stb %%r19, 0(%%sr1, %1)\n"
-	:
+"	mtsp %3, %%sr1\n"
+"	extrw,u %1, 23, 8, %%r19\n"
+"1:	stb %1, 1(%%sr1, %2)\n"
+"2:	stb %%r19, 0(%%sr1, %2)\n"
+"	cmpclr,= %%r0, %%r0, %0\n"
+"3:	ldo	-2(%%r0), %0\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(3b-1b)\n"
+"	.dword  2b,(3b-2b)\n"
+#else
+"	.word	1b,(3b-1b)\n"
+"	.word	2b,(3b-2b)\n"
+#endif
+"	.previous\n"
+	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
 	: "r19" );
 
-	return 0;
+	return ret;
 }
+
 static int emulate_stw(struct pt_regs *regs, int frreg, int flop)
 {
 	unsigned long val;
+	int ret;
 
 	if (flop)
 		val = ((__u32*)(regs->fr))[frreg];
@@ -278,22 +331,33 @@
 
 
 	__asm__ __volatile__ (
-"	mtsp %2, %%sr1\n"
-"	zdep	%1, 28, 2, %%r19\n"
-"	dep	%%r0, 31, 2, %1\n"
+"	mtsp %3, %%sr1\n"
+"	zdep	%2, 28, 2, %%r19\n"
+"	dep	%%r0, 31, 2, %2\n"
 "	mtsar	%%r19\n"
 "	depwi,z	-2, %%sar, 32, %%r19\n"
-"	ldw	0(%%sr1,%1),%%r20\n"
-"	ldw	4(%%sr1,%1),%%r21\n"
-"	vshd	%%r0, %0, %%r22\n"
-"	vshd	%0, %%r0, %%r1\n"
+"1:	ldw	0(%%sr1,%2),%%r20\n"
+"2:	ldw	4(%%sr1,%2),%%r21\n"
+"	vshd	%%r0, %1, %%r22\n"
+"	vshd	%1, %%r0, %%r1\n"
 "	and	%%r20, %%r19, %%r20\n"
 "	andcm	%%r21, %%r19, %%r21\n"
 "	or	%%r22, %%r20, %%r20\n"
 "	or	%%r1, %%r21, %%r21\n"
-"	stw	%%r20,0(%%sr1,%1)\n"
-"	stw	%%r21,4(%%sr1,%1)\n"
-	:
+"	stw	%%r20,0(%%sr1,%2)\n"
+"	stw	%%r21,4(%%sr1,%2)\n"
+"	cmpclr,= %%r0, %%r0, %0\n"
+"3:	ldo	-2(%%r0), %0\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(3b-1b)\n"
+"	.dword  2b,(3b-2b)\n"
+#else
+"	.word	1b,(3b-1b)\n"
+"	.word	2b,(3b-2b)\n"
+#endif
+"	.previous\n"
+	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
 	: "r19", "r20", "r21", "r22", "r1" );
 
@@ -302,6 +366,7 @@
 static int emulate_std(struct pt_regs *regs, int frreg, int flop)
 {
 	__u64 val;
+	int ret;
 
 	if (flop)
 		val = regs->fr[frreg];
@@ -310,7 +375,7 @@
 	else
 		val = 0;
 
-	DPRINTF("store r%d (0x" %016llx ") to " RFMT ":" RFMT " for 8 bytes\n", frreg, 
+	DPRINTF("store r%d (0x%016llx) to " RFMT ":" RFMT " for 8 bytes\n", frreg, 
 		val,  regs->isr, regs->ior);
 
 #ifdef CONFIG_PA20
@@ -319,52 +384,84 @@
 		return -1;
 #endif
 	__asm__ __volatile__ (
-"	mtsp %2, %%sr1\n"
-"	depd,z	%1, 60, 3, %%r19\n"
-"	depd	%%r0, 63, 3, %1\n"
+"	mtsp %3, %%sr1\n"
+"	depd,z	%2, 60, 3, %%r19\n"
+"	depd	%%r0, 63, 3, %2\n"
 "	mtsar	%%r19\n"
 "	depdi,z	-2, %%sar, 64, %%r19\n"
-"	ldd	0(%%sr1,%1),%%r20\n"
-"	ldd	8(%%sr1,%1),%%r21\n"
-"	shrpd	%%r0, %0, %%sar, %%r22\n"
-"	shrpd	%0, %%r0, %%sar, %%r1\n"
+"1:	ldd	0(%%sr1,%2),%%r20\n"
+"2:	ldd	8(%%sr1,%2),%%r21\n"
+"	shrpd	%%r0, %1, %%sar, %%r22\n"
+"	shrpd	%1, %%r0, %%sar, %%r1\n"
 "	and	%%r20, %%r19, %%r20\n"
 "	andcm	%%r21, %%r19, %%r21\n"
 "	or	%%r22, %%r20, %%r20\n"
 "	or	%%r1, %%r21, %%r21\n"
-"	std	%%r20,0(%%sr1,%1)\n"
-"	std	%%r21,8(%%sr1,%1)\n"
-	:
+"3:	std	%%r20,0(%%sr1,%2)\n"
+"4:	std	%%r21,8(%%sr1,%2)\n"
+"	cmpclr,= %%r0, %%r0, %0\n"
+"5:	ldo	-2(%%r0), %0\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(5b-1b)\n"
+"	.dword  2b,(5b-2b)\n"
+"	.dword	3b,(5b-3b)\n"
+"	.dword  4b,(5b-4b)\n"
+#else
+"	.word	1b,(5b-1b)\n"
+"	.word	2b,(5b-2b)\n"
+"	.word	3b,(5b-3b)\n"
+"	.word	4b,(5b-4b)\n"
+#endif
+"	.previous\n"
+	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
 	: "r19", "r20", "r21", "r22", "r1" );
 #else
     {
 	unsigned long valh=(val>>32),vall=(val&0xffffffffl);
 	__asm__ __volatile__ (
-"	mtsp	%3, %%sr1\n"
-"	zdep	%1, 29, 2, %%r19\n"
-"	dep	%%r0, 31, 2, %1\n"
+"	mtsp	%4, %%sr1\n"
+"	zdep	%2, 29, 2, %%r19\n"
+"	dep	%%r0, 31, 2, %2\n"
 "	mtsar	%%r19\n"
 "	zvdepi	-2, 32, %%r19\n"
-"	ldw	0(%%sr1,%2),%%r20\n"
-"	ldw	8(%%sr1,%2),%%r21\n"
-"	vshd	%0, %1, %%r1\n"
-"	vshd	%%r0, %0, %0\n"
-"	vshd	%1, %%r0, %1\n"
+"1:	ldw	0(%%sr1,%3),%%r20\n"
+"2:	ldw	8(%%sr1,%3),%%r21\n"
+"	vshd	%1, %2, %%r1\n"
+"	vshd	%%r0, %1, %1\n"
+"	vshd	%2, %%r0, %2\n"
 "	and	%%r20, %%r19, %%r20\n"
 "	andcm	%%r21, %%r19, %%r21\n"
-"	or	%0, %%r20, %0\n"
-"	or	%1, %%r21, %1\n"
-"	stw	%0,0(%%sr1,%2)\n"
-"	stw	%%r1,4(%%sr1,%2)\n"
-"	stw	%1,8(%%sr1,%2)\n"
-	:
+"	or	%1, %%r20, %1\n"
+"	or	%2, %%r21, %2\n"
+"3:	stw	%1,0(%%sr1,%1)\n"
+"4:	stw	%%r1,4(%%sr1,%3)\n"
+"5:	stw	%2,8(%%sr1,%3)\n"
+"	cmpclr,= %%r0, %%r0, %0\n"
+"6:	ldo	-2(%%r0), %0\n"
+"	.section __ex_table,\"a\"\n"
+#ifdef __LP64__
+"	.dword	1b,(6b-1b)\n"
+"	.dword  2b,(6b-2b)\n"
+"	.dword	3b,(6b-3b)\n"
+"	.dword  4b,(6b-4b)\n"
+"	.dword  5b,(6b-5b)\n"
+#else
+"	.word	1b,(6b-1b)\n"
+"	.word	2b,(6b-2b)\n"
+"	.word	3b,(6b-3b)\n"
+"	.word	4b,(6b-4b)\n"
+"	.word  	5b,(6b-5b)\n"
+#endif
+"	.previous\n"
+	: "=r" (ret)
 	: "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr)
 	: "r19", "r20", "r21", "r1" );
     }
 #endif
 
-	return 0;
+	return ret;
 }
 
 void handle_unaligned(struct pt_regs *regs)
@@ -373,41 +470,10 @@
 	static unsigned long last_time = 0;
 	unsigned long newbase = R1(regs->iir)?regs->gr[R1(regs->iir)]:0;
 	int modify = 0;
-	int ret = -1;
+	int ret = ERR_NOTHANDLED;
 	struct siginfo si;
 	register int flop=0;	/* true if this is a flop */
 
-	/* if the unaligned access is inside the kernel:
-	 *   if the access is caused by a syscall, then we fault the calling
-	 *     user process
-	 */
-	if (!user_mode(regs))
-	{
-		const struct exception_table_entry *fix;
-
-		/* see if the offending code have its own
-		 * exception handler 
-		 */ 
-
-		fix = search_exception_tables(regs->iaoq[0]);
-		if (fix)
-		{
-			/* lower bits of fix->skip are flags
-			 * upper bits are the handler addr
-			 */
-			if (fix->skip & 1)
-				regs->gr[8] = -EFAULT;
-			if (fix->skip & 2)
-				regs->gr[9] = 0;
-
-			regs->iaoq[0] += ((fix->skip) & ~3);
-			regs->iaoq[1] = regs->iaoq[0] + 4;
-			regs->gr[0] &= ~PSW_B;
-
-			return;
-		}
-	}
-
 	/* log a message with pacing */
 	if (user_mode(regs))
 	{
@@ -541,6 +607,8 @@
 
 	case OPCODE_FLDWX:
 	case OPCODE_FLDWS:
+	case OPCODE_FLDWXR:
+	case OPCODE_FLDWSR:
 		flop=1;
 		ret = emulate_ldw(regs,FR3(regs->iir),1);
 		break;
@@ -553,6 +621,8 @@
 
 	case OPCODE_FSTWX:
 	case OPCODE_FSTWS:
+	case OPCODE_FSTWXR:
+	case OPCODE_FSTWSR:
 		flop=1;
 		ret = emulate_stw(regs,FR3(regs->iir),1);
 		break;
@@ -567,7 +637,7 @@
 	case OPCODE_LDCW_I:
 	case OPCODE_LDCD_S:
 	case OPCODE_LDCW_S:
-		ret = -1;	/* "undefined", but lets kill them. */
+		ret = ERR_NOTHANDLED;	/* "undefined", but lets kill them. */
 		break;
 	}
 #ifdef CONFIG_PA20
@@ -632,7 +702,7 @@
 		regs->gr[R1(regs->iir)] = newbase;
 
 
-	if (ret < 0)
+	if (ret == ERR_NOTHANDLED)
 		printk(KERN_CRIT "Not-handled unaligned insn 0x%08lx\n", regs->iir);
 
 	DPRINTF("ret = %d\n", ret);
@@ -641,13 +711,25 @@
 	{
 		printk(KERN_CRIT "Unaligned handler failed, ret = %d\n", ret);
 		die_if_kernel("Unaligned data reference", regs, 28);
+
+		if (ret == ERR_PAGEFAULT)
+		{
+			si.si_signo = SIGSEGV;
+			si.si_errno = 0;
+			si.si_code = SEGV_MAPERR;
+			si.si_addr = (void *)regs->ior;
+			force_sig_info(SIGSEGV, &si, current);
+		}
+		else
+		{
 force_sigbus:
-		/* couldn't handle it ... */
-		si.si_signo = SIGBUS;
-		si.si_errno = 0;
-		si.si_code = BUS_ADRALN;
-		si.si_addr = (void *)regs->ior;
-		force_sig_info(SIGBUS, &si, current);
+			/* couldn't handle it ... */
+			si.si_signo = SIGBUS;
+			si.si_errno = 0;
+			si.si_code = BUS_ADRALN;
+			si.si_addr = (void *)regs->ior;
+			force_sig_info(SIGBUS, &si, current);
+		}
 		
 		return;
 	}
diff -Nru a/arch/parisc/lib/lusercopy.S b/arch/parisc/lib/lusercopy.S
--- a/arch/parisc/lib/lusercopy.S	Thu Jan  8 23:00:23 2004
+++ b/arch/parisc/lib/lusercopy.S	Thu Jan  8 23:00:23 2004
@@ -133,6 +133,43 @@
 	.procend
 
 	/*
+	 * unsigned long
+	 * lcopy_in_user(void *to, const void *from, unsigned long n)
+	 *
+	 * Returns 0 for success.
+	 * otherwise, returns number of bytes not transferred.
+	 */
+
+	.export lcopy_in_user,code
+lcopy_in_user:
+	.proc
+	.callinfo NO_CALLS
+	.entry
+	comib,=,n   0,%r24,$lciu_done
+	get_sr
+$lciu_loop:
+	ldbs,ma     1(%sr1,%r25),%r1
+	addib,<>    -1,%r24,$lciu_loop
+1:      stbs,ma     %r1,1(%sr1,%r26)
+$lciu_done:
+	bv          %r0(%r2)
+	copy        %r24,%r28
+	.exit
+
+2:      b $lciu_done
+	ldo         1(%r24),%r24
+
+	.section __ex_table,"a"
+#ifdef __LP64__
+	.dword      1b,(2b-1b)
+#else
+	.word       1b,(2b-1b)
+#endif
+	.previous
+
+	.procend
+
+	/*
 	 * long lstrncpy_from_user(char *dst, const char *src, long n)
 	 *
 	 * Returns -EFAULT if exception before terminator,
diff -Nru a/arch/ppc/boot/simple/Makefile b/arch/ppc/boot/simple/Makefile
--- a/arch/ppc/boot/simple/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/ppc/boot/simple/Makefile	Thu Jan  8 23:00:23 2004
@@ -4,30 +4,38 @@
 # Author: Tom Rini <trini@mvista.com>
 #
 # Notes:
-# (1) For machine targets which produce more than one image, define
-# ZNETBOOT and ZNETBOOTRD to the image which should be available for
-# 'znetboot' and 'znetboot.initrd`
-# (2) Also, for machine targets which just need to remove the ELF header,
-# define END to be the machine name you want in the image.
-# (3) For machine targets which use the mktree program, define END to be
-# the machine name you want in the image, and you can optionally set
-# ENTRYPOINT which the image should be loaded at.  The optimal setting
-# for ENTRYPOINT is the link address.
+# (1) For machines that do not want to use the ELF image directly (including
+# stripping just the ELF header off), they must set the variables
+# zimage-$(CONFIG_MACHINE) and zimagerd-$(CONFIG_MACHINE) to the target
+# that produces the desired image and they must set end-$(CONFIG_MACHINE)
+# to what will be suffixed to the image filename.
+# (2) Regardless of (1), to have the resulting image be something other
+# than 'zImage.elf', set end-$(CONFIG_MACHINE) to be the suffix used for
+# the zImage, znetboot, and znetbootrd targets.
+# (3) For machine targets which use the mktree program, you can optionally
+# set entrypoint-$(CONFIG_MACHINE) to the location which the image should be
+# loaded at.  The optimal setting for entrypoint-$(CONFIG_MACHINE) is the link
+# address.
 # (4) It is advisable to pass in the memory size using BI_MEMSIZE and
 # get_mem_size(), which is memory controller dependent.  Add in the correct
-# XXX_memory.o file for this to work, as well as editing the $(MISC) file.
-
+# XXX_memory.o file for this to work, as well as editing the
+# misc-$(CONFIG_MACHINE) variable.
 
 boot				:= arch/ppc/boot
 common				:= $(boot)/common
 utils				:= $(boot)/utils
 bootlib				:= $(boot)/lib
 images				:= $(boot)/images
+tftpboot			:= /tftpboot
 
 # Normally, we use the 'misc.c' file for decompress_kernel and
 # whatnot.  Sometimes we need to override this however.
 misc-y	:= misc.o
 
+# Normally, we have our images end in .elf, but something we want to
+# change this.
+end-y := elf
+
 # Additionally, we normally don't need to mess with the L2 / L3 caches
 # if present on 'classic' PPC.
 cacheflag-y	:= -DCLEAR_CACHES=""
@@ -41,48 +49,43 @@
       zimage-$(CONFIG_IBM_OPENBIOS)	:= zImage-TREE
 zimageinitrd-$(CONFIG_IBM_OPENBIOS)	:= zImage.initrd-TREE
          end-$(CONFIG_IBM_OPENBIOS)	:= treeboot
-   tftpimage-$(CONFIG_IBM_OPENBIOS)	:= /tftpboot/zImage.$(end-y)
         misc-$(CONFIG_IBM_OPENBIOS)	:= misc-embedded.o
 
-   tftpimage-$(CONFIG_EMBEDDEDBOOT)	:=  /tftpboot/zImage.embedded
+         end-$(CONFIG_EMBEDDEDBOOT)	:= embedded
         misc-$(CONFIG_EMBEDDEDBOOT)	:= misc-embedded.o
 
       zimage-$(CONFIG_EBONY)		:= zImage-TREE
 zimageinitrd-$(CONFIG_EBONY)		:= zImage.initrd-TREE
          end-$(CONFIG_EBONY)		:= ebony
   entrypoint-$(CONFIG_EBONY)		:= 0x01000000
-   tftpimage-$(CONFIG_EBONY)		:= /tftpboot/zImage.$(end-y)
 
       zimage-$(CONFIG_OCOTEA)		:= zImage-TREE
 zimageinitrd-$(CONFIG_OCOTEA)		:= zImage.initrd-TREE
          end-$(CONFIG_OCOTEA)		:= ocotea
   entrypoint-$(CONFIG_OCOTEA)		:= 0x01000000
-   tftpimage-$(CONFIG_OCOTEA)		:= /tftpboot/zImage.$(end-y)
 
      extra.o-$(CONFIG_EV64260)		:= direct.o misc-ev64260.o
-   tftpimage-$(CONFIG_EV64260)		:= /tftpboot/zImage.ev64260
+         end-$(CONFIG_EV64260)		:= ev64260
    cacheflag-$(CONFIG_EV64260)		:= -include $(clear_L2_L3)
 
       zimage-$(CONFIG_GEMINI)		:= zImage-STRIPELF
 zimageinitrd-$(CONFIG_GEMINI)		:= zImage.initrd-STRIPELF
          end-$(CONFIG_GEMINI)		:= gemini
-   tftpimage-$(CONFIG_GEMINI)		:= /tftpboot/zImage.$(end-y)
 
      extra.o-$(CONFIG_K2)		:= legacy.o
-   tftpimage-$(CONFIG_K2)		:= /tftpboot/zImage.k2
+         end-$(CONFIG_K2)		:= k2
    cacheflag-$(CONFIG_K2)		:= -include $(clear_L2_L3)
 
 # kconfig 'feature', only one of these will ever be 'y' at a time.
 # The rest will be unset.
 motorola := $(CONFIG_MCPN765)$(CONFIG_MVME5100)$(CONFIG_PRPMC750) \
 $(CONFIG_PRPMC800)$(CONFIG_LOPEC)$(CONFIG_PPLUS)
+motorola := $(strip $(motorola))
 pcore := $(CONFIG_PCORE)$(CONFIG_POWERPMC250)
 
       zimage-$(motorola)		:= zImage-PPLUS
 zimageinitrd-$(motorola)		:= zImage.initrd-PPLUS
-   tftpimage-$(motorola)		:= /tftpboot/zImage.pplus
-    znetboot-$(motorola)		:= zImage.pplus
-  znetbootrd-$(motorola)		:= zImage.initrd.pplus
+         end-$(motorola)		:= pplus
 
 # Overrides previous assingment
      extra.o-$(CONFIG_PPLUS)		:= legacy.o
@@ -91,10 +94,9 @@
 zimageinitrd-$(pcore)			:= zImage.initrd-STRIPELF
      extra.o-$(pcore)			:= chrpmap.o
          end-$(pcore)			:= pcore
-   tftpimage-$(pcore)			:= /tftpboot/zImage.$(end-y)
    cacheflag-$(pcore)			:= -include $(clear_L2_L3)
 
-   tftpimage-$(CONFIG_SANDPOINT)	:= /tftpboot/zImage.sandpoint
+         end-$(CONFIG_SANDPOINT)	:= sandpoint
    cacheflag-$(CONFIG_SANDPOINT)	:= -include $(clear_L2_L3)
 
       zimage-$(CONFIG_SPRUCE)		:= zImage-TREE
@@ -102,11 +104,9 @@
          end-$(CONFIG_SPRUCE)		:= spruce
   entrypoint-$(CONFIG_SPRUCE)		:= 0x00800000
         misc-$(CONFIG_SPRUCE)		:= misc-spruce.o
-   tftpimage-$(CONFIG_SPRUCE)		:= /tftpboot/zImage.$(end-y)
-
 
-# tftp image is prefixed with .smp if compiled for SMP
-tftpimage-$(CONFIG_SMP)	+= .smp
+# SMP images should have a '.smp' suffix.
+         end-$(CONFIG_SMP)		+= .smp
 
 # This is a treeboot that needs init functions until the
 # boot rom is sorted out (i.e. this is short lived)
@@ -180,18 +180,10 @@
 	rm -f $(obj)/zvmlinux.initrd
 
 znetboot: zImage
-ifneq ($(ZNETBOOT),)
-	cp $(images)/$(ZNETBOOT) $(tftpimage-y)
-else
-	cp $(images)/zImage.* $(tftpimage-y)
-endif
+	cp $(images)/zImage.$(end-y) $(tftpboot)/zImage.$(end-y)
 
 znetboot.initrd: zImage.initrd
-ifneq ($(znetbootrd-y),)
-	cp $(images)/$(znetbootrd-y) $(tftpimage-y)
-else
-	cp $(images)/zImage.* $(tftpimage-y)
-endif
+	cp $(images)/zImage.initrd.$(end-y) $(tftpboot)/zImage.initrd.$(end-y)
 
 $(images)/zImage-STRIPELF: $(obj)/zvmlinux
 	dd if=$(obj)/zvmlinux of=$(images)/zImage.$(end-y) skip=64 bs=1k
diff -Nru a/arch/ppc/boot/utils/mkprep.c b/arch/ppc/boot/utils/mkprep.c
--- a/arch/ppc/boot/utils/mkprep.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc/boot/utils/mkprep.c	Thu Jan  8 23:00:24 2004
@@ -12,12 +12,14 @@
  *                  -- Cort
  *
  * Modified for x86 hosted builds by Matt Porter <porter@neta.com>
+ * Modified for Sparc hosted builds by Peter Wahl <PeterWahl@web.de>
  */
 
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include <sys/stat.h>
 #include <unistd.h>
 
@@ -147,7 +149,7 @@
 void write_prep_partition(int in, int out)
 {
   unsigned char block[512];
-  partition_entry_t *pe = (partition_entry_t *)&block[0x1BE];
+  partition_entry_t pe;
   dword_t *entry  = (dword_t *)&block[0];
   dword_t *length = (dword_t *)&block[sizeof(long)];
   struct stat info;
@@ -177,8 +179,8 @@
    * Build a "PReP" partition table entry in the boot record
    *  - "PReP" may only look at the system_indicator
    */
-  pe->boot_indicator   = BootActive;
-  pe->system_indicator = SystemPrep;
+  pe.boot_indicator   = BootActive;
+  pe.system_indicator = SystemPrep;
   /*
    * The first block of the diskette is used by this "boot record" which
    * actually contains the partition table. (The first block of the
@@ -186,12 +188,12 @@
    * one partition on the diskette and it shall contain the rest of the
    * diskette.
    */
-  pe->starting_head     = 0;	/* zero-based			     */
-  pe->starting_sector   = 2;	/* one-based			     */
-  pe->starting_cylinder = 0;	/* zero-based			     */
-  pe->ending_head       = 1;	/* assumes two heads		     */
-  pe->ending_sector     = 18;	/* assumes 18 sectors/track	     */
-  pe->ending_cylinder   = 79;	/* assumes 80 cylinders/diskette     */
+  pe.starting_head     = 0;	/* zero-based			     */
+  pe.starting_sector   = 2;	/* one-based			     */
+  pe.starting_cylinder = 0;	/* zero-based			     */
+  pe.ending_head       = 1;	/* assumes two heads		     */
+  pe.ending_sector     = 18;	/* assumes 18 sectors/track	     */
+  pe.ending_cylinder   = 79;	/* assumes 80 cylinders/diskette     */
 
   /*
    * The "PReP" software ignores the above fields and just looks at
@@ -201,20 +203,20 @@
    *   - unlike the above sector numbers, the beginning sector is zero-based!
    */
 #if 0
-  pe->beginning_sector  = cpu_to_le32(1);
+  pe.beginning_sector  = cpu_to_le32(1);
 #else
   /* This has to be 0 on the PowerStack? */
 #ifdef __i386__
-  pe->beginning_sector  = 0;
+  pe.beginning_sector  = 0;
 #else
-  pe->beginning_sector  = cpu_to_le32(0);
+  pe.beginning_sector  = cpu_to_le32(0);
 #endif /* __i386__ */
 #endif
 
 #ifdef __i386__
-  pe->number_of_sectors = 2*18*80-1;
+  pe.number_of_sectors = 2*18*80-1;
 #else
-  pe->number_of_sectors = cpu_to_le32(2*18*80-1);
+  pe.number_of_sectors = cpu_to_le32(2*18*80-1);
 #endif /* __i386__ */
 
   write( out, block, sizeof(block) );
diff -Nru a/arch/ppc/kernel/irq.c b/arch/ppc/kernel/irq.c
--- a/arch/ppc/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -346,17 +346,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ", j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ", j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if ( !action || !action->handler )
@@ -381,22 +383,23 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
+	} else if (i == NR_IRQS) {
 #ifdef CONFIG_TAU_INT
-	if (tau_initialized){
-		seq_puts(p, "TAU: ");
-		for (j = 0; j < NR_CPUS; j++)
-			if (cpu_online(j))
-				seq_printf(p, "%10u ", tau_interrupts(j));
-		seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
-	}
+		if (tau_initialized){
+			seq_puts(p, "TAU: ");
+			for (j = 0; j < NR_CPUS; j++)
+				if (cpu_online(j))
+					seq_printf(p, "%10u ", tau_interrupts(j));
+			seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
+		}
 #endif
 #ifdef CONFIG_SMP
-	/* should this be per processor send/receive? */
-	seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-		   atomic_read(&ipi_recv), atomic_read(&ipi_sent));
+		/* should this be per processor send/receive? */
+		seq_printf(p, "IPI (recv/sent): %10u/%u\n",
+				atomic_read(&ipi_recv), atomic_read(&ipi_sent));
 #endif
-	seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+	}
 	return 0;
 }
 
@@ -569,67 +572,16 @@
 
 cpumask_t irq_affinity [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp = irq_affinity[(long)data];
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
-static unsigned int parse_hex_value (const char __user *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 static int irq_affinity_write_proc (struct file *file, const char __user *buffer,
 					unsigned long count, void *data)
 {
@@ -639,7 +591,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -664,19 +616,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t mask = *(cpumask_t *)data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-		len += j;
-		page += j;
-		cpus_shift_right(mask, mask, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -686,7 +629,7 @@
 	cpumask_t *mask = (cpumask_t *)data, full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c
--- a/arch/ppc/kernel/ppc_ksyms.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc/kernel/ppc_ksyms.c	Thu Jan  8 23:00:24 2004
@@ -367,9 +367,9 @@
 EXPORT_SYMBOL(set_context);
 EXPORT_SYMBOL(handle_mm_fault); /* For MOL */
 EXPORT_SYMBOL_NOVERS(disarm_decr);
+#ifdef CONFIG_PPC_STD_MMU
 extern long mol_trampoline;
 EXPORT_SYMBOL(mol_trampoline); /* For MOL */
-#ifdef CONFIG_PPC_STD_MMU
 EXPORT_SYMBOL(flush_hash_pages); /* For MOL */
 #ifdef CONFIG_SMP
 extern int mmu_hash_lock;
diff -Nru a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c
--- a/arch/ppc64/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ppc64/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -323,18 +323,20 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++) {
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++) {
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		}
+		seq_putc(p, '\n');
 	}
-	seq_putc(p, '\n');
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action || !action->handler)
@@ -359,8 +361,8 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+	} else if (i == NR_IRQS)
+		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
 	return 0;
 }
 
@@ -652,67 +654,16 @@
 cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_NONE };
 #endif /* CONFIG_IRQ_ALL_CPUS */
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum[HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int c = hexnum[i];
-		int k;
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (test_bit(k, (unsigned long *)&c))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
 					unsigned long count, void *data)
 {
@@ -722,7 +673,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
@@ -744,10 +695,11 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
@@ -757,7 +709,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/ppc64/kernel/mf_proc.c b/arch/ppc64/kernel/mf_proc.c
--- a/arch/ppc64/kernel/mf_proc.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc64/kernel/mf_proc.c	Thu Jan  8 23:00:24 2004
@@ -220,19 +220,25 @@
 
 int proc_mf_change_side(struct file *file, const char *buffer, unsigned long count, void *data)
 {
+	char stkbuf[10];
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
-	if ((*buffer != 'A') &&
-	    (*buffer != 'B') &&
-	    (*buffer != 'C') &&
-	    (*buffer != 'D'))
+	if (count > 9) count = 9;
+	if (copy_from_user (stkbuf, buffer, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+	if ((*stkbuf != 'A') &&
+	    (*stkbuf != 'B') &&
+	    (*stkbuf != 'C') &&
+	    (*stkbuf != 'D'))
 	{
 		printk(KERN_ERR "mf_proc.c: proc_mf_change_side: invalid side\n");
 		return -EINVAL;
 	}
 
-	mf_setSide(*buffer);
+	mf_setSide(*stkbuf);
 
 	return count;			
 }
@@ -256,6 +262,7 @@
 
 int proc_mf_change_src(struct file *file, const char *buffer, unsigned long count, void *data)
 {
+	char stkbuf[10];
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
@@ -265,11 +272,16 @@
 		return -EINVAL;
 	}
 
-	if ((count == 1) && ((*buffer) == '\0'))
+	if (count > 9) count = 9;
+	if (copy_from_user (stkbuf, buffer, count)) {
+		return -EFAULT;
+	}
+
+	if ((count == 1) && ((*stkbuf) == '\0'))
 	{
 		mf_clearSrc();
 	} else {
-		mf_displaySrc(*(u32 *)buffer);
+		mf_displaySrc(*(u32 *)stkbuf);
 	}
 
 	return count;			
diff -Nru a/arch/ppc64/kernel/proc_pmc.c b/arch/ppc64/kernel/proc_pmc.c
--- a/arch/ppc64/kernel/proc_pmc.c	Thu Jan  8 23:00:23 2004
+++ b/arch/ppc64/kernel/proc_pmc.c	Thu Jan  8 23:00:23 2004
@@ -127,7 +127,7 @@
 			ent->nlink = 1;
 			ent->data = (void *)proc_ppc64_pmc_cpu_root[i];
 			ent->read_proc = (void *)proc_ppc64_pmc_stab_read;
-			ent->write_proc = (void *)proc_ppc64_pmc_stab_read;
+			ent->write_proc = NULL;
 		}
 
 		ent = create_proc_entry("htab", S_IRUGO | S_IWUSR, 
@@ -136,7 +136,7 @@
 			ent->nlink = 1;
 			ent->data = (void *)proc_ppc64_pmc_cpu_root[i];
 			ent->read_proc = (void *)proc_ppc64_pmc_htab_read;
-			ent->write_proc = (void *)proc_ppc64_pmc_htab_read;
+			ent->write_proc = NULL;
 		}
 	}
 
@@ -146,7 +146,7 @@
 		ent->nlink = 1;
 		ent->data = (void *)proc_ppc64_pmc_system_root;
 		ent->read_proc = (void *)proc_ppc64_pmc_stab_read;
-		ent->write_proc = (void *)proc_ppc64_pmc_stab_read;
+		ent->write_proc = NULL;
 	}
 
 	ent = create_proc_entry("htab", S_IRUGO | S_IWUSR, 
@@ -155,7 +155,7 @@
 		ent->nlink = 1;
 		ent->data = (void *)proc_ppc64_pmc_system_root;
 		ent->read_proc = (void *)proc_ppc64_pmc_htab_read;
-		ent->write_proc = (void *)proc_ppc64_pmc_htab_read;
+		ent->write_proc = NULL;
 	}
 
 	/* Create directories for the hardware counters. */
@@ -168,7 +168,7 @@
 			ent->nlink = 1;
 			ent->data = (void *)proc_ppc64_pmc_cpu_root[i];
 			ent->read_proc = (void *)proc_ppc64_pmc_hw_read;
-			ent->write_proc = (void *)proc_ppc64_pmc_hw_read;
+			ent->write_proc = NULL;
 		}
 	}
 
@@ -178,7 +178,7 @@
 		ent->nlink = 1;
 		ent->data = (void *)proc_ppc64_pmc_system_root;
 		ent->read_proc = (void *)proc_ppc64_pmc_hw_read;
-		ent->write_proc = (void *)proc_ppc64_pmc_hw_read;
+		ent->write_proc = NULL;
 	}
 }
 
@@ -676,15 +676,22 @@
 
 int proc_pmc_set_control( struct file *file, const char *buffer, unsigned long count, void *data )
 {
-	if      ( ! strncmp( buffer, "stop", 4 ) )
+	char stkbuf[10];
+	if (count > 9) count = 9;
+	if (copy_from_user (stkbuf, buffer, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+
+	if      ( ! strncmp( stkbuf, "stop", 4 ) )
 		proc_pmc_stop();
-	else if ( ! strncmp( buffer, "start", 5 ) )
+	else if ( ! strncmp( stkbuf, "start", 5 ) )
 		proc_pmc_start();
-	else if ( ! strncmp( buffer, "reset", 5 ) )
+	else if ( ! strncmp( stkbuf, "reset", 5 ) )
 		proc_pmc_reset();
-	else if ( ! strncmp( buffer, "cpi", 3 ) )
+	else if ( ! strncmp( stkbuf, "cpi", 3 ) )
 		proc_pmc_cpi();
-	else if ( ! strncmp( buffer, "tlb", 3 ) )
+	else if ( ! strncmp( stkbuf, "tlb", 3 ) )
 		proc_pmc_tlb();
 	
 	/* IMPLEMENT ME */
diff -Nru a/arch/ppc64/kernel/rtas-proc.c b/arch/ppc64/kernel/rtas-proc.c
--- a/arch/ppc64/kernel/rtas-proc.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc64/kernel/rtas-proc.c	Thu Jan  8 23:00:24 2004
@@ -241,12 +241,18 @@
 static ssize_t ppc_rtas_poweron_write(struct file * file, const char * buf,
 		size_t count, loff_t *ppos)
 {
+	char stkbuf[40];  /* its small, its on stack */
 	struct rtc_time tm;
 	unsigned long nowtime;
 	char *dest;
 	int error;
 
-	nowtime = simple_strtoul(buf, &dest, 10);
+	if (39 < count) count = 39;
+	if (copy_from_user (stkbuf, buf, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+	nowtime = simple_strtoul(stkbuf, &dest, 10);
 	if (*dest != '\0' && *dest != '\n') {
 		printk("ppc_rtas_poweron_write: Invalid time\n");
 		return count;
@@ -267,18 +273,23 @@
 static ssize_t ppc_rtas_poweron_read(struct file * file, char * buf,
 		size_t count, loff_t *ppos)
 {
+	char stkbuf[40];  /* its small, its on stack */
 	int n;
 	if (power_on_time == 0)
-		n = sprintf(buf, "Power on time not set\n");
+		n = snprintf(stkbuf, 40, "Power on time not set\n");
 	else
-		n = sprintf(buf, "%lu\n", power_on_time);
+		n = snprintf(stkbuf, 40, "%lu\n", power_on_time);
 
-	if (*ppos >= strlen(buf))
+	int sn = strlen (stkbuf) +1;
+	if (*ppos >= sn)
 		return 0;
-	if (n > strlen(buf) - *ppos)
-		n = strlen(buf) - *ppos;
+	if (n > sn - *ppos)
+		n = sn - *ppos;
 	if (n > count)
 		n = count;
+	if (copy_to_user (buf, stkbuf + (*ppos), n)) {
+		return -EFAULT;
+	}
 	*ppos += n;
 	return n;
 }
@@ -291,11 +302,16 @@
 {
 	unsigned long hex;
 
-	strcpy(progress_led, buf); /* save the string */
+	if (count >= MAX_LINELENGTH) count = MAX_LINELENGTH -1;
+	if (copy_from_user (progress_led, buf, count)) { /* save the string */
+		return -EFAULT;
+	}
+	progress_led[count] = 0;
+
 	/* Lets see if the user passed hexdigits */
-	hex = simple_strtoul(buf, NULL, 10);
-	
-	ppc_md.progress ((char *)buf, hex);
+	hex = simple_strtoul(progress_led, NULL, 10);
+
+	ppc_md.progress ((char *)progress_led, hex);
 	return count;
 
 	/* clear the line */ /* ppc_md.progress("                   ", 0xffff);*/
@@ -305,14 +321,30 @@
 		size_t count, loff_t *ppos)
 {
 	int n = 0;
-	if (progress_led != NULL)
-		n = sprintf (buf, "%s\n", progress_led);
-	if (*ppos >= strlen(buf))
+
+	if (progress_led == NULL) return 0;
+
+	char * tmpbuf = kmalloc (MAX_LINELENGTH, GFP_KERNEL);
+	if (!tmpbuf) {
+		printk(KERN_ERR "error: kmalloc failed\n");
+		return -ENOMEM;
+	}
+	n = sprintf (tmpbuf, "%s\n", progress_led);
+
+	int sn = strlen (tmpbuf) +1;
+	if (*ppos >= sn) {
+		kfree (tmpbuf);
 		return 0;
-	if (n > strlen(buf) - *ppos)
-		n = strlen(buf) - *ppos;
+	}
+	if (n > sn - *ppos)
+		n = sn - *ppos;
 	if (n > count)
 		n = count;
+	if (copy_to_user (buf, tmpbuf + (*ppos), n)) {
+		kfree (tmpbuf);
+		return -EFAULT;
+	}
+	kfree (tmpbuf);
 	*ppos += n;
 	return n;
 }
@@ -323,12 +355,18 @@
 static ssize_t ppc_rtas_clock_write(struct file * file, const char * buf, 
 		size_t count, loff_t *ppos)
 {
+	char stkbuf[40];  /* its small, its on stack */
 	struct rtc_time tm;
 	unsigned long nowtime;
 	char *dest;
 	int error;
 
-	nowtime = simple_strtoul(buf, &dest, 10);
+	if (39 < count) count = 39;
+	if (copy_from_user (stkbuf, buf, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+	nowtime = simple_strtoul(stkbuf, &dest, 10);
 	if (*dest != '\0' && *dest != '\n') {
 		printk("ppc_rtas_clock_write: Invalid time\n");
 		return count;
@@ -356,21 +394,27 @@
 	year = ret[0]; mon  = ret[1]; day  = ret[2];
 	hour = ret[3]; min  = ret[4]; sec  = ret[5];
 
+	char stkbuf[40];  /* its small, its on stack */
+
 	if (error != 0){
 		printk(KERN_WARNING "error: reading the clock returned: %s\n", 
 				ppc_rtas_process_error(error));
-		n = sprintf (buf, "0");
+		n = snprintf (stkbuf, 40, "0");
 	} else { 
-		n = sprintf (buf, "%lu\n", mktime(year, mon, day, hour, min, sec));
+		n = snprintf (stkbuf, 40, "%lu\n", mktime(year, mon, day, hour, min, sec));
 	}
 	kfree(ret);
 
-	if (*ppos >= strlen(buf))
+	int sn = strlen (stkbuf) +1;
+	if (*ppos >= sn)
 		return 0;
-	if (n > strlen(buf) - *ppos)
-		n = strlen(buf) - *ppos;
+	if (n > sn - *ppos)
+		n = sn - *ppos;
 	if (n > count)
 		n = count;
+	if (copy_to_user (buf, stkbuf + (*ppos), n)) {
+		return -EFAULT;
+	}
 	*ppos += n;
 	return n;
 }
@@ -764,7 +808,7 @@
 		n += check_location_string(ret, buffer + n);
 		n += sprintf ( buffer+n, " ");
 		/* see how many characters we have printed */
-		sprintf ( t, "%s ", ret);
+		snprintf ( t, 50, "%s ", ret);
 
 		pos += strlen(t);
 		if (pos >= llen) pos=0;
@@ -777,10 +821,17 @@
 static ssize_t ppc_rtas_tone_freq_write(struct file * file, const char * buf,
 		size_t count, loff_t *ppos)
 {
+	char stkbuf[40];  /* its small, its on stack */
 	unsigned long freq;
 	char *dest;
 	int error;
-	freq = simple_strtoul(buf, &dest, 10);
+
+	if (39 < count) count = 39;
+	if (copy_from_user (stkbuf, buf, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+	freq = simple_strtoul(stkbuf, &dest, 10);
 	if (*dest != '\0' && *dest != '\n') {
 		printk("ppc_rtas_tone_freq_write: Invalid tone freqency\n");
 		return count;
@@ -799,14 +850,19 @@
 		size_t count, loff_t *ppos)
 {
 	int n;
-	n = sprintf(buf, "%lu\n", rtas_tone_frequency);
+	char stkbuf[40];  /* its small, its on stack */
+	n = snprintf(stkbuf, 40, "%lu\n", rtas_tone_frequency);
 
-	if (*ppos >= strlen(buf))
+	int sn = strlen (stkbuf) +1;
+	if (*ppos >= sn)
 		return 0;
-	if (n > strlen(buf) - *ppos)
-		n = strlen(buf) - *ppos;
+	if (n > sn - *ppos)
+		n = sn - *ppos;
 	if (n > count)
 		n = count;
+	if (copy_to_user (buf, stkbuf + (*ppos), n)) {
+		return -EFAULT;
+	}
 	*ppos += n;
 	return n;
 }
@@ -816,10 +872,17 @@
 static ssize_t ppc_rtas_tone_volume_write(struct file * file, const char * buf,
 		size_t count, loff_t *ppos)
 {
+	char stkbuf[40];  /* its small, its on stack */
 	unsigned long volume;
 	char *dest;
 	int error;
-	volume = simple_strtoul(buf, &dest, 10);
+
+	if (39 < count) count = 39;
+	if (copy_from_user (stkbuf, buf, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+	volume = simple_strtoul(stkbuf, &dest, 10);
 	if (*dest != '\0' && *dest != '\n') {
 		printk("ppc_rtas_tone_volume_write: Invalid tone volume\n");
 		return count;
@@ -840,14 +903,19 @@
 		size_t count, loff_t *ppos)
 {
 	int n;
-	n = sprintf(buf, "%lu\n", rtas_tone_volume);
+	char stkbuf[40];  /* its small, its on stack */
+	n = snprintf(stkbuf, 40, "%lu\n", rtas_tone_volume);
 
-	if (*ppos >= strlen(buf))
+	int sn = strlen (stkbuf) +1;
+	if (*ppos >= sn)
 		return 0;
-	if (n > strlen(buf) - *ppos)
-		n = strlen(buf) - *ppos;
+	if (n > sn - *ppos)
+		n = sn - *ppos;
 	if (n > count)
 		n = count;
+	if (copy_to_user (buf, stkbuf + (*ppos), n)) {
+		return -EFAULT;
+	}
 	*ppos += n;
 	return n;
 }
diff -Nru a/arch/ppc64/kernel/scanlog.c b/arch/ppc64/kernel/scanlog.c
--- a/arch/ppc64/kernel/scanlog.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc64/kernel/scanlog.c	Thu Jan  8 23:00:24 2004
@@ -135,17 +135,24 @@
 static ssize_t scanlog_write(struct file * file, const char * buf,
 			     size_t count, loff_t *ppos)
 {
+	char stkbuf[20];
 	unsigned long status;
 
+	if (count > 19) count = 19;
+	if (copy_from_user (stkbuf, buf, count)) {
+		return -EFAULT;
+	}
+	stkbuf[count] = 0;
+
 	if (buf) {
-		if (strncmp(buf, "reset", 5) == 0) {
+		if (strncmp(stkbuf, "reset", 5) == 0) {
 			DEBUG("reset scanlog\n");
 			status = rtas_call(ibm_scan_log_dump, 2, 1, NULL, NULL, 0);
 			DEBUG("rtas returns %ld\n", status);
-		} else if (strncmp(buf, "debugon", 7) == 0) {
+		} else if (strncmp(stkbuf, "debugon", 7) == 0) {
 			printk(KERN_ERR "scanlog: debug on\n");
 			scanlog_debug = 1;
-		} else if (strncmp(buf, "debugoff", 8) == 0) {
+		} else if (strncmp(stkbuf, "debugoff", 8) == 0) {
 			printk(KERN_ERR "scanlog: debug off\n");
 			scanlog_debug = 0;
 		}
diff -Nru a/arch/ppc64/mm/hugetlbpage.c b/arch/ppc64/mm/hugetlbpage.c
--- a/arch/ppc64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
+++ b/arch/ppc64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
@@ -921,7 +921,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int unused)
+				unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
diff -Nru a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
--- a/arch/s390/kernel/compat_wrapper.S	Thu Jan  8 23:00:24 2004
+++ b/arch/s390/kernel/compat_wrapper.S	Thu Jan  8 23:00:24 2004
@@ -5,6 +5,7 @@
 *  S390 version
 *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
 *    Author(s): Gerhard Tonn (ton@de.ibm.com),
+*               Thomas Spatzier (tspat@de.ibm.com)
 */ 
 
 	.globl  sys32_exit_wrapper 
@@ -1230,3 +1231,37 @@
 	lgfr	%r4,%r4			# int
 	lgfr	%r5,%r5			# int
 	jg	sys_epoll_wait		# branch to system call
+
+	.globl	sys32_io_setup_wrapper
+sys32_io_setup_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# u32 *
+	jg	compat_sys_io_setup
+
+	.globl	sys32_io_destroy_wrapper
+sys32_io_destroy_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	jg	sys_io_destroy
+
+	.globl	sys32_io_getevents_wrapper
+sys32_io_getevents_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	lgfr	%r3,%r3			# long
+	lgfr	%r4,%r4			# long
+	llgtr	%r5,%r5			# struct io_event *
+	llgtr	%r6,%r6			# struct compat_timespec *
+	jg	compat_sys_io_getevents
+
+	.globl	sys32_io_submit_wrapper
+sys32_io_submit_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	lgfr	%r3,%r3			# long
+	llgtr	%r4,%r4			# struct iocb **
+	jg	compat_sys_io_submit
+
+	.globl	sys32_io_cancel_wrapper
+sys32_io_cancel_wrapper:
+	llgfr	%r2,%r2			# (aio_context_t) u32
+	llgtr	%r3,%r3			# struct iocb *
+	llgtr	%r4,%r4			# struct io_event *
+	jg	sys_io_cancel
diff -Nru a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
--- a/arch/s390/kernel/setup.c	Thu Jan  8 23:00:23 2004
+++ b/arch/s390/kernel/setup.c	Thu Jan  8 23:00:23 2004
@@ -617,17 +617,17 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-        int i, j;
+        int i = *(loff_t *) v, j;
 	
-        seq_puts(p, "           ");
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 	
-        for (j=0; j<NR_CPUS; j++)
-                if (cpu_online(j))
-                        seq_printf(p, "CPU%d       ",j);
-	
-        seq_putc(p, '\n');
-	
-        for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		seq_printf(p, "%s: ", intrclass_names[i]);
 #ifndef CONFIG_SMP
 		seq_printf(p, "%10u ", kstat_irqs(i));
diff -Nru a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
--- a/arch/s390/kernel/syscalls.S	Thu Jan  8 23:00:23 2004
+++ b/arch/s390/kernel/syscalls.S	Thu Jan  8 23:00:23 2004
@@ -251,11 +251,11 @@
 SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper)	/* 240 */
 SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill)
 NI_SYSCALL							/* reserved for TUX */
-SYSCALL(sys_io_setup,sys_io_setup,sys_ni_syscall)
-SYSCALL(sys_io_destroy,sys_io_destroy,sys_ni_syscall)
-SYSCALL(sys_io_getevents,sys_io_getevents,sys_ni_syscall)	/* 245 */
-SYSCALL(sys_io_submit,sys_io_submit,sys_ni_syscall)
-SYSCALL(sys_io_cancel,sys_io_cancel,sys_ni_syscall)
+SYSCALL(sys_io_setup,sys_io_setup,sys32_io_setup_wrapper)
+SYSCALL(sys_io_destroy,sys_io_destroy,sys32_io_destroy_wrapper)
+SYSCALL(sys_io_getevents,sys_io_getevents,sys32_io_getevents_wrapper)	/* 245 */
+SYSCALL(sys_io_submit,sys_io_submit,sys32_io_submit_wrapper)
+SYSCALL(sys_io_cancel,sys_io_cancel,sys32_io_cancel_wrapper)
 SYSCALL(sys_exit_group,sys_exit_group,sys32_exit_group_wrapper)
 SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
 SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper)	/* 250 */
diff -Nru a/arch/sh/Kconfig b/arch/sh/Kconfig
--- a/arch/sh/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/sh/Kconfig	Thu Jan  8 23:00:24 2004
@@ -1053,7 +1053,7 @@
 	  implementation entirely in software (which can sometimes fail to
 	  reboot the machine) and a driver for hardware watchdog boards, which
 	  are more robust and can also keep track of the temperature inside
-	  your computer. For details, read <file:Documentation/watchdog.txt>
+	  your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
 	  in the kernel source.
 
 	  The watchdog is usually used together with the watchdog daemon
diff -Nru a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c
--- a/arch/sh/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sh/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -93,17 +93,19 @@
 #if defined(CONFIG_PROC_FS)
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-			seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < ACTUAL_NR_IRQS ; i++) {
+	if (i < ACTUAL_NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action)
diff -Nru a/arch/sparc/Kconfig b/arch/sparc/Kconfig
--- a/arch/sparc/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/Kconfig	Thu Jan  8 23:00:23 2004
@@ -300,138 +300,7 @@
 source "drivers/sbus/char/Kconfig"
 endif
 
-
-menu "Block devices"
-
-config BLK_DEV_FD
-	bool "Normal floppy disk support"
-	---help---
-	  If you want to use the floppy disk drive(s) of your PC under Linux,
-	  say Y. Information about this driver, especially important for IBM
-	  Thinkpad users, is contained in <file:Documentation/floppy.txt>.
-	  That file also contains the location of the Floppy driver FAQ as
-	  well as location of the fdutils package used to configure additional
-	  parameters of the driver at run time.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called floppy.
-
-config BLK_DEV_LOOP
-	tristate "Loopback device support"
-	---help---
-	  Saying Y here will allow you to use a regular file as a block
-	  device; you can then create a file system on that block device and
-	  mount it just as you would mount other block devices such as hard
-	  drive partitions, CD-ROM drives or floppy drives. The loop devices
-	  are block special device files with major number 7 and typically
-	  called /dev/loop0, /dev/loop1 etc.
-
-	  This is useful if you want to check an ISO 9660 file system before
-	  burning the CD, or if you want to use floppy images without first
-	  writing them to floppy. Furthermore, some Linux distributions avoid
-	  the need for a dedicated Linux partition by keeping their complete
-	  root file system inside a DOS FAT file using this loop device
-	  driver.
-
-	  The loop device driver can also be used to "hide" a file system in a
-	  disk partition, floppy, or regular file, either using encryption
-	  (scrambling the data) or steganography (hiding the data in the low
-	  bits of, say, a sound file). This is also safe if the file resides
-	  on a remote file server. If you want to do this, you will first have
-	  to acquire and install a kernel patch from
-	  <ftp://ftp.kerneli.org/pub/kerneli/>, and then you need to
-	  say Y to this option.
-
-	  Note that alternative ways to use encrypted file systems are
-	  provided by the cfs package, which can be gotten from
-	  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>, and the newer tcfs
-	  package, available at <http://tcfs.dia.unisa.it/>. You do not need
-	  to say Y here if you want to use one of these. However, using cfs
-	  requires saying Y to "NFS file system support" below while using
-	  tcfs requires applying a kernel patch. An alternative steganography
-	  solution is provided by StegFS, also available from
-	  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>.
-
-	  To use the loop device, you need the losetup utility and a recent
-	  version of the mount program, both contained in the util-linux
-	  package. The location and current version number of util-linux is
-	  contained in the file <file:Documentation/Changes>.
-
-	  Note that this loop device has nothing to do with the loopback
-	  device used for network connections from the machine to itself.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called loop.
-
-	  Most users will answer N here.
-
-config BLK_DEV_NBD
-	tristate "Network block device support"
-	depends on NET
-	---help---
-	  Saying Y here will allow your computer to be a client for network
-	  block devices, i.e. it will be able to use block devices exported by
-	  servers (mount file systems on them etc.). Communication between
-	  client and server works over TCP/IP networking, but to the client
-	  program this is hidden: it looks like a regular local file access to
-	  a block device special file such as /dev/nd0.
-
-	  Network block devices also allows you to run a block-device in
-	  userland (making server and client physically the same computer,
-	  communicating using the loopback network device).
-
-	  Read <file:Documentation/nbd.txt> for more information, especially
-	  about where to find the server code, which runs in user space and
-	  does not need special kernel support.
-
-	  Note that this has nothing to do with the network file systems NFS
-	  or Coda; you can say N here even if you intend to use NFS or Coda.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called nbd.
-
-	  If unsure, say N.
-
-source "drivers/md/Kconfig"
-
-config BLK_DEV_RAM
-	tristate "RAM disk support"
-	---help---
-	  Saying Y here will allow you to use a portion of your RAM memory as
-	  a block device, so that you can make file systems on it, read and
-	  write to it and do all the other things that you can do with normal
-	  block devices (such as hard drives). It is usually used to load and
-	  store a copy of a minimal root file system off of a floppy into RAM
-	  during the initial install of Linux.
-
-	  Note that the kernel command line option "ramdisk=XX" is now
-	  obsolete. For details, read <file:Documentation/ramdisk.txt>.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called rd.
-
-	  Most normal users won't need the RAM disk functionality, and can
-	  thus say N here.
-
-config BLK_DEV_RAM_SIZE
-	int "Default RAM disk size"
-	depends on BLK_DEV_RAM
-	default "4096"
-	help
-	  The default value is 4096. Only change this if you know what are
-	  you doing. If you are using IBM S/390, then set this to 8192.
-
-config BLK_DEV_INITRD
-	bool "Initial RAM disk (initrd) support"
-	depends on BLK_DEV_RAM=y
-	help
-	  The initial RAM disk is a RAM disk that is loaded by the boot loader
-	  (loadlin or lilo) and that is mounted as root before the normal boot
-	  procedure. It is typically used to load modules needed to mount the
-	  "real" root file system, etc. See <file:Documentation/initrd.txt>
-	  for details.
-
-endmenu
+source "drivers/block/Kconfig"
 
 # Don't frighten a common SBus user
 if PCI
@@ -446,6 +315,8 @@
 
 source "drivers/fc4/Kconfig"
 
+source "drivers/md/Kconfig"
+
 source "net/Kconfig"
 
 # This one must be before the filesystem configs. -DaveM
@@ -539,6 +410,13 @@
 
 config DEBUG_SPINLOCK
 	bool "Spinlock debugging"
+
+config DEBUG_HIGHMEM
+	bool "Highmem debugging"
+	depends on DEBUG_KERNEL && HIGHMEM
+	help
+	  This options enables addition error checking for high memory systems.
+	  Disable for production systems.
 
 config DEBUG_SPINLOCK_SLEEP
 	bool "Sleep-inside-spinlock checking"
diff -Nru a/arch/sparc/Makefile b/arch/sparc/Makefile
--- a/arch/sparc/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/Makefile	Thu Jan  8 23:00:23 2004
@@ -49,7 +49,12 @@
 LIBS_Y1		:= $(patsubst %/, %/lib.a, $(libs-y))
 LIBS_Y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
 LIBS_Y		:= $(LIBS_Y1) $(LIBS_Y2)
-export INIT_Y CORE_Y DRIVERS_Y NET_Y LIBS_Y HEAD_Y
+
+ifdef CONFIG_KALLSYMS
+kallsyms.o := .tmp_kallsyms2.o
+endif
+
+export INIT_Y CORE_Y DRIVERS_Y NET_Y LIBS_Y HEAD_Y kallsyms.o
 
 # Default target
 all: image
diff -Nru a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile
--- a/arch/sparc/boot/Makefile	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/boot/Makefile	Thu Jan  8 23:00:24 2004
@@ -19,7 +19,7 @@
 
 BTOBJS := $(HEAD_Y) $(INIT_Y)
 BTLIBS := $(CORE_Y) $(LIBS_Y) $(DRIVERS_Y) $(NET_Y)
-LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.s $(BTOBJS) --start-group $(BTLIBS) --end-group
+LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.s $(BTOBJS) --start-group $(BTLIBS) --end-group $(kallsyms.o)
 
 # Actual linking
 $(obj)/image: $(obj)/btfix.o FORCE
diff -Nru a/arch/sparc/kernel/asm-offsets.c b/arch/sparc/kernel/asm-offsets.c
--- a/arch/sparc/kernel/asm-offsets.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/asm-offsets.c	Thu Jan  8 23:00:24 2004
@@ -38,12 +38,6 @@
 	DEFINE(AOFF_thread_fork_kpsr,
 			offsetof(struct thread_struct, fork_kpsr));
 	BLANK();
-	DEFINE(AOFF_thread_w_saved, offsetof(struct thread_struct, w_saved));
-	DEFINE(AOFF_thread_rwbuf_stkptrs,
-			offsetof(struct thread_struct, rwbuf_stkptrs));
-	DEFINE(AOFF_thread_reg_window,
-			offsetof(struct thread_struct, reg_window));
-	BLANK();
 	DEFINE(AOFF_mm_context, offsetof(struct mm_struct, context));
 
 	/* DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28); */
diff -Nru a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
--- a/arch/sparc/kernel/entry.S	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/entry.S	Thu Jan  8 23:00:24 2004
@@ -1907,9 +1907,8 @@
 	wr	%o5, 0x0, %psr			! re-enable interrupts
 	WRITE_PAUSE				! burn baby burn
 3:
-	ld	[%g6 + TI_TASK], %o4
 	retl					! return
-	 st	%g0, [%o4 + AOFF_task_thread + AOFF_thread_w_saved]	! no windows saved
+	 st	%g0, [%g6 + TI_W_SAVED]		! no windows saved
 
 	.align	4
 	.globl	C_LABEL(restore_current)
diff -Nru a/arch/sparc/kernel/etrap.S b/arch/sparc/kernel/etrap.S
--- a/arch/sparc/kernel/etrap.S	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/etrap.S	Thu Jan  8 23:00:24 2004
@@ -12,7 +12,6 @@
 #include <asm/page.h>
 #include <asm/psr.h>
 #include <asm/ptrace.h>
-#include <asm/asm_offsets.h>
 #include <asm/winmacro.h>
 #include <asm/asmmacro.h>
 #include <asm/thread_info.h>
@@ -57,7 +56,7 @@
 	 *
 	 * sethi	%hi(trap_setup), %l4
 	 * jmpl		%l4 + %lo(trap_setup), %l6
-	 * mov		1, %l4
+	 * nop
 	 */
 
 	/* 2 3 4  window number
@@ -156,9 +155,8 @@
 	and	%t_kstack, %curptr, %curptr
 #endif
 
-	/* Clear current->thread.w_saved */
-	ld	[%curptr + TI_TASK], %g2
-	st	%g0, [%g2 + AOFF_task_thread + AOFF_thread_w_saved]
+	/* Clear current_thread_info->w_saved */
+	st	%g0, [%curptr + TI_W_SAVED]
 
 	/* See if we are in the trap window. */
 	andcc	%t_twinmask, %t_wim, %g0
@@ -292,8 +290,7 @@
 	/* From user/kernel into invalid window w/bad user
 	 * stack. Save bad user stack, and return to caller.
 	 */
-	ld	[%curptr + TI_TASK], %glob_tmp
-	SAVE_BOLIXED_USER_STACK(glob_tmp, g3)
+	SAVE_BOLIXED_USER_STACK(curptr, g3)
 	restore	%g0, %g0, %g0
 
 	jmpl	%t_retpc + 0x8, %g0
diff -Nru a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c
--- a/arch/sparc/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -102,7 +102,7 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 #ifdef CONFIG_SMP
@@ -114,7 +114,7 @@
 		
 		return show_sun4d_interrupts(p, v);
 	}
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		local_irq_save(flags);
 	        action = *(i + irq_action);
 		if (!action) 
diff -Nru a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
--- a/arch/sparc/kernel/process.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/kernel/process.c	Thu Jan  8 23:00:23 2004
@@ -16,6 +16,7 @@
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
+#include <linux/kallsyms.h>
 #include <linux/mm.h>
 #include <linux/stddef.h>
 #include <linux/unistd.h>
@@ -207,11 +208,12 @@
         while(rw && (((unsigned long) rw) >= PAGE_OFFSET) &&
             !(((unsigned long) rw) & 0x7)) {
 		printk("CPU[%d]: ARGS[%08lx,%08lx,%08lx,%08lx,%08lx,%08lx] "
-		       "FP[%08lx] CALLER[%08lx]\n", cpu,
+		       "FP[%08lx] CALLER[%08lx]: ", cpu,
 		       rw->ins[0], rw->ins[1], rw->ins[2], rw->ins[3],
 		       rw->ins[4], rw->ins[5],
 		       rw->ins[6],
 		       rw->ins[7]);
+		print_symbol("%s\n", rw->ins[7]);
 		rw = (struct reg_window *) rw->ins[6];
 	}
 	spin_unlock_irqrestore(&sparc_backtrace_lock, flags);
@@ -279,12 +281,14 @@
 
         printk("PSR: %08lx PC: %08lx NPC: %08lx Y: %08lx    %s\n",
 	       r->psr, r->pc, r->npc, r->y, print_tainted());
+	print_symbol("PC: <%s>\n", r->pc);
 	printk("%%G: %08lx %08lx  %08lx %08lx  %08lx %08lx  %08lx %08lx\n",
 	       r->u_regs[0], r->u_regs[1], r->u_regs[2], r->u_regs[3],
 	       r->u_regs[4], r->u_regs[5], r->u_regs[6], r->u_regs[7]);
 	printk("%%O: %08lx %08lx  %08lx %08lx  %08lx %08lx  %08lx %08lx\n",
 	       r->u_regs[8], r->u_regs[9], r->u_regs[10], r->u_regs[11],
 	       r->u_regs[12], r->u_regs[13], r->u_regs[14], r->u_regs[15]);
+	print_symbol("RPC: <%s>\n", r->u_regs[15]);
 
 	printk("%%L: %08lx %08lx  %08lx %08lx  %08lx %08lx  %08lx %08lx\n",
 	       rw->locals[0], rw->locals[1], rw->locals[2], rw->locals[3],
@@ -318,7 +322,8 @@
 			break;
 		rw = (struct reg_window *) fp;
 		pc = rw->ins[7];
-		printk("[%08lx] ", pc);
+		printk("[%08lx : ", pc);
+		print_symbol("%s ] ", pc);
 		fp = rw->ins[6];
 	} while (++count < 16);
 	printk("\n");
@@ -356,7 +361,7 @@
 
 void flush_thread(void)
 {
-	current->thread.w_saved = 0;
+	current_thread_info()->w_saved = 0;
 
 	/* No new signal delivery by default */
 	current->thread.new_signal = 0;
@@ -489,9 +494,6 @@
 	ti->kpc = (((unsigned long) ret_from_fork) - 0x8);
 	ti->kpsr = current->thread.fork_kpsr | PSR_PIL;
 	ti->kwim = current->thread.fork_kwim;
-
-	/* This is used for sun4c only */
-	atomic_set(&p->thread.refcount, 1);
 
 	if(regs->psr & PSR_PS) {
 		extern struct pt_regs fake_swapper_regs;
diff -Nru a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c
--- a/arch/sparc/kernel/ptrace.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/ptrace.c	Thu Jan  8 23:00:24 2004
@@ -72,7 +72,7 @@
 				   struct task_struct *tsk, long *addr)
 {
 	struct pt_regs *cregs = tsk->thread.kregs;
-	struct thread_struct *t = &tsk->thread;
+	struct thread_info *t = tsk->thread_info;
 	int v;
 	
 	if(offset >= 1024)
@@ -93,16 +93,16 @@
 	}
 	switch(offset) {
 	case 0:
-		v = tsk->thread_info->ksp;
+		v = t->ksp;
 		break;
 	case 4:
-		v = tsk->thread_info->kpc;
+		v = t->kpc;
 		break;
 	case 8:
-		v = tsk->thread_info->kpsr;
+		v = t->kpsr;
 		break;
 	case 12:
-		v = tsk->thread_info->uwinmask;
+		v = t->uwinmask;
 		break;
 	case 832:
 		v = t->w_saved;
@@ -167,7 +167,7 @@
 				    struct task_struct *tsk)
 {
 	struct pt_regs *cregs = tsk->thread.kregs;
-	struct thread_struct *t = &tsk->thread;
+	struct thread_info *t = tsk->thread_info;
 	unsigned long value = regs->u_regs[UREG_I3];
 
 	if(offset >= 1024)
diff -Nru a/arch/sparc/kernel/rtrap.S b/arch/sparc/kernel/rtrap.S
--- a/arch/sparc/kernel/rtrap.S	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/rtrap.S	Thu Jan  8 23:00:24 2004
@@ -7,7 +7,6 @@
 #include <asm/cprefix.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
-#include <asm/asm_offsets.h>
 #include <asm/psr.h>
 #include <asm/asi.h>
 #include <asm/smp.h>
@@ -87,8 +86,7 @@
 	wr	%t_psr, 0x0, %psr
 	WRITE_PAUSE
 
-	ld	[%curptr + TI_TASK], %o5
-	ld	[%o5 + AOFF_task_thread + AOFF_thread_w_saved], %twin_tmp1
+	ld	[%curptr + TI_W_SAVED], %twin_tmp1
 	orcc	%g0, %twin_tmp1, %g0
 	be	ret_trap_nobufwins
 	 nop
diff -Nru a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
--- a/arch/sparc/kernel/setup.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/kernel/setup.c	Thu Jan  8 23:00:23 2004
@@ -105,8 +105,6 @@
 #define BOOTME_DEBUG  0x1
 #define BOOTME_SINGLE 0x2
 
-static int console_fb __initdata = 0;
-
 /* Exported for mm/init.c:paging_init. */
 unsigned long cmdline_memory_size __initdata = 0;
 
@@ -160,6 +158,31 @@
 	}
 }
 
+static void __init process_console(char *commands)
+{
+	serial_console = 0;
+	commands += 8;
+	/* Linux-style serial */
+	if (!strncmp(commands, "ttyS", 4))
+		serial_console = simple_strtoul(commands + 4, NULL, 10) + 1;
+	else if (!strncmp(commands, "tty", 3)) {
+		char c = *(commands + 3);
+		/* Solaris-style serial */
+		if (c == 'a' || c == 'b')
+			serial_console = c - 'a' + 1;
+		/* else Linux-style fbcon, not serial */
+	}
+#if defined(CONFIG_PROM_CONSOLE)
+	if (!strncmp(commands, "prom", 4)) {
+		char *p;
+
+		for (p = commands - 8; *p && *p != ' '; p++)
+			*p = ' ';
+		conswitchp = &prom_con;
+	}
+#endif
+}
+
 static void __init boot_flags_init(char *commands)
 {
 	while (*commands) {
@@ -174,37 +197,27 @@
 			commands++;
 			while (*commands && *commands != ' ')
 				process_switch(*commands++);
-		} else {
-			if (!strncmp(commands, "console=", 8)) {
-				commands += 8;
-#if defined(CONFIG_PROM_CONSOLE)
-				if (!strncmp (commands, "prom", 4)) {
-					char *p;
-					
-					for (p = commands - 8; *p && *p != ' '; p++)
-						*p = ' ';
-					conswitchp = &prom_con;
-					console_fb = 1;
-				}
-#endif
-			} else if (!strncmp(commands, "mem=", 4)) {
-				/*
-				 * "mem=XXX[kKmM] overrides the PROM-reported
-				 * memory size.
-				 */
-				cmdline_memory_size = simple_strtoul(commands + 4,
-							     &commands, 0);
-				if (*commands == 'K' || *commands == 'k') {
-					cmdline_memory_size <<= 10;
-					commands++;
-				} else if (*commands=='M' || *commands=='m') {
-					cmdline_memory_size <<= 20;
-					commands++;
-				}
-			}
-			while (*commands && *commands != ' ')
+			continue;
+		}
+		if (!strncmp(commands, "console=", 8)) {
+			process_console(commands);
+		} else if (!strncmp(commands, "mem=", 4)) {
+			/*
+			 * "mem=XXX[kKmM] overrides the PROM-reported
+			 * memory size.
+			 */
+			cmdline_memory_size = simple_strtoul(commands + 4,
+						     &commands, 0);
+			if (*commands == 'K' || *commands == 'k') {
+				cmdline_memory_size <<= 10;
+				commands++;
+			} else if (*commands=='M' || *commands=='m') {
+				cmdline_memory_size <<= 20;
 				commands++;
+			}
 		}
+		while (*commands && *commands != ' ')
+			commands++;
 	}
 }
 
@@ -330,34 +343,6 @@
 
 	prom_setsync(prom_sync_me);
 
-#ifndef CONFIG_SERIAL_CONSOLE	/* Not CONFIG_SERIAL_SUNCORE: to be gone. */
-	serial_console = 0;
-#else
-	if (console_fb != 0) {
-		serial_console = 0;
-	} else {
-		int idev = prom_query_input_device();
-		int odev = prom_query_output_device();
-		if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
-			serial_console = 0;
-		} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
-			serial_console = 1;
-		} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
-			serial_console = 2;
-		} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
-			prom_printf("MrCoffee ttya\n");
-			serial_console = 1;
-		} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
-			serial_console = 0;
-			prom_printf("MrCoffee keyboard\n");
-		} else {
-			prom_printf("Confusing console (idev %d, odev %d)\n",
-			    idev, odev);
-			serial_console = 1;
-		}
-	}
-#endif
-
 	if((boot_flags&BOOTME_DEBUG) && (linux_dbvec!=0) && 
 	   ((*(short *)linux_dbvec) != -1)) {
 		printk("Booted under KADB. Syncing trap table.\n");
@@ -370,6 +355,41 @@
 	paging_init();
 }
 
+static int __init set_preferred_console(void)
+{
+	int idev, odev;
+
+	/* The user has requested a console so this is already set up. */
+	if (serial_console >= 0)
+		return -EBUSY;
+
+	idev = prom_query_input_device();
+	odev = prom_query_output_device();
+	if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
+		serial_console = 0;
+	} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
+		serial_console = 1;
+	} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
+		serial_console = 2;
+	} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
+		prom_printf("MrCoffee ttya\n");
+		serial_console = 1;
+	} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
+		serial_console = 0;
+		prom_printf("MrCoffee keyboard\n");
+	} else {
+		prom_printf("Confusing console (idev %d, odev %d)\n",
+		    idev, odev);
+		serial_console = 1;
+	}
+
+	if (serial_console)
+		return add_preferred_console("ttyS", serial_console - 1, NULL);
+
+	return -ENODEV;
+}
+console_initcall(set_preferred_console);
+
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on)
 {
 	return -EIO;
@@ -458,5 +478,5 @@
 	prom_cmdline();
 }
 
-int serial_console;
+int serial_console = -1;
 int stop_a_enabled = 1;
diff -Nru a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c
--- a/arch/sparc/kernel/signal.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/signal.c	Thu Jan  8 23:00:24 2004
@@ -432,6 +432,7 @@
 	int window = 0, err;
 	unsigned long pc = regs->pc;
 	unsigned long npc = regs->npc;
+	struct thread_info *tp = current_thread_info();
 	void *sig_address;
 	int sig_code;
 
@@ -459,20 +460,20 @@
 	err |= __put_user(regs->psr, &sc->sigc_psr);
 	err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
 	err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
-	err |= __put_user(current->thread.w_saved, &sc->sigc_oswins);
-	if (current->thread.w_saved)
-		for (window = 0; window < current->thread.w_saved; window++) {
-			put_user((char *)current->thread.rwbuf_stkptrs[window],
+	err |= __put_user(tp->w_saved, &sc->sigc_oswins);
+	if (tp->w_saved)
+		for (window = 0; window < tp->w_saved; window++) {
+			put_user((char *)tp->rwbuf_stkptrs[window],
 				 &sc->sigc_spbuf[window]);
 			err |= __copy_to_user(&sc->sigc_wbuf[window],
-					      &current->thread.reg_window[window],
+					      &tp->reg_window[window],
 					      sizeof(struct reg_window));
 		}
 	else
 		err |= __copy_to_user(sframep, (char *) regs->u_regs[UREG_FP],
 				      sizeof(struct reg_window));
 
-	current->thread.w_saved = 0; /* So process is allowed to execute. */
+	tp->w_saved = 0; /* So process is allowed to execute. */
 
 	err |= __put_user(signr, &sframep->sig_num);
 	sig_address = NULL;
@@ -601,7 +602,7 @@
 	if (invalid_frame_pointer(sf, sigframe_size))
 		goto sigill_and_return;
 
-	if (current->thread.w_saved != 0)
+	if (current_thread_info()->w_saved != 0)
 		goto sigill_and_return;
 
 	/* 2. Save the current process state */
@@ -675,7 +676,7 @@
 		get_sigframe(&ka->sa, regs, sigframe_size);
 	if (invalid_frame_pointer(sf, sigframe_size))
 		goto sigill;
-	if (current->thread.w_saved != 0)
+	if (current_thread_info()->w_saved != 0)
 		goto sigill;
 
 	err  = __put_user(regs->pc, &sf->regs.pc);
@@ -752,6 +753,7 @@
 	svr4_gwindows_t __user *gw;
 	svr4_ucontext_t __user *uc;
 	svr4_sigset_t	setv;
+	struct thread_info *tp = current_thread_info();
 	int window = 0, err;
 
 	synchronize_user_stack();
@@ -808,7 +810,7 @@
 	err |= __put_user(gw, &mc->gwin);
 	    
 	/* 2. Number of windows to restore at setcontext(): */
-	err |= __put_user(current->thread.w_saved, &gw->count);
+	err |= __put_user(tp->w_saved, &gw->count);
 
 	/* 3. Save each valid window
 	 *    Currently, it makes a copy of the windows from the kernel copy.
@@ -821,16 +823,16 @@
 	 *    These windows are just used in case synchronize_user_stack failed
 	 *    to flush the user windows.
 	 */
-	for (window = 0; window < current->thread.w_saved; window++) {
+	for (window = 0; window < tp->w_saved; window++) {
 		err |= __put_user((int *) &(gw->win[window]), &gw->winptr[window]);
 		err |= __copy_to_user(&gw->win[window],
-				      &current->thread.reg_window[window],
+				      &tp->reg_window[window],
 				      sizeof(svr4_rwindow_t));
 		err |= __put_user(0, gw->winptr[window]);
 	}
 
 	/* 4. We just pay attention to the gw->count field on setcontext */
-	current->thread.w_saved = 0; /* So process is allowed to execute. */
+	tp->w_saved = 0; /* So process is allowed to execute. */
 
 	/* Setup the signal information.  Solaris expects a bunch of
 	 * information to be passed to the signal handler, we don't provide
@@ -878,7 +880,7 @@
 
 	synchronize_user_stack();
 
-	if (current->thread.w_saved)
+	if (current_thread_info()->w_saved)
 		goto sigsegv_and_return;
 
 	err = clear_user(uc, sizeof(*uc));
@@ -928,7 +930,6 @@
 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
 asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
 {
-	struct thread_struct *tp = &current->thread;
 	svr4_gregset_t  __user *gr;
 	unsigned long pc, npc, psr;
 	sigset_t set;
@@ -940,8 +941,8 @@
 	 * svr4_setup_frame when sync_user_windows is done?
 	 */
 	flush_user_windows();
-	
-	if (tp->w_saved)
+
+	if (current_thread_info()->w_saved)
 		goto sigsegv_and_return;
 
 	if (((uint) c) & 3)
diff -Nru a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c
--- a/arch/sparc/kernel/sun4d_irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/kernel/sun4d_irq.c	Thu Jan  8 23:00:23 2004
@@ -75,25 +75,25 @@
 
 int show_sun4d_interrupts(struct seq_file *p, void *v)
 {
-	int i, j = 0, k = 0, sbusl;
+	int i = *(loff_t *) v, j = 0, k = 0, sbusl;
 	struct irqaction * action;
 #ifdef CONFIG_SMP
 	int x;
 #endif
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		sbusl = pil_to_sbus[i];
 		if (!sbusl) {
 	 		action = *(i + irq_action);
 			if (!action) 
-		        	continue;
+		        	goto out;
 		} else {
 			for (j = 0; j < nsbi; j++) {
 				for (k = 0; k < 4; k++)
 					if ((action = sbus_actions [(j << 5) + (sbusl << 2) + k].action))
 						goto found_it;
 			}
-			continue;
+			goto out;
 		}
 found_it:	seq_printf(p, "%3d: ", i);
 #ifndef CONFIG_SMP
@@ -128,6 +128,7 @@
 		}
 		seq_putc(p, '\n');
 	}
+out:
 	return 0;
 }
 
diff -Nru a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c
--- a/arch/sparc/kernel/traps.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/traps.c	Thu Jan  8 23:00:24 2004
@@ -12,6 +12,7 @@
 #include <linux/config.h>
 #include <linux/sched.h>  /* for jiffies */
 #include <linux/kernel.h>
+#include <linux/kallsyms.h>
 #include <linux/signal.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
@@ -118,7 +119,9 @@
 		      count++ < 30				&&
                       (((unsigned long) rw) >= PAGE_OFFSET)	&&
 		      !(((unsigned long) rw) & 0x7)) {
-			printk("Caller[%08lx]\n", rw->ins[7]);
+			printk("Caller[%08lx]", rw->ins[7]);
+			print_symbol(": %s\n", rw->ins[7]);
+			printk("\n");
 			rw = (struct reg_window *)rw->ins[6];
 		}
 	}
@@ -497,7 +500,10 @@
 	    TI_KSP         != offsetof(struct thread_info, ksp) ||
 	    TI_KPC         != offsetof(struct thread_info, kpc) ||
 	    TI_KPSR        != offsetof(struct thread_info, kpsr) ||
-	    TI_KWIM        != offsetof(struct thread_info, kwim))
+	    TI_KWIM        != offsetof(struct thread_info, kwim) ||
+	    TI_REG_WINDOW  != offsetof(struct thread_info, reg_window) ||
+	    TI_RWIN_SPTRS  != offsetof(struct thread_info, rwbuf_stkptrs) ||
+	    TI_W_SAVED     != offsetof(struct thread_info, w_saved))
 		thread_info_offsets_are_bolixed_pete();
 
 	/* Attach to the address space of init_task. */
diff -Nru a/arch/sparc/kernel/windows.c b/arch/sparc/kernel/windows.c
--- a/arch/sparc/kernel/windows.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/windows.c	Thu Jan  8 23:00:24 2004
@@ -36,7 +36,7 @@
 	: "g4", "cc");
 }
 
-static inline void shift_window_buffer(int first_win, int last_win, struct thread_struct *tp)
+static inline void shift_window_buffer(int first_win, int last_win, struct thread_info *tp)
 {
 	int i;
 
@@ -57,11 +57,10 @@
  */
 void synchronize_user_stack(void)
 {
-	struct thread_struct *tp;
+	struct thread_info *tp = current_thread_info();
 	int window;
 
 	flush_user_windows();
-	tp = &current->thread;
 	if(!tp->w_saved)
 		return;
 
@@ -110,12 +109,11 @@
 
 void try_to_clear_window_buffer(struct pt_regs *regs, int who)
 {
-	struct thread_struct *tp;
+	struct thread_info *tp = current_thread_info();
 	int window;
 
 	lock_kernel();
 	flush_user_windows();
-	tp = &current->thread;
 	for(window = 0; window < tp->w_saved; window++) {
 		unsigned long sp = tp->rwbuf_stkptrs[window];
 
diff -Nru a/arch/sparc/kernel/wof.S b/arch/sparc/kernel/wof.S
--- a/arch/sparc/kernel/wof.S	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/kernel/wof.S	Thu Jan  8 23:00:24 2004
@@ -8,7 +8,6 @@
 #include <asm/contregs.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
-#include <asm/asm_offsets.h>
 #include <asm/psr.h>
 #include <asm/smp.h>
 #include <asm/asi.h>
@@ -211,20 +210,18 @@
 	bne	spwin_bad_ustack_from_kernel
 	 nop
 
-	ld	[%curptr + TI_TASK], %glob_tmp
-
 	/* Oh well, throw this one window into the per-task window
 	 * buffer, the first one.
 	 */
-	st	%sp, [%glob_tmp + AOFF_task_thread + AOFF_thread_rwbuf_stkptrs]
-	STORE_WINDOW(glob_tmp + AOFF_task_thread + AOFF_thread_reg_window)
+	st	%sp, [%curptr + TI_RWIN_SPTRS]
+	STORE_WINDOW(curptr + TI_REG_WINDOW)
 	restore	%g0, %g0, %g0
 
 	/* LOCATION: Trap Window */
 
 	/* Back in the trap window, update winbuffer save count. */
 	mov	1, %twin_tmp
-	st	%twin_tmp, [%glob_tmp + AOFF_task_thread + AOFF_thread_w_saved]
+	st	%twin_tmp, [%curptr + TI_W_SAVED]
 
 		/* Compute new user window mask.  What we are basically
 		 * doing is taking two windows, the invalid one at trap
@@ -275,8 +272,7 @@
 	 * a per-process window buffer until we can properly handle
 	 * this later on.
 	 */
-	ld	[%curptr + TI_TASK], %glob_tmp	/* Using curptr one last time */
-	SAVE_BOLIXED_USER_STACK(glob_tmp, g6)	/* ...now using g6 as scratch */
+	SAVE_BOLIXED_USER_STACK(curptr, glob_tmp)
 	restore	%g0, %g0, %g0
 
 	/* LOCATION: Trap window */
diff -Nru a/arch/sparc/kernel/wuf.S b/arch/sparc/kernel/wuf.S
--- a/arch/sparc/kernel/wuf.S	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/kernel/wuf.S	Thu Jan  8 23:00:23 2004
@@ -8,7 +8,6 @@
 #include <asm/contregs.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
-#include <asm/asm_offsets.h>
 #include <asm/psr.h>
 #include <asm/smp.h>
 #include <asm/asi.h>
@@ -187,8 +186,7 @@
 	mov	0x1, %g5
 	sll	%g5, %g3, %g5
 	st	%g5, [%curptr + TI_UWINMASK]		! one live user window still
-	ld	[%curptr + TI_TASK], %g5
-	st	%g0, [%g5 + AOFF_task_thread + AOFF_thread_w_saved]		! no windows in the buffer
+	st	%g0, [%curptr + TI_W_SAVED]		! no windows in the buffer
 
 	wr	%t_psr, PSR_ET, %psr			! enable traps
 	nop
diff -Nru a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c
--- a/arch/sparc/mm/fault.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/mm/fault.c	Thu Jan  8 23:00:23 2004
@@ -36,7 +36,7 @@
 
 #define ELEMENTS(arr) (sizeof (arr)/sizeof (arr[0]))
 
-extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
+extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1];
 extern int prom_node_root;
 
 /* At boot time we determine these two values necessary for setting
@@ -72,7 +72,7 @@
 		mlist = mlist->theres_more;
 		bytes = mlist->num_bytes;
 		tally += bytes;
-		if (i >= SPARC_PHYS_BANKS-1) {
+		if (i > SPARC_PHYS_BANKS-1) {
 			printk ("The machine has more banks than "
 				"this kernel can support\n"
 				"Increase the SPARC_PHYS_BANKS "
@@ -422,6 +422,12 @@
 		}
 	}
 
+	if (!mm) {
+		/* We are oopsing. */
+		do_sparc_fault(regs, text_fault, write, address);
+		BUG();	/* P3 Oops already, you bitch */
+	}
+
 	pgdp = pgd_offset(mm, address);
 	ptep = sun4c_pte_offset_kernel((pmd_t *) pgdp, address);
 
@@ -544,7 +550,7 @@
 {
 	unsigned long sp;
 
-	sp = current->thread.rwbuf_stkptrs[0];
+	sp = current_thread_info()->rwbuf_stkptrs[0];
 	if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
 		force_user_fault(sp + 0x38, 1);
 	force_user_fault(sp, 1);
diff -Nru a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c
--- a/arch/sparc/mm/highmem.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc/mm/highmem.c	Thu Jan  8 23:00:23 2004
@@ -27,18 +27,20 @@
 #include <asm/pgalloc.h>
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
+#include <asm/fixmap.h>
 
 void *kmap_atomic(struct page *page, enum km_type type)
 {
 	unsigned long idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
 
 	idx = type + KM_TYPE_NR*smp_processor_id();
-	vaddr = fix_kmap_begin + idx * PAGE_SIZE;
+	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 
 /* XXX Fix - Anton */
 #if 0
@@ -47,11 +49,10 @@
 	flush_cache_all();
 #endif
 
-#if HIGHMEM_DEBUG
-	if (!pte_none(*(kmap_pte+idx)))
-		BUG();
+#ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(!pte_none(*(kmap_pte-idx)));
 #endif
-	set_pte(kmap_pte+idx, mk_pte(page, kmap_prot));
+	set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
 /* XXX Fix - Anton */
 #if 0
 	__flush_tlb_one(vaddr);
@@ -64,16 +65,17 @@
 
 void kunmap_atomic(void *kvaddr, enum km_type type)
 {
-	unsigned long vaddr = (unsigned long) kvaddr;
+#ifdef CONFIG_DEBUG_HIGHMEM
+	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	unsigned long idx = type + KM_TYPE_NR*smp_processor_id();
 
-	if (vaddr < fix_kmap_begin) { // FIXME
+	if (vaddr < FIXADDR_START) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
-	if (vaddr != fix_kmap_begin + idx * PAGE_SIZE)
-		BUG();
+	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
 
 /* XXX Fix - Anton */
 #if 0
@@ -82,12 +84,11 @@
 	flush_cache_all();
 #endif
 
-#ifdef HIGHMEM_DEBUG
 	/*
 	 * force other mappings to Oops if they'll try to access
 	 * this pte without first remap it
 	 */
-	pte_clear(kmap_pte+idx);
+	pte_clear(kmap_pte-idx);
 /* XXX Fix - Anton */
 #if 0
 	__flush_tlb_one(vaddr);
@@ -95,5 +96,25 @@
 	flush_tlb_all();
 #endif
 #endif
+
 	dec_preempt_count();
+	preempt_check_resched();
+}
+
+/* We may be fed a pagetable here by ptep_to_xxx and others. */
+struct page *kmap_atomic_to_page(void *ptr)
+{
+	unsigned long idx, vaddr = (unsigned long)ptr;
+	pte_t *pte;
+
+	if (vaddr < SRMMU_NOCACHE_VADDR)
+		return virt_to_page(ptr);
+	if (vaddr < PKMAP_BASE)
+		return pfn_to_page(__nocache_pa(vaddr) >> PAGE_SHIFT);
+	BUG_ON(vaddr < FIXADDR_START);
+	BUG_ON(vaddr > FIXADDR_TOP);
+
+	idx = virt_to_fix(vaddr);
+	pte = kmap_pte - (idx - FIX_KMAP_BEGIN);
+	return pte_page(*pte);
 }
diff -Nru a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c
--- a/arch/sparc/mm/init.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/mm/init.c	Thu Jan  8 23:00:24 2004
@@ -41,7 +41,7 @@
 
 unsigned long page_kernel;
 
-struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
+struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1];
 unsigned long sparc_unmapped_base;
 
 struct pgtable_cache_struct pgt_quicklists;
@@ -61,17 +61,13 @@
 EXPORT_SYMBOL(kmap_prot);
 EXPORT_SYMBOL(kmap_pte);
 
-/* These are set in {srmmu,sun4c}_paging_init() */
-unsigned long fix_kmap_begin;
-unsigned long fix_kmap_end;
-
-#define kmap_get_fixed_pte(vaddr) \
+#define kmap_get_fixmap_pte(vaddr) \
 	pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr))
 
 void __init kmap_init(void)
 {
 	/* cache the first kmap pte */
-	kmap_pte = kmap_get_fixed_pte(fix_kmap_begin);
+	kmap_pte = kmap_get_fixmap_pte(__fix_to_virt(FIX_KMAP_BEGIN));
 	kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE);
 }
 
@@ -209,7 +205,8 @@
 	if (max_low_pfn > (SRMMU_MAXMEM >> PAGE_SHIFT)) {
 		highstart_pfn = (SRMMU_MAXMEM >> PAGE_SHIFT);
 		max_low_pfn = calc_max_low_pfn();
-		printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", calc_highpages());
+		printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
+		    calc_highpages() >> (20 - PAGE_SHIFT));
 	}
 
 #ifdef CONFIG_BLK_DEV_INITRD
@@ -384,12 +381,12 @@
 {
 	unsigned long tmp;
 
-#ifdef DEBUG_HIGHMEM
+#ifdef CONFIG_DEBUG_HIGHMEM
 	printk("mapping high region %08lx - %08lx\n", start_pfn, end_pfn);
 #endif
 
 	for (tmp = start_pfn; tmp < end_pfn; tmp++) {
-		struct page *page = mem_map + tmp;
+		struct page *page = pfn_to_page(tmp);
 
 		ClearPageReserved(page);
 		set_bit(PG_highmem, &page->flags);
@@ -406,7 +403,18 @@
 	int initpages = 0; 
 	int i;
 
-	highmem_start_page = mem_map + highstart_pfn;
+	highmem_start_page = pfn_to_page(highstart_pfn);
+
+	if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
+		prom_printf("BUG: fixmap and pkmap areas overlap\n");
+		prom_printf("pkbase: 0x%lx pkend: 0x%lx fixstart 0x%lx\n",
+		       PKMAP_BASE,
+		       (unsigned long)PKMAP_BASE+LAST_PKMAP*PAGE_SIZE,
+		       FIXADDR_START);
+		prom_printf("Please mail sparclinux@vger.kernel.org.\n");
+		prom_halt();
+	}
+
 
 	/* Saves us work later. */
 	memset((void *)&empty_zero_page, 0, PAGE_SIZE);
diff -Nru a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
--- a/arch/sparc/mm/io-unit.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/mm/io-unit.c	Thu Jan  8 23:00:24 2004
@@ -65,7 +65,7 @@
 	
 	for (xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t);
 	     xpt < xptend;)
-	     	*xpt++ = 0;
+	     	iopte_val(*xpt++) = 0;
 }
 
 /* One has to hold iounit->lock to call this */
@@ -199,7 +199,7 @@
 			pmdp = pmd_offset(pgdp, addr);
 			ptep = pte_offset_map(pmdp, addr);
 
-			set_pte(ptep, pte_val(mk_pte(virt_to_page(page), dvma_prot)));
+			set_pte(ptep, mk_pte(virt_to_page(page), dvma_prot));
 			
 			i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT);
 
@@ -207,7 +207,7 @@
 				struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
 
 				iopte = (iopte_t *)(iounit->page_table + i);
-				*iopte = __iopte(MKIOPTE(__pa(page)));
+				*iopte = MKIOPTE(__pa(page));
 			}
 		}
 		addr += PAGE_SIZE;
diff -Nru a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c
--- a/arch/sparc/mm/iommu.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/mm/iommu.c	Thu Jan  8 23:00:24 2004
@@ -405,7 +405,7 @@
 	iopte_t *iopte = iommu->page_table;
 
 	iopte += ((busa - iommu->start) >> PAGE_SHIFT);
-	return pfn_to_page((pte_val(*iopte) & IOPTE_PAGE) >> (PAGE_SHIFT-4));
+	return pfn_to_page((iopte_val(*iopte) & IOPTE_PAGE) >> (PAGE_SHIFT-4));
 }
 #endif
 
diff -Nru a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
--- a/arch/sparc/mm/srmmu.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/mm/srmmu.c	Thu Jan  8 23:00:24 2004
@@ -139,10 +139,6 @@
 /* these will be initialized in srmmu_nocache_calcsize() */
 unsigned long srmmu_nocache_size;
 unsigned long srmmu_nocache_end;
-unsigned long pkmap_base;
-unsigned long pkmap_base_end;
-extern unsigned long fix_kmap_begin;
-extern unsigned long fix_kmap_end;
 
 /* 1 bit <=> 256 bytes of nocache <=> 64 PTEs */
 #define SRMMU_NOCACHE_BITMAP_SHIFT (PAGE_SHIFT - 4)
@@ -154,11 +150,6 @@
 void *srmmu_nocache_bitmap;
 static struct bit_map srmmu_nocache_map;
 
-/* This makes sense. Honest it does - Anton */
-#define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool))
-#define __nocache_va(PADDR) (__va((unsigned long)PADDR) - (unsigned long)srmmu_nocache_pool + SRMMU_NOCACHE_VADDR)
-#define __nocache_fix(VADDR) __va(__nocache_pa(VADDR))
-
 static unsigned long srmmu_pte_pfn(pte_t pte)
 {
 	if (srmmu_device_memory(pte_val(pte))) {
@@ -322,10 +313,7 @@
 		printk("Size 0x%x unaligned int nocache request\n", size);
 		size += SRMMU_NOCACHE_BITMAP_SHIFT-1;
 	}
-	if (align > SRMMU_NOCACHE_ALIGN_MAX) {
-		BUG();
-		return 0;
-	}
+	BUG_ON(align > SRMMU_NOCACHE_ALIGN_MAX);
 
 	offset = bit_map_string_get(&srmmu_nocache_map,
 		       			size >> SRMMU_NOCACHE_BITMAP_SHIFT,
@@ -361,7 +349,7 @@
 		    vaddr, (unsigned long)SRMMU_NOCACHE_VADDR);
 		BUG();
 	}
-	if (vaddr >= srmmu_nocache_end) {
+	if (vaddr+size >= srmmu_nocache_end) {
 		printk("Vaddr %lx is bigger than nocache end 0x%lx\n",
 		    vaddr, srmmu_nocache_end);
 		BUG();
@@ -403,17 +391,15 @@
 
  /* P3 XXX The 4x overuse: corroborated by /proc/meminfo. */
 	// if (srmmu_nocache_npages < 256) srmmu_nocache_npages = 256;
-	if (srmmu_nocache_npages < 550) srmmu_nocache_npages = 550;
+	if (srmmu_nocache_npages < SRMMU_MIN_NOCACHE_PAGES)
+		srmmu_nocache_npages = SRMMU_MIN_NOCACHE_PAGES;
 
 	/* anything above 1280 blows up */
-	if (srmmu_nocache_npages > 1280) srmmu_nocache_npages = 1280;
+	if (srmmu_nocache_npages > SRMMU_MAX_NOCACHE_PAGES)
+		srmmu_nocache_npages = SRMMU_MAX_NOCACHE_PAGES;
 
 	srmmu_nocache_size = srmmu_nocache_npages * PAGE_SIZE;
 	srmmu_nocache_end = SRMMU_NOCACHE_VADDR + srmmu_nocache_size;
-	fix_kmap_begin = srmmu_nocache_end;
-	fix_kmap_end = fix_kmap_begin + (KM_TYPE_NR * NR_CPUS - 1) * PAGE_SIZE;
-	pkmap_base = SRMMU_NOCACHE_VADDR + srmmu_nocache_size + 0x40000;
-	pkmap_base_end = pkmap_base + LAST_PKMAP * PAGE_SIZE;
 }
 
 void srmmu_nocache_init(void)
@@ -453,7 +439,7 @@
 		if (srmmu_cache_pagetables)
 			pteval |= SRMMU_CACHE;
 
-		srmmu_set_pte(__nocache_fix(pte), pteval);
+		srmmu_set_pte(__nocache_fix(pte), __pte(pteval));
 
 		vaddr += PAGE_SIZE;
 		paddr += PAGE_SIZE;
@@ -1083,6 +1069,8 @@
 			memset(__nocache_fix(ptep), 0, SRMMU_PTE_SZ_SOFT);
 			srmmu_pmd_set(__nocache_fix(pmdp), ptep);
 		}
+		if (start > (0xffffffffUL - SRMMU_PMD_SIZE_SOFT))
+			break;
 		start = (start + SRMMU_PMD_SIZE) & SRMMU_PMD_MASK;
 	}
 }
@@ -1111,6 +1099,8 @@
 			memset(ptep, 0, SRMMU_PTE_SZ_SOFT);
 			srmmu_pmd_set(pmdp, ptep);
 		}
+		if (start > (0xffffffffUL - SRMMU_PMD_SIZE_SOFT))
+			break;
 		start = (start + SRMMU_PMD_SIZE) & SRMMU_PMD_MASK;
 	}
 }
@@ -1315,12 +1305,13 @@
 	srmmu_allocate_ptable_skeleton(DVMA_VADDR, DVMA_END);
 #endif
 
-	srmmu_allocate_ptable_skeleton(fix_kmap_begin, fix_kmap_end);
-	srmmu_allocate_ptable_skeleton(pkmap_base, pkmap_base_end);
-
-	pgd = pgd_offset_k(pkmap_base);
-	pmd = srmmu_pmd_offset(pgd, pkmap_base);
-	pte = srmmu_pte_offset(pmd, pkmap_base);
+	srmmu_allocate_ptable_skeleton(
+		__fix_to_virt(__end_of_fixed_addresses - 1), FIXADDR_TOP);
+	srmmu_allocate_ptable_skeleton(PKMAP_BASE, PKMAP_END);
+
+	pgd = pgd_offset_k(PKMAP_BASE);
+	pmd = srmmu_pmd_offset(pgd, PKMAP_BASE);
+	pte = srmmu_pte_offset(pmd, PKMAP_BASE);
 	pkmap_page_table = pte;
 
 	flush_cache_all();
diff -Nru a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c
--- a/arch/sparc/mm/sun4c.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc/mm/sun4c.c	Thu Jan  8 23:00:24 2004
@@ -1067,23 +1067,21 @@
 	unsigned long pages = BUCKET_PTE_PAGE(sun4c_get_pte(tiaddr));
 	int entry = BUCKET_NUM(tiaddr);
 
-	if (atomic_dec_and_test(&ti->task->thread.refcount)) {
-		/* We are deleting a mapping, so the flush here is mandatory. */
-		sun4c_flush_page(tiaddr);
+	/* We are deleting a mapping, so the flush here is mandatory. */
+	sun4c_flush_page(tiaddr);
 #ifndef CONFIG_SUN4	
-		sun4c_flush_page(tiaddr + PAGE_SIZE);
+	sun4c_flush_page(tiaddr + PAGE_SIZE);
 #endif
-		sun4c_put_pte(tiaddr, 0);
+	sun4c_put_pte(tiaddr, 0);
 #ifndef CONFIG_SUN4	
-		sun4c_put_pte(tiaddr + PAGE_SIZE, 0);
+	sun4c_put_pte(tiaddr + PAGE_SIZE, 0);
 #endif
-		sun4c_bucket[entry] = BUCKET_EMPTY;
-		if (entry < sun4c_lowbucket_avail)
-			sun4c_lowbucket_avail = entry;
+	sun4c_bucket[entry] = BUCKET_EMPTY;
+	if (entry < sun4c_lowbucket_avail)
+		sun4c_lowbucket_avail = entry;
 
-		free_pages(pages, THREAD_INFO_ORDER);
-		garbage_collect(entry);
-	}
+	free_pages(pages, THREAD_INFO_ORDER);
+	garbage_collect(entry);
 }
 
 static void __init sun4c_init_buckets(void)
@@ -2030,18 +2028,12 @@
 extern unsigned long bootmem_init(unsigned long *pages_avail);
 extern unsigned long last_valid_pfn;
 
-extern unsigned long fix_kmap_begin;
-extern unsigned long fix_kmap_end;
-
 void __init sun4c_paging_init(void)
 {
 	int i, cnt;
 	unsigned long kernel_end, vaddr;
 	extern struct resource sparc_iomap;
 	unsigned long end_pfn, pages_avail;
-
-	fix_kmap_begin = KERNBASE + SRMMU_MAXMEM; /* Why bother with SRMMU_MAXMEM? */
-	fix_kmap_end = fix_kmap_begin + ((KM_TYPE_NR*NR_CPUS)-1)*PAGE_SIZE;
 
 	kernel_end = (unsigned long) &end;
 	kernel_end += (SUN4C_REAL_PGDIR_SIZE * 4);
diff -Nru a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
--- a/arch/sparc64/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc64/Kconfig	Thu Jan  8 23:00:24 2004
@@ -501,139 +501,7 @@
 
 source "drivers/mtd/Kconfig"
 
-
-menu "Block devices"
-
-config BLK_DEV_FD
-	bool "Normal floppy disk support"
-	---help---
-	  If you want to use the floppy disk drive(s) of your PC under Linux,
-	  say Y. Information about this driver, especially important for IBM
-	  Thinkpad users, is contained in <file:Documentation/floppy.txt>.
-	  That file also contains the location of the Floppy driver FAQ as
-	  well as location of the fdutils package used to configure additional
-	  parameters of the driver at run time.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called floppy.
-
-config BLK_DEV_LOOP
-	tristate "Loopback device support"
-	---help---
-	  Saying Y here will allow you to use a regular file as a block
-	  device; you can then create a file system on that block device and
-	  mount it just as you would mount other block devices such as hard
-	  drive partitions, CD-ROM drives or floppy drives. The loop devices
-	  are block special device files with major number 7 and typically
-	  called /dev/loop0, /dev/loop1 etc.
-
-	  This is useful if you want to check an ISO 9660 file system before
-	  burning the CD, or if you want to use floppy images without first
-	  writing them to floppy. Furthermore, some Linux distributions avoid
-	  the need for a dedicated Linux partition by keeping their complete
-	  root file system inside a DOS FAT file using this loop device
-	  driver.
-
-	  The loop device driver can also be used to "hide" a file system in a
-	  disk partition, floppy, or regular file, either using encryption
-	  (scrambling the data) or steganography (hiding the data in the low
-	  bits of, say, a sound file). This is also safe if the file resides
-	  on a remote file server. If you want to do this, you will first have
-	  to acquire and install a kernel patch from
-	  <ftp://ftp.kerneli.org/pub/kerneli/>, and then you need to
-	  say Y to this option.
-
-	  Note that alternative ways to use encrypted file systems are
-	  provided by the cfs package, which can be gotten from
-	  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>, and the newer tcfs
-	  package, available at <http://tcfs.dia.unisa.it/>. You do not need
-	  to say Y here if you want to use one of these. However, using cfs
-	  requires saying Y to "NFS file system support" below while using
-	  tcfs requires applying a kernel patch. An alternative steganography
-	  solution is provided by StegFS, also available from
-	  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>.
-
-	  To use the loop device, you need the losetup utility and a recent
-	  version of the mount program, both contained in the util-linux
-	  package. The location and current version number of util-linux is
-	  contained in the file <file:Documentation/Changes>.
-
-	  Note that this loop device has nothing to do with the loopback
-	  device used for network connections from the machine to itself.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called loop.
-
-	  Most users will answer N here.
-
-config BLK_DEV_NBD
-	tristate "Network block device support"
-	depends on NET
-	---help---
-	  Saying Y here will allow your computer to be a client for network
-	  block devices, i.e. it will be able to use block devices exported by
-	  servers (mount file systems on them etc.). Communication between
-	  client and server works over TCP/IP networking, but to the client
-	  program this is hidden: it looks like a regular local file access to
-	  a block device special file such as /dev/nd0.
-
-	  Network block devices also allows you to run a block-device in
-	  userland (making server and client physically the same computer,
-	  communicating using the loopback network device).
-
-	  Read <file:Documentation/nbd.txt> for more information, especially
-	  about where to find the server code, which runs in user space and
-	  does not need special kernel support.
-
-	  Note that this has nothing to do with the network file systems NFS
-	  or Coda; you can say N here even if you intend to use NFS or Coda.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called nbd.
-
-	  If unsure, say N.
-
-source "drivers/md/Kconfig"
-
-config BLK_DEV_RAM
-	tristate "RAM disk support"
-	---help---
-	  Saying Y here will allow you to use a portion of your RAM memory as
-	  a block device, so that you can make file systems on it, read and
-	  write to it and do all the other things that you can do with normal
-	  block devices (such as hard drives). It is usually used to load and
-	  store a copy of a minimal root file system off of a floppy into RAM
-	  during the initial install of Linux.
-
-	  Note that the kernel command line option "ramdisk=XX" is now
-	  obsolete. For details, read <file:Documentation/ramdisk.txt>.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called rd.
-
-	  Most normal users won't need the RAM disk functionality, and can
-	  thus say N here.
-
-config BLK_DEV_RAM_SIZE
-	int "Default RAM disk size"
-	depends on BLK_DEV_RAM
-	default "4096"
-	help
-	  The default value is 4096. Only change this if you know what are
-	  you doing. If you are using IBM S/390, then set this to 8192.
-
-config BLK_DEV_INITRD
-	bool "Initial RAM disk (initrd) support"
-	depends on BLK_DEV_RAM=y
-	help
-	  The initial RAM disk is a RAM disk that is loaded by the boot loader
-	  (loadlin or lilo) and that is mounted as root before the normal boot
-	  procedure. It is typically used to load modules needed to mount the
-	  "real" root file system, etc. See <file:Documentation/initrd.txt>
-	  for details.
-
-endmenu
-
+source "drivers/block/Kconfig"
 
 source "drivers/ide/Kconfig"
 
@@ -641,6 +509,8 @@
 
 source "drivers/fc4/Kconfig"
 
+source "drivers/md/Kconfig"
+
 if PCI
 source "drivers/message/fusion/Kconfig"
 endif
@@ -808,16 +678,9 @@
 	  best used in conjunction with the NMI watchdog so that spinlock
 	  deadlocks are also debuggable.
 
-# We have a custom atomic_dec_and_lock() implementation but it's not
-# compatible with spinlock debugging so we need to fall back on
-# the generic version in that case.
-config HAVE_DEC_LOCK
-	bool
-	depends on SMP && !DEBUG_SPINLOCK
-	default y
-
 config DEBUG_SPINLOCK_SLEEP
 	bool "Sleep-inside-spinlock checking"
+	depends DEBUG_KERNEL
 	help
 	  If you say Y here, various routines which may sleep will become very
 	  noisy if they are called with a spinlock held.	
@@ -844,7 +707,16 @@
 	  If you don't debug the kernel, you can say N.
 	  
 config STACK_DEBUG
+	depends on DEBUG_KERNEL
 	bool "Stack Overflow Detection Support"
+
+# We have a custom atomic_dec_and_lock() implementation but it's not
+# compatible with spinlock debugging so we need to fall back on
+# the generic version in that case.
+config HAVE_DEC_LOCK
+	bool
+	depends on SMP && !DEBUG_SPINLOCK
+	default y
 
 config MCOUNT
 	bool
diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig
--- a/arch/sparc64/defconfig	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc64/defconfig	Thu Jan  8 23:00:23 2004
@@ -27,6 +27,7 @@
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
 # Loadable module support
@@ -138,7 +139,6 @@
 #
 # Console display driver support
 #
-# CONFIG_VGA_CONSOLE is not set
 # CONFIG_MDA_CONSOLE is not set
 # CONFIG_PROM_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
@@ -198,22 +198,16 @@
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
 CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=m
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID5=m
-CONFIG_MD_MULTIPATH=m
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_IOCTL_V4 is not set
 # CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -243,7 +237,6 @@
 # CONFIG_BLK_DEV_GENERIC is not set
 CONFIG_BLK_DEV_OPTI621=m
 CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDE_TCQ is not set
 # CONFIG_BLK_DEV_IDEDMA_FORCED is not set
 CONFIG_IDEDMA_PCI_AUTO=y
 CONFIG_IDEDMA_ONLYDISK=y
@@ -347,6 +340,8 @@
 # CONFIG_SCSI_QLOGIC_1280 is not set
 CONFIG_SCSI_QLOGICPTI=m
 CONFIG_SCSI_DC395x=m
+CONFIG_SCSI_DC390T=m
+# CONFIG_SCSI_DC390T_NOGENSUPP is not set
 # CONFIG_SCSI_NSP32 is not set
 CONFIG_SCSI_DEBUG=m
 CONFIG_SCSI_SUNESP=y
@@ -369,6 +364,19 @@
 CONFIG_SCSI_FCAL=m
 
 #
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_IOCTL_V4 is not set
+
+#
 # Fusion MPT device support
 #
 CONFIG_FUSION=m
@@ -1009,7 +1017,6 @@
 # CONFIG_KEYBOARD_NEWTON is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_PS2_SYNAPTICS is not set
 CONFIG_MOUSE_SERIAL=y
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
@@ -1060,6 +1067,7 @@
 CONFIG_SENSORS_IT87=m
 CONFIG_SENSORS_LM75=m
 CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_VIA686A=m
 CONFIG_SENSORS_W83781D=m
@@ -1186,12 +1194,11 @@
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
 CONFIG_SUN_PARTITION=y
-CONFIG_SMB_NLS=y
-CONFIG_NLS=y
 
 #
 # Native Language Support
 #
+CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="iso8859-1"
 # CONFIG_NLS_CODEPAGE_437 is not set
 # CONFIG_NLS_CODEPAGE_737 is not set
@@ -1276,6 +1283,7 @@
 #
 # Supported Frontend Modules
 #
+CONFIG_DVB_TWINHAN_DST=m
 CONFIG_DVB_STV0299=m
 CONFIG_DVB_SP887X=m
 CONFIG_DVB_ALPS_TDLB7=m
@@ -1287,6 +1295,7 @@
 CONFIG_DVB_MT312=m
 CONFIG_DVB_VES1820=m
 CONFIG_DVB_VES1X93=m
+CONFIG_DVB_SP887X_FIRMWARE_FILE="/etc/dvb/sc_main.mc"
 
 #
 # Supported SAA7146 based PCI Adapters
@@ -1301,11 +1310,17 @@
 # Supported USB Adapters
 #
 # CONFIG_DVB_TTUSB_BUDGET is not set
+CONFIG_DVB_TTUSB_DEC=m
 
 #
 # Supported FlexCopII (B2C2) Adapters
 #
 CONFIG_DVB_B2C2_SKYSTAR=m
+
+#
+# Supported BT878 Adapters
+#
+CONFIG_DVB_BT8XX=m
 CONFIG_VIDEO_SAA7146=m
 CONFIG_VIDEO_SAA7146_VV=m
 CONFIG_VIDEO_VIDEOBUF=m
@@ -1465,6 +1480,7 @@
 # CONFIG_USB_PWC is not set
 # CONFIG_USB_SE401 is not set
 # CONFIG_USB_STV680 is not set
+CONFIG_USB_W9968CF=m
 
 #
 # USB Network adaptors
@@ -1508,7 +1524,6 @@
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
 CONFIG_USB_SERIAL_EMPEG=m
 CONFIG_USB_SERIAL_FTDI_SIO=m
@@ -1547,6 +1562,7 @@
 # CONFIG_USB_TIGL is not set
 CONFIG_USB_AUERSWALD=m
 CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
 # CONFIG_USB_BRLVGER is not set
 CONFIG_USB_LCD=m
 CONFIG_USB_SPEEDTOUCH=m
@@ -1571,12 +1587,12 @@
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
 # CONFIG_DEBUG_SPINLOCK is not set
-CONFIG_HAVE_DEC_LOCK=y
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_BUGVERBOSE is not set
 # CONFIG_DEBUG_DCFLUSH is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_STACK_DEBUG is not set
+CONFIG_HAVE_DEC_LOCK=y
 
 #
 # Security options
diff -Nru a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c
--- a/arch/sparc64/kernel/ebus.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc64/kernel/ebus.c	Thu Jan  8 23:00:23 2004
@@ -424,7 +424,8 @@
 
 static int __init child_regs_nonstandard(struct linux_ebus_device *dev)
 {
-	if (!strcmp(dev->prom_name, "i2c"))
+	if (!strcmp(dev->prom_name, "i2c") ||
+	    !strcmp(dev->prom_name, "SUNW,lombus"))
 		return 1;
 	return 0;
 }
diff -Nru a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
--- a/arch/sparc64/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc64/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -128,16 +128,16 @@
 int show_interrupts(struct seq_file *p, void *v)
 {
 	unsigned long flags;
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction *action;
 #ifdef CONFIG_SMP
 	int j;
 #endif
 
 	spin_lock_irqsave(&irq_action_lock, flags);
-	for (i = 0; i < (NR_IRQS + 1); i++) {
+	if (i <= NR_IRQS) {
 		if (!(action = *(i + irq_action)))
-			continue;
+			goto out_unlock;
 		seq_printf(p, "%3d: ", i);
 #ifndef CONFIG_SMP
 		seq_printf(p, "%10u ", kstat_irqs(i));
@@ -157,6 +157,7 @@
 		}
 		seq_putc(p, '\n');
 	}
+out_unlock:
 	spin_unlock_irqrestore(&irq_action_lock, flags);
 
 	return 0;
@@ -1204,11 +1205,17 @@
 {
 	struct ino_bucket *bp = ivector_table + (long)data;
 	struct irqaction *ap = bp->irq_info;
-	unsigned long mask = get_smpaff_in_irqaction(ap);
+	cpumask_t mask = get_smpaff_in_irqaction(ap);
+	int len;
+
+	if (cpus_empty(mask))
+		mask = cpu_online_map;
 
-	if (count < HEX_DIGITS+1)
+	len = cpumask_snprintf(page, count, mask);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%016lx\n", mask == 0 ? ~0UL : mask);
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static inline void set_intr_affinity(int irq, unsigned long hw_aff)
diff -Nru a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c
--- a/arch/sparc64/kernel/pci_sabre.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc64/kernel/pci_sabre.c	Thu Jan  8 23:00:24 2004
@@ -321,10 +321,7 @@
 static int sabre_read_pci_cfg(struct pci_bus *bus, unsigned int devfn,
 			      int where, int size, u32 *value)
 {
-	if (bus->number)
-		return __sabre_read_pci_cfg(bus, devfn, where, size, value);
-
-	if (sabre_out_of_range(devfn)) {
+	if (!bus->number && sabre_out_of_range(devfn)) {
 		switch (size) {
 		case 1:
 			*value = 0xff;
@@ -338,6 +335,15 @@
 		}
 		return PCIBIOS_SUCCESSFUL;
 	}
+
+	if (bus->number || PCI_SLOT(devfn))
+		return __sabre_read_pci_cfg(bus, devfn, where, size, value);
+
+	/* When accessing PCI config space of the PCI controller itself (bus
+	 * 0, device slot 0, function 0) there are restrictions.  Each
+	 * register must be accessed as it's natural size.  Thus, for example
+	 * the Vendor ID must be accessed as a 16-bit quantity.
+	 */
 
 	switch (size) {
 	case 1:
diff -Nru a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c
--- a/arch/sparc64/kernel/setup.c	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc64/kernel/setup.c	Thu Jan  8 23:00:23 2004
@@ -320,8 +320,6 @@
 #define BOOTME_DEBUG  0x1
 #define BOOTME_SINGLE 0x2
 
-static int console_fb __initdata = 0;
-
 /* Exported for mm/init.c:paging_init. */
 unsigned long cmdline_memory_size = 0;
 
@@ -374,6 +372,33 @@
 	}
 }
 
+static void __init process_console(char *commands)
+{
+	serial_console = 0;
+	commands += 8;
+	/* Linux-style serial */
+	if (!strncmp(commands, "ttyS", 4))
+		serial_console = simple_strtoul(commands + 4, NULL, 10) + 1;
+	else if (!strncmp(commands, "tty", 3)) {
+		char c = *(commands + 3);
+		/* Solaris-style serial */
+		if (c == 'a' || c == 'b') {
+			serial_console = c - 'a' + 1;
+			prom_printf ("Using /dev/tty%c as console.\n", c);
+		}
+		/* else Linux-style fbcon, not serial */
+	}
+#if defined(CONFIG_PROM_CONSOLE)
+	if (!strncmp(commands, "prom", 4)) {
+		char *p;
+
+		for (p = commands - 8; *p && *p != ' '; p++)
+			*p = ' ';
+		conswitchp = &prom_con;
+	}
+#endif
+}
+
 static void __init boot_flags_init(char *commands)
 {
 	while (*commands) {
@@ -384,49 +409,31 @@
 		/* Process any command switches, otherwise skip it. */
 		if (*commands == '\0')
 			break;
-		else if (*commands == '-') {
+		if (*commands == '-') {
 			commands++;
 			while (*commands && *commands != ' ')
 				process_switch(*commands++);
-		} else {
-			if (!strncmp(commands, "console=", 8)) {
-				commands += 8;
-				if (!strncmp (commands, "ttya", 4)) {
-					console_fb = 2;
-					prom_printf ("Using /dev/ttya as console.\n");
-				} else if (!strncmp (commands, "ttyb", 4)) {
-					console_fb = 3;
-					prom_printf ("Using /dev/ttyb as console.\n");
-#if defined(CONFIG_PROM_CONSOLE)
-				} else if (!strncmp (commands, "prom", 4)) {
-					char *p;
-					
-					for (p = commands - 8; *p && *p != ' '; p++)
-						*p = ' ';
-					conswitchp = &prom_con;
-					console_fb = 1;
-#endif
-				} else {
-					console_fb = 1;
-				}
-			} else if (!strncmp(commands, "mem=", 4)) {
-				/*
-				 * "mem=XXX[kKmM]" overrides the PROM-reported
-				 * memory size.
-				 */
-				cmdline_memory_size = simple_strtoul(commands + 4,
-								     &commands, 0);
-				if (*commands == 'K' || *commands == 'k') {
-					cmdline_memory_size <<= 10;
-					commands++;
-				} else if (*commands=='M' || *commands=='m') {
-					cmdline_memory_size <<= 20;
-					commands++;
-				}
-			}
-			while (*commands && *commands != ' ')
+			continue;
+		}
+		if (!strncmp(commands, "console=", 8)) {
+			process_console(commands);
+		} else if (!strncmp(commands, "mem=", 4)) {
+			/*
+			 * "mem=XXX[kKmM]" overrides the PROM-reported
+			 * memory size.
+			 */
+			cmdline_memory_size = simple_strtoul(commands + 4,
+							     &commands, 0);
+			if (*commands == 'K' || *commands == 'k') {
+				cmdline_memory_size <<= 10;
+				commands++;
+			} else if (*commands=='M' || *commands=='m') {
+				cmdline_memory_size <<= 20;
 				commands++;
+			}
 		}
+		while (*commands && *commands != ' ')
+			commands++;
 	}
 }
 
@@ -546,38 +553,38 @@
 	}
 #endif
 
-	switch (console_fb) {
-	case 0: /* Let's get our io devices from prom */
-		{
-			int idev = prom_query_input_device();
-			int odev = prom_query_output_device();
-			if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
-				serial_console = 0;
-			} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
-				serial_console = 1;
-			} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
-				serial_console = 2;
-			} else {
-				prom_printf("Inconsistent console: "
-					    "input %d, output %d\n",
-					    idev, odev);
-				prom_halt();
-			}
-		}
-		break;
-	case 1: /* Force one of the framebuffers as console */
+	paging_init();
+}
+
+static int __init set_preferred_console(void)
+{
+	int idev, odev;
+
+	/* The user has requested a console so this is already set up. */
+	if (serial_console >= 0)
+		return -EBUSY;
+
+	idev = prom_query_input_device();
+	odev = prom_query_output_device();
+	if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
 		serial_console = 0;
-		break;
-	case 2: /* Force ttya as console */
+	} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
 		serial_console = 1;
-		break;
-	case 3: /* Force ttyb as console */
+	} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
 		serial_console = 2;
-		break;
-	};
+	} else {
+		prom_printf("Inconsistent console: "
+			    "input %d, output %d\n",
+			    idev, odev);
+		prom_halt();
+	}
 
-	paging_init();
+	if (serial_console)
+		return add_preferred_console("ttyS", serial_console - 1, NULL);
+
+	return -ENODEV;
 }
+console_initcall(set_preferred_console);
 
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on)
 {
@@ -671,7 +678,7 @@
 	prom_cmdline();
 }
 
-int serial_console;
+int serial_console = -1;
 int stop_a_enabled = 1;
 
 static int __init topology_init(void)
diff -Nru a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
--- a/arch/sparc64/kernel/sparc64_ksyms.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc64/kernel/sparc64_ksyms.c	Thu Jan  8 23:00:24 2004
@@ -19,6 +19,7 @@
 #include <linux/pci.h>
 #include <linux/interrupt.h>
 #include <linux/fs_struct.h>
+#include <linux/fs.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
 #include <linux/percpu.h>
@@ -96,6 +97,7 @@
 extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
 extern long sparc32_open(const char * filename, int flags, int mode);
 extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space);
+extern long sys_close(unsigned int);
                 
 extern int __ashrdi3(int, int);
 
@@ -324,6 +326,7 @@
 EXPORT_SYMBOL(sys_ioctl);
 EXPORT_SYMBOL(compat_sys_ioctl);
 EXPORT_SYMBOL(sparc32_open);
+EXPORT_SYMBOL(sys_close);
 #endif
 
 /* Special internal versions of library functions. */
diff -Nru a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
--- a/arch/sparc64/kernel/systbls.S	Thu Jan  8 23:00:23 2004
+++ b/arch/sparc64/kernel/systbls.S	Thu Jan  8 23:00:23 2004
@@ -72,8 +72,8 @@
 /*250*/	.word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl
 	.word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep
 /*260*/	.word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun
-	.word sys_timer_delete, sys32_timer_create, sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
-/*270*/	.word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
+	.word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
+/*270*/	.word compat_sys_io_submit, sys_io_cancel, compat_sys_io_getevents, sys_ni_syscall
 
 	/* Now the 64-bit native Linux syscall table. */
 
diff -Nru a/arch/sparc64/mm/hugetlbpage.c b/arch/sparc64/mm/hugetlbpage.c
--- a/arch/sparc64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
+++ b/arch/sparc64/mm/hugetlbpage.c	Thu Jan  8 23:00:24 2004
@@ -504,7 +504,7 @@
  * this far.
  */
 static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				   unsigned long address, int unused)
+				   unsigned long address, int *unused)
 {
 	BUG();
 	return NULL;
diff -Nru a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c
--- a/arch/um/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/um/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -572,53 +572,14 @@
  */
 static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
-}
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	int i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int k, c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 16);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
+	len += sprintf(page + len, "\n");
+	return len;
 }
 
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
@@ -630,7 +591,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 #ifdef CONFIG_SMP
 	/*
@@ -652,19 +613,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len = 0;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-	tmp = *mask;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -674,7 +626,7 @@
 	cpumask_t *mask = (cpumask_t *)data, new_value;
 	unsigned long full_count = count, err;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/v850/kernel/irq.c b/arch/v850/kernel/irq.c
--- a/arch/v850/kernel/irq.c	Thu Jan  8 23:00:24 2004
+++ b/arch/v850/kernel/irq.c	Thu Jan  8 23:00:24 2004
@@ -81,16 +81,18 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i;
+	int i = *(loff_t *) v;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_puts(p, "           ");
-	for (i=0; i < 1 /*smp_num_cpus*/; i++)
-		seq_printf(p, "CPU%d       ", i);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_puts(p, "           ");
+		for (i=0; i < 1 /*smp_num_cpus*/; i++)
+			seq_printf(p, "CPU%d       ", i);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		int j, count, num;
 		const char *type_name = irq_desc[i].handler->typename;
 		spin_lock_irqsave(&irq_desc[j].lock, flags);
@@ -121,8 +123,8 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[j].lock, flags);
-	}
-	seq_printf(p, "ERR: %10lu\n", irq_err_count);
+	} else if (i == NR_IRQS)
+		seq_printf(p, "ERR: %10lu\n", irq_err_count);
 	return 0;
 }
 
diff -Nru a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig
--- a/arch/x86_64/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/Kconfig	Thu Jan  8 23:00:24 2004
@@ -314,7 +314,7 @@
 	  This option is close to getting stable. However there is still some
 	  absence of features.
 
-	  For more information take a look at Documentation/swsusp.txt.
+	  For more information take a look at Documentation/power/swsusp.txt.
 
 source "drivers/acpi/Kconfig"
 
@@ -333,6 +333,11 @@
 	depends on PCI
 	default y
 
+# the drivers/pci/msi.c code needs to be fixed first before enabling
+config PCI_USE_VECTOR
+	bool
+	default n
+
 source "drivers/pci/Kconfig"
 
 config HOTPLUG
@@ -371,6 +376,12 @@
 	  turn this on, unless you're 100% sure that you don't have any 32-bit programs
 	  left.
 
+config IA32_AOUT
+       bool "IA32 a.out support"
+       depends on IA32_EMULATION
+       help
+         Support old a.out binaries in the 32bit emulation.
+
 config COMPAT
 	bool
 	depends on IA32_EMULATION
@@ -505,6 +516,7 @@
 	 Normally you should say N.
 
 config IOMMU_DEBUG
+       depends on GART_IOMMU && DEBUG_KERNEL
        bool "Force IOMMU to on" 
        help
          Force the IOMMU to on even when you have less than 4GB of memory and add 
@@ -519,13 +531,6 @@
          Add a simple leak tracer to the IOMMU code. This is useful when you
 	 are debugging a buggy device driver that leaks IOMMU mappings.
        
-config MCE_DEBUG
-       bool "K8 Machine check debugging mode"
-       default y 
-       help
-         Turn on all Machine Check debugging for device driver problems.	  
-	 This can cause panics, but is useful to find device driver problems.
-
 #config X86_REMOTE_DEBUG
 #       bool "kgdb debugging stub"
 
diff -Nru a/arch/x86_64/boot/install.sh b/arch/x86_64/boot/install.sh
--- a/arch/x86_64/boot/install.sh	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/boot/install.sh	Thu Jan  8 23:00:23 2004
@@ -21,6 +21,7 @@
 
 # User may have a custom install script
 
+if [ -x ~/bin/installkernel ]; then exec ~/bin/installkernel "$@"; fi
 if [ -x /sbin/installkernel ]; then exec /sbin/installkernel "$@"; fi
 
 # Default install - same as make zlilo
diff -Nru a/arch/x86_64/defconfig b/arch/x86_64/defconfig
--- a/arch/x86_64/defconfig	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/defconfig	Thu Jan  8 23:00:24 2004
@@ -743,7 +743,7 @@
 # CONFIG_INIT_DEBUG is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_FRAME_POINTER is not set
-CONFIG_IOMMU_DEBUG=y
+# CONFIG_IOMMU_DEBUG is not set
 CONFIG_IOMMU_LEAK=y
 CONFIG_MCE_DEBUG=y
 
diff -Nru a/arch/x86_64/ia32/Makefile b/arch/x86_64/ia32/Makefile
--- a/arch/x86_64/ia32/Makefile	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/ia32/Makefile	Thu Jan  8 23:00:23 2004
@@ -6,6 +6,8 @@
 	ia32_signal.o tls32.o \
 	ia32_binfmt.o fpu32.o ptrace32.o ipc32.o syscall32.o
 
+obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
+
 $(obj)/syscall32.o: $(src)/syscall32.c $(obj)/vsyscall.so
 
 # Teach kbuild about targets
diff -Nru a/arch/x86_64/ia32/ia32_aout.c b/arch/x86_64/ia32/ia32_aout.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/x86_64/ia32/ia32_aout.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,506 @@
+/*
+ *  a.out loader for x86-64
+ *
+ *  Copyright (C) 1991, 1992, 1996  Linus Torvalds
+ *  Hacked together by Andi Kleen
+ */
+
+#include <linux/module.h>
+
+#include <linux/time.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/a.out.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/file.h>
+#include <linux/stat.h>
+#include <linux/fcntl.h>
+#include <linux/ptrace.h>
+#include <linux/user.h>
+#include <linux/slab.h>
+#include <linux/binfmts.h>
+#include <linux/personality.h>
+#include <linux/init.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/cacheflush.h>
+#include <asm/user32.h>
+
+#undef WARN_OLD
+
+extern int ia32_setup_arg_pages(struct linux_binprm *bprm);
+
+static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs);
+static int load_aout_library(struct file*);
+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file);
+
+/*
+ * fill in the user structure for a core dump..
+ */
+static void dump_thread32(struct pt_regs * regs, struct user32 * dump)
+{
+	u32 fs,gs;
+
+/* changed the size calculations - should hopefully work better. lbt */
+	dump->magic = CMAGIC;
+	dump->start_code = 0;
+	dump->start_stack = regs->rsp & ~(PAGE_SIZE - 1);
+	dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
+	dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
+	dump->u_dsize -= dump->u_tsize;
+	dump->u_ssize = 0;
+	dump->u_debugreg[0] = current->thread.debugreg0;  
+	dump->u_debugreg[1] = current->thread.debugreg1;  
+	dump->u_debugreg[2] = current->thread.debugreg2;  
+	dump->u_debugreg[3] = current->thread.debugreg3;  
+	dump->u_debugreg[4] = 0;  
+	dump->u_debugreg[5] = 0;  
+	dump->u_debugreg[6] = current->thread.debugreg6;  
+	dump->u_debugreg[7] = current->thread.debugreg7;  
+
+	if (dump->start_stack < 0xc0000000)
+		dump->u_ssize = ((unsigned long) (0xc0000000 - dump->start_stack)) >> PAGE_SHIFT;
+
+	dump->regs.ebx = regs->rbx;
+	dump->regs.ecx = regs->rcx;
+	dump->regs.edx = regs->rdx;
+	dump->regs.esi = regs->rsi;
+	dump->regs.edi = regs->rdi;
+	dump->regs.ebp = regs->rbp;
+	dump->regs.eax = regs->rax;
+	dump->regs.ds = current->thread.ds;
+	dump->regs.es = current->thread.es;
+	asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs;
+	asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; 
+	dump->regs.orig_eax = regs->orig_rax;
+	dump->regs.eip = regs->rip;
+	dump->regs.cs = regs->cs;
+	dump->regs.eflags = regs->eflags;
+	dump->regs.esp = regs->rsp;
+	dump->regs.ss = regs->ss;
+
+#if 1 /* FIXME */
+	dump->u_fpvalid = 0;
+#else
+	dump->u_fpvalid = dump_fpu (regs, &dump->i387);
+#endif
+}
+
+static struct linux_binfmt aout_format = {
+	.module		= THIS_MODULE,
+	.load_binary	= load_aout_binary,
+	.load_shlib	= load_aout_library,
+	.core_dump	= aout_core_dump,
+	.min_coredump	= PAGE_SIZE
+};
+
+static void set_brk(unsigned long start, unsigned long end)
+{
+	start = PAGE_ALIGN(start);
+	end = PAGE_ALIGN(end);
+	if (end <= start)
+		return;
+	do_brk(start, end - start);
+}
+
+/*
+ * These are the only things you should do on a core-file: use only these
+ * macros to write out all the necessary info.
+ */
+
+static int dump_write(struct file *file, const void *addr, int nr)
+{
+	return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
+}
+
+#define DUMP_WRITE(addr, nr)	\
+	if (!dump_write(file, (void *)(addr), (nr))) \
+		goto end_coredump;
+
+#define DUMP_SEEK(offset) \
+if (file->f_op->llseek) { \
+	if (file->f_op->llseek(file,(offset),0) != (offset)) \
+ 		goto end_coredump; \
+} else file->f_pos = (offset)
+
+/*
+ * Routine writes a core dump image in the current directory.
+ * Currently only a stub-function.
+ *
+ * Note that setuid/setgid files won't make a core-dump if the uid/gid
+ * changed due to the set[u|g]id. It's enforced by the "current->mm->dumpable"
+ * field, which also makes sure the core-dumps won't be recursive if the
+ * dumping of the process results in another error..
+ */
+
+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file)
+{
+	mm_segment_t fs;
+	int has_dumped = 0;
+	unsigned long dump_start, dump_size;
+	struct user32 dump;
+#       define START_DATA(u)	(u.u_tsize << PAGE_SHIFT)
+#       define START_STACK(u)   (u.start_stack)
+
+	fs = get_fs();
+	set_fs(KERNEL_DS);
+	has_dumped = 1;
+	current->flags |= PF_DUMPCORE;
+       	strncpy(dump.u_comm, current->comm, sizeof(current->comm));
+	dump.u_ar0 = (u32)(((unsigned long)(&dump.regs)) - ((unsigned long)(&dump)));
+	dump.signal = signr;
+	dump_thread32(regs, &dump);
+
+/* If the size of the dump file exceeds the rlimit, then see what would happen
+   if we wrote the stack, but not the data area.  */
+	if ((dump.u_dsize+dump.u_ssize+1) * PAGE_SIZE >
+	    current->rlim[RLIMIT_CORE].rlim_cur)
+		dump.u_dsize = 0;
+
+/* Make sure we have enough room to write the stack and data areas. */
+	if ((dump.u_ssize+1) * PAGE_SIZE >
+	    current->rlim[RLIMIT_CORE].rlim_cur)
+		dump.u_ssize = 0;
+
+/* make sure we actually have a data and stack area to dump */
+	set_fs(USER_DS);
+	if (verify_area(VERIFY_READ, (void *) (unsigned long)START_DATA(dump), dump.u_dsize << PAGE_SHIFT))
+		dump.u_dsize = 0;
+	if (verify_area(VERIFY_READ, (void *) (unsigned long)START_STACK(dump), dump.u_ssize << PAGE_SHIFT))
+		dump.u_ssize = 0;
+
+	set_fs(KERNEL_DS);
+/* struct user */
+	DUMP_WRITE(&dump,sizeof(dump));
+/* Now dump all of the user data.  Include malloced stuff as well */
+	DUMP_SEEK(PAGE_SIZE);
+/* now we start writing out the user space info */
+	set_fs(USER_DS);
+/* Dump the data area */
+	if (dump.u_dsize != 0) {
+		dump_start = START_DATA(dump);
+		dump_size = dump.u_dsize << PAGE_SHIFT;
+		DUMP_WRITE(dump_start,dump_size);
+	}
+/* Now prepare to dump the stack area */
+	if (dump.u_ssize != 0) {
+		dump_start = START_STACK(dump);
+		dump_size = dump.u_ssize << PAGE_SHIFT;
+		DUMP_WRITE(dump_start,dump_size);
+	}
+/* Finally dump the task struct.  Not be used by gdb, but could be useful */
+	set_fs(KERNEL_DS);
+	DUMP_WRITE(current,sizeof(*current));
+end_coredump:
+	set_fs(fs);
+	return has_dumped;
+}
+
+/*
+ * create_aout_tables() parses the env- and arg-strings in new user
+ * memory and creates the pointer tables from them, and puts their
+ * addresses on the "stack", returning the new stack pointer value.
+ */
+static u32 * create_aout_tables(char * p, struct linux_binprm * bprm)
+{
+	u32 *argv, *envp;
+	u32 * sp;
+	int argc = bprm->argc;
+	int envc = bprm->envc;
+
+	sp = (u32 *) ((-(unsigned long)sizeof(u32)) & (unsigned long) p);
+	sp -= envc+1;
+	envp = (u32 *) sp;
+	sp -= argc+1;
+	argv = (u32 *) sp;
+	put_user((unsigned long) envp,--sp);
+	put_user((unsigned long) argv,--sp);
+	put_user(argc,--sp);
+	current->mm->arg_start = (unsigned long) p;
+	while (argc-->0) {
+		char c;
+		put_user((u32)(unsigned long)p,argv++);
+		do {
+			get_user(c,p++);
+		} while (c);
+	}
+	put_user(NULL,argv);
+	current->mm->arg_end = current->mm->env_start = (unsigned long) p;
+	while (envc-->0) {
+		char c;
+		put_user((u32)(unsigned long)p,envp++);
+		do {
+			get_user(c,p++);
+		} while (c);
+	}
+	put_user(NULL,envp);
+	current->mm->env_end = (unsigned long) p;
+	return sp;
+}
+
+/*
+ * These are the functions used to load a.out style executables and shared
+ * libraries.  There is no binary dependent code anywhere else.
+ */
+
+static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
+{
+	struct exec ex;
+	unsigned long error;
+	unsigned long fd_offset;
+	unsigned long rlim;
+	int retval;
+
+	ex = *((struct exec *) bprm->buf);		/* exec-header */
+	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
+	     N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||
+	    N_TRSIZE(ex) || N_DRSIZE(ex) ||
+	    i_size_read(bprm->file->f_dentry->d_inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
+		return -ENOEXEC;
+	}
+
+	fd_offset = N_TXTOFF(ex);
+
+	/* Check initial limits. This avoids letting people circumvent
+	 * size limits imposed on them by creating programs with large
+	 * arrays in the data or bss.
+	 */
+	rlim = current->rlim[RLIMIT_DATA].rlim_cur;
+	if (rlim >= RLIM_INFINITY)
+		rlim = ~0;
+	if (ex.a_data + ex.a_bss > rlim)
+		return -ENOMEM;
+
+	/* Flush all traces of the currently running executable */
+	retval = flush_old_exec(bprm);
+	if (retval)
+		return retval;
+
+	regs->cs = __USER32_CS; 
+	regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
+		regs->r13 = regs->r14 = regs->r15 = 0;
+	set_thread_flag(TIF_IA32); 
+
+	/* OK, This is the point of no return */
+	set_personality(PER_LINUX);
+
+	current->mm->end_code = ex.a_text +
+		(current->mm->start_code = N_TXTADDR(ex));
+	current->mm->end_data = ex.a_data +
+		(current->mm->start_data = N_DATADDR(ex));
+	current->mm->brk = ex.a_bss +
+		(current->mm->start_brk = N_BSSADDR(ex));
+	current->mm->free_area_cache = TASK_UNMAPPED_BASE;
+
+	current->mm->rss = 0;
+	current->mm->mmap = NULL;
+	compute_creds(bprm);
+ 	current->flags &= ~PF_FORKNOEXEC;
+
+	if (N_MAGIC(ex) == OMAGIC) {
+		unsigned long text_addr, map_size;
+		loff_t pos;
+
+		text_addr = N_TXTADDR(ex);
+
+		pos = 32;
+		map_size = ex.a_text+ex.a_data;
+
+		error = do_brk(text_addr & PAGE_MASK, map_size);
+		if (error != (text_addr & PAGE_MASK)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+
+		error = bprm->file->f_op->read(bprm->file, (char *)text_addr,
+			  ex.a_text+ex.a_data, &pos);
+		if ((signed long)error < 0) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+			 
+		flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);
+	} else {
+#ifdef WARN_OLD
+		static unsigned long error_time, error_time2;
+		if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
+		    (N_MAGIC(ex) != NMAGIC) && (jiffies-error_time2) > 5*HZ)
+		{
+			printk(KERN_NOTICE "executable not page aligned\n");
+			error_time2 = jiffies;
+		}
+
+		if ((fd_offset & ~PAGE_MASK) != 0 &&
+		    (jiffies-error_time) > 5*HZ)
+		{
+			printk(KERN_WARNING 
+			       "fd_offset is not page aligned. Please convert program: %s\n",
+			       bprm->file->f_dentry->d_name.name);
+			error_time = jiffies;
+		}
+#endif
+
+		if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
+			loff_t pos = fd_offset;
+			do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
+			bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
+					ex.a_text+ex.a_data, &pos);
+			flush_icache_range((unsigned long) N_TXTADDR(ex),
+					   (unsigned long) N_TXTADDR(ex) +
+					   ex.a_text+ex.a_data);
+			goto beyond_if;
+		}
+
+		down_write(&current->mm->mmap_sem);
+		error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
+			PROT_READ | PROT_EXEC,
+			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
+			fd_offset);
+		up_write(&current->mm->mmap_sem);
+
+		if (error != N_TXTADDR(ex)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+
+		down_write(&current->mm->mmap_sem);
+ 		error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
+				PROT_READ | PROT_WRITE | PROT_EXEC,
+				MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
+				fd_offset + ex.a_text);
+		up_write(&current->mm->mmap_sem);
+		if (error != N_DATADDR(ex)) {
+			send_sig(SIGKILL, current, 0);
+			return error;
+		}
+	}
+beyond_if:
+	set_binfmt(&aout_format);
+
+	set_brk(current->mm->start_brk, current->mm->brk);
+
+	retval = ia32_setup_arg_pages(bprm); 
+	if (retval < 0) { 
+		/* Someone check-me: is this error path enough? */ 
+		send_sig(SIGKILL, current, 0); 
+		return retval;
+	}
+
+	current->mm->start_stack =
+		(unsigned long) create_aout_tables((char *) bprm->p, bprm);
+	/* start thread */
+	asm volatile("movl %0,%%fs" :: "r" (0)); \
+	asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS));
+	load_gs_index(0); 
+	(regs)->rip = ex.a_entry;
+	(regs)->rsp = current->mm->start_stack;
+	(regs)->eflags = 0x200;
+	(regs)->cs = __USER32_CS;
+	(regs)->ss = __USER32_DS;
+	set_fs(USER_DS);
+	if (unlikely(current->ptrace & PT_PTRACED)) {
+		if (current->ptrace & PT_TRACE_EXEC)
+			ptrace_notify ((PTRACE_EVENT_EXEC << 8) | SIGTRAP);
+		else
+			send_sig(SIGTRAP, current, 0);
+	}
+	return 0;
+}
+
+static int load_aout_library(struct file *file)
+{
+	struct inode * inode;
+	unsigned long bss, start_addr, len;
+	unsigned long error;
+	int retval;
+	struct exec ex;
+
+	inode = file->f_dentry->d_inode;
+
+	retval = -ENOEXEC;
+	error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
+	if (error != sizeof(ex))
+		goto out;
+
+	/* We come in here for the regular a.out style of shared libraries */
+	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||
+	    N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) ||
+	    i_size_read(inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
+		goto out;
+	}
+
+	if (N_FLAGS(ex))
+		goto out;
+
+	/* For  QMAGIC, the starting address is 0x20 into the page.  We mask
+	   this off to get the starting address for the page */
+
+	start_addr =  ex.a_entry & 0xfffff000;
+
+	if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) {
+		loff_t pos = N_TXTOFF(ex);
+
+#ifdef WARN_OLD
+		static unsigned long error_time;
+		if ((jiffies-error_time) > 5*HZ)
+		{
+			printk(KERN_WARNING 
+			       "N_TXTOFF is not page aligned. Please convert library: %s\n",
+			       file->f_dentry->d_name.name);
+			error_time = jiffies;
+		}
+#endif
+
+		do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
+		
+		file->f_op->read(file, (char *)start_addr,
+			ex.a_text + ex.a_data, &pos);
+		flush_icache_range((unsigned long) start_addr,
+				   (unsigned long) start_addr + ex.a_text + ex.a_data);
+
+		retval = 0;
+		goto out;
+	}
+	/* Now use mmap to map the library into memory. */
+	down_write(&current->mm->mmap_sem);
+	error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
+			PROT_READ | PROT_WRITE | PROT_EXEC,
+			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
+			N_TXTOFF(ex));
+	up_write(&current->mm->mmap_sem);
+	retval = error;
+	if (error != start_addr)
+		goto out;
+
+	len = PAGE_ALIGN(ex.a_text + ex.a_data);
+	bss = ex.a_text + ex.a_data + ex.a_bss;
+	if (bss > len) {
+		error = do_brk(start_addr + len, bss - len);
+		retval = error;
+		if (error != start_addr + len)
+			goto out;
+	}
+	retval = 0;
+out:
+	return retval;
+}
+
+static int __init init_aout_binfmt(void)
+{
+	return register_binfmt(&aout_format);
+}
+
+static void __exit exit_aout_binfmt(void)
+{
+	unregister_binfmt(&aout_format);
+}
+
+module_init(init_aout_binfmt);
+module_exit(exit_aout_binfmt);
+MODULE_LICENSE("GPL");
diff -Nru a/arch/x86_64/ia32/ia32_ioctl.c b/arch/x86_64/ia32/ia32_ioctl.c
--- a/arch/x86_64/ia32/ia32_ioctl.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/ia32/ia32_ioctl.c	Thu Jan  8 23:00:24 2004
@@ -59,7 +59,7 @@
 		return ret; 
 
 	case RTC_IRQP_SET32: 
-		cmd = RTC_EPOCH_SET; 
+		cmd = RTC_IRQP_SET; 
 		break; 
 
 	case RTC_EPOCH_READ32:
diff -Nru a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c
--- a/arch/x86_64/ia32/ia32_signal.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/ia32/ia32_signal.c	Thu Jan  8 23:00:24 2004
@@ -46,25 +46,25 @@
 
 static int ia32_copy_siginfo_to_user(siginfo_t32 *to, siginfo_t *from)
 {
+	int err;
 	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
 		return -EFAULT;
-	if (from->si_code < 0) { 
-		/* the only field that's different is the alignment
-		   of the pointer in sigval_t. Move that 4 bytes down including
-		   padding. */
-		memmove(&((siginfo_t32 *)&from)->si_int,
-			&from->si_int, 
-			sizeof(siginfo_t) - offsetof(siginfo_t, si_int));
-		/* last 4 bytes stay the same */
-		return __copy_to_user(to, from, sizeof(siginfo_t32));
-	} else {
-		int err;
 
-		/* If you change siginfo_t structure, please be sure
+	/* If you change siginfo_t structure, please make sure that
 		   this code is fixed accordingly.
 		   It should never copy any pad contained in the structure
 		   to avoid security leaks, but must copy the generic
 		   3 ints plus the relevant union member.  */
+
+	if (from->si_code < 0) {
+		err = __put_user(from->si_signo, &to->si_signo);
+		err |= __put_user(from->si_errno, &to->si_errno);
+		err |= __put_user(from->si_code, &to->si_code);
+		err |= __put_user(from->_sifields._rt._pid, &to->_sifields._rt._pid);
+		err |= __put_user(from->_sifields._rt._uid, &to->_sifields._rt._uid);
+		err |= __put_user((u32)(u64)from->_sifields._rt._sigval.sival_ptr,
+				  &to->_sifields._rt._sigval.sival_ptr);
+	} else {
 		err = __put_user(from->si_signo, &to->si_signo);
 		err |= __put_user(from->si_errno, &to->si_errno);
 		err |= __put_user(from->si_code, &to->si_code);
@@ -86,8 +86,8 @@
 			break;
 		/* case __SI_RT: This is not generated by the kernel as of now.  */
 		}
-		return err;
 	}
+	return err;
 }
 
 asmlinkage long
@@ -173,6 +173,9 @@
 {
 	unsigned int err = 0;
 	
+	/* Always make any pending restarted system calls return -EINTR */
+	current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
 #if DEBUG_SIG
 	printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
 		sc, sc->err, sc->eip, sc->cs, sc->eflags);
diff -Nru a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
--- a/arch/x86_64/ia32/ia32entry.S	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/ia32/ia32entry.S	Thu Jan  8 23:00:24 2004
@@ -221,7 +221,7 @@
 	.quad sys_chmod		/* 15 */
 	.quad sys_lchown16
 	.quad ni_syscall			/* old break syscall holder */
-	.quad ni_syscall	/* (old)stat */ 
+	.quad sys_stat
 	.quad sys32_lseek
 	.quad sys_getpid		/* 20 */
 	.quad sys_mount	/* mount  */
@@ -231,7 +231,7 @@
 	.quad sys_stime		/* stime */		/* 25 */
 	.quad sys32_ptrace	/* ptrace */
 	.quad sys_alarm		/* XXX sign extension??? */ 
-	.quad ni_syscall	/* (old)fstat */
+	.quad sys_fstat	/* (old)fstat */
 	.quad sys_pause
 	.quad compat_sys_utime	/* 30 */
 	.quad ni_syscall	/* old stty syscall holder */
@@ -287,7 +287,7 @@
 	.quad sys_setgroups16
 	.quad sys32_old_select
 	.quad sys_symlink
-	.quad ni_syscall	/* (old)lstat */
+	.quad sys_lstat
 	.quad sys_readlink		/* 85 */
 	.quad sys_uselib
 	.quad sys_swapon
@@ -330,10 +330,10 @@
 	.quad sys32_adjtimex
 	.quad sys32_mprotect		/* 125 */
 	.quad compat_sys_sigprocmask
-	.quad sys32_module_warning	/* create_module */
+	.quad quiet_ni_syscall		/* create_module */
 	.quad sys_init_module
 	.quad sys_delete_module
-	.quad sys32_module_warning	/* 130  get_kernel_syms */
+	.quad quiet_ni_syscall		/* 130  get_kernel_syms */
 	.quad ni_syscall	/* quotactl */ 
 	.quad sys_getpgid
 	.quad sys_fchdir
@@ -396,8 +396,8 @@
 	.quad stub32_vfork            /* 190 */
 	.quad compat_sys_getrlimit
 	.quad sys32_mmap2
-	.quad sys_truncate
-	.quad sys_ftruncate
+	.quad sys32_truncate64
+	.quad sys32_ftruncate64
 	.quad sys32_stat64		/* 195 */
 	.quad sys32_lstat64
 	.quad sys32_fstat64
diff -Nru a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c
--- a/arch/x86_64/ia32/sys_ia32.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/ia32/sys_ia32.c	Thu Jan  8 23:00:23 2004
@@ -110,6 +110,21 @@
 	return 0;
 }
 
+extern long sys_truncate(char *, loff_t);
+extern long sys_ftruncate(int, loff_t);
+
+asmlinkage long
+sys32_truncate64(char * filename, unsigned long offset_low, unsigned long offset_high)
+{
+       return sys_truncate(filename, ((loff_t) offset_high << 32) | offset_low);
+}
+
+asmlinkage long
+sys32_ftruncate64(unsigned int fd, unsigned long offset_low, unsigned long offset_high)
+{
+       return sys_ftruncate(fd, ((loff_t) offset_high << 32) | offset_low);
+}
+
 /* Another set for IA32/LFS -- x86_64 struct stat is different due to 
    support for 64bit inode numbers. */
 
@@ -1817,13 +1832,6 @@
 }
 #endif
 
-long sys32_module_warning(void)
-{ 
-		printk(KERN_INFO "%s: 32bit 2.4.x modutils not supported on 64bit kernel\n",
-		       current->comm);
-	return -ENOSYS ;
-} 
-
 extern long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx);
 
 long sys32_io_setup(unsigned nr_reqs, u32 *ctx32p)
@@ -1989,11 +1997,15 @@
 
 long sys32_vm86_warning(void)
 { 
+	struct task_struct *me = current;
+	static char lastcomm[8];
+	if (strcmp(lastcomm, me->comm)) {
 		printk(KERN_INFO "%s: vm86 mode not supported on 64 bit kernel\n",
-		       current->comm);
-	return -ENOSYS ;
+		       me->comm);
+		strcpy(lastcomm, me->comm); 
+	} 
+	return -ENOSYS;
 } 
-
 
 struct exec_domain ia32_exec_domain = { 
 	.name = "linux/x86",
diff -Nru a/arch/x86_64/ia32/syscall32.c b/arch/x86_64/ia32/syscall32.c
--- a/arch/x86_64/ia32/syscall32.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/ia32/syscall32.c	Thu Jan  8 23:00:24 2004
@@ -30,10 +30,12 @@
 int map_syscall32(struct mm_struct *mm, unsigned long address) 
 { 
 	pte_t *pte;
+	pmd_t *pmd;
 	int err = 0;
+
 	down_read(&mm->mmap_sem);
 	spin_lock(&mm->page_table_lock); 
-	pmd_t *pmd = pmd_alloc(mm, pgd_offset(mm, address), address); 
+	pmd = pmd_alloc(mm, pgd_offset(mm, address), address); 
 	if (pmd && (pte = pte_alloc_map(mm, pmd, address)) != NULL) { 
 		if (pte_none(*pte)) { 
 			set_pte(pte, 
diff -Nru a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile
--- a/arch/x86_64/kernel/Makefile	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/Makefile	Thu Jan  8 23:00:24 2004
@@ -18,13 +18,16 @@
 obj-$(CONFIG_X86_IO_APIC)	+= io_apic.o mpparse.o
 obj-$(CONFIG_PM)		+= suspend.o
 obj-$(CONFIG_SOFTWARE_SUSPEND)	+= suspend_asm.o
+obj-$(CONFIG_CPU_FREQ)		+= cpufreq/
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 obj-$(CONFIG_GART_IOMMU)	+= pci-gart.o aperture.o
 obj-$(CONFIG_DUMMY_IOMMU)	+= pci-nommu.o pci-dma.o
 
 obj-$(CONFIG_MODULES)		+= module.o
 
+obj-y				+= topology.o
+
 bootflag-y			+= ../../i386/kernel/bootflag.o
-cpuid-$(CONFIG_X86_CPUID)	+= ../../i386/kernel/cpuid.o
+cpuid-$(subst m,y,$(CONFIG_X86_CPUID))  += ../../i386/kernel/cpuid.o
+topology-y                     += ../../i386/mach-default/topology.o
 
-obj-$(CONFIG_CPU_FREQ)	+=	cpufreq/
diff -Nru a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c
--- a/arch/x86_64/kernel/apic.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/apic.c	Thu Jan  8 23:00:23 2004
@@ -42,6 +42,8 @@
 static DEFINE_PER_CPU(int, prof_old_multiplier) = 1;
 static DEFINE_PER_CPU(int, prof_counter) = 1;
 
+static void apic_pm_activate(void);
+
 void enable_NMI_through_LVT0 (void * dummy)
 {
 	unsigned int v, ver;
@@ -435,6 +437,7 @@
 
 	if (nmi_watchdog == NMI_LOCAL_APIC)
 		setup_apic_nmi_watchdog();
+	apic_pm_activate();
 }
 
 #ifdef CONFIG_PM
@@ -556,7 +559,7 @@
 
 #else	/* CONFIG_PM */
 
-static inline void apic_pm_activate(void) { }
+static void apic_pm_activate(void) { }
 
 #endif	/* CONFIG_PM */
 
@@ -579,7 +582,6 @@
 	if (nmi_watchdog != NMI_NONE)
 		nmi_watchdog = NMI_LOCAL_APIC;
 
-	apic_pm_activate();
 	return 0;
 }
 
diff -Nru a/arch/x86_64/kernel/bluesmoke.c b/arch/x86_64/kernel/bluesmoke.c
--- a/arch/x86_64/kernel/bluesmoke.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/bluesmoke.c	Thu Jan  8 23:00:24 2004
@@ -26,19 +26,6 @@
 static int banks;
 static unsigned long ignored_banks, disabled_banks;
 
-/* Machine Check on everything dubious. This is a good setting
-   for device driver testing. */
-#define K8_DRIVER_DEBUG ((1<<13)-1)
-/* Report RAM errors and Hyper Transport Problems, but ignore Device
-   aborts and GART errors. */
-#define K8_NORMAL_OP    0xff
-
-#ifdef CONFIG_MCE_DEBUG
-static u32 k8_nb_flags __initdata = K8_DRIVER_DEBUG;
-#else
-static u32 k8_nb_flags __initdata = K8_NORMAL_OP;
-#endif
-
 static void generic_machine_check(struct pt_regs * regs, long error_code)
 {
 	int recover=1;
@@ -200,11 +187,14 @@
 static void check_k8_nb(int header)
 {
 	struct pci_dev *nb;
+	u32 statuslow, statushigh;
+	unsigned short errcode;
+	int i;
+
 	nb = find_k8_nb(); 
 	if (nb == NULL)
 		return;
 
-	u32 statuslow, statushigh;
 	pci_read_config_dword(nb, 0x48, &statuslow);
 	pci_read_config_dword(nb, 0x4c, &statushigh);
 	if (!(statushigh & (1<<31)))
@@ -215,50 +205,42 @@
 	printk(KERN_ERR "Northbridge status %08x%08x\n",
 	       statushigh,statuslow); 
 
-	unsigned short errcode = statuslow & 0xffff;	
-	switch (errcode >> 8) { 
-	case 0: 					
+	printk(KERN_ERR "    Error %s\n", extendederr[(statuslow >> 16) & 0xf]); 
+
+	errcode = statuslow & 0xffff;	
+	switch ((statuslow >> 16) & 0xF) { 
+	case 5: 					
 		printk(KERN_ERR "    GART TLB error %s %s\n", 
 		       transaction[(errcode >> 2) & 3], 
 		       cachelevel[errcode & 3]);
 		break;
-	case 1: 
-		if (errcode & (1<<11)) { 
-			printk(KERN_ERR "    bus error %s %s %s %s %s\n",
-			       partproc[(errcode >> 10) & 0x3],
-			       timeout[(errcode >> 9) & 1],
+	case 8:
+		printk(KERN_ERR "    ECC error syndrome %x\n", 
+		       (((statuslow >> 24) & 0xff)  << 8) | ((statushigh >> 15) & 0x7f));		
+		/*FALL THROUGH*/
+	default:
+		printk(KERN_ERR "    bus error %s, %s\n    %s\n    %s, %s\n",
+		       partproc[(errcode >> 9) & 0x3],
+		       timeout[(errcode >> 8) & 1],
 			       memtrans[(errcode >> 4) & 0xf],
 			       memoryio[(errcode >> 2) & 0x3], 
 			       cachelevel[(errcode & 0x3)]); 
-		} else if (errcode & (1<<8)) { 
-			printk(KERN_ERR "    memory error %s %s %s\n",
-			       memtrans[(errcode >> 4) & 0xf],
-			       transaction[(errcode >> 2) & 0x3],
-			       cachelevel[(errcode & 0x3)]);
-		} else {
-			printk(KERN_ERR "    unknown error code %x\n", errcode); 
-		}
-		break;
-	} 
-	if (statushigh & ((1<<14)|(1<<13)))
-		printk(KERN_ERR "    ECC syndrome bits %x\n", 
-		       (((statuslow >> 24) & 0xff)  << 8) | ((statushigh >> 15) & 0x7f));
-	errcode = (statuslow >> 16) & 0xf;
-	printk(KERN_ERR "    extended error %s\n", extendederr[(statuslow >> 16) & 0xf]); 
-	
 	/* should only print when it was a HyperTransport related error. */
 	printk(KERN_ERR "    link number %x\n", (statushigh >> 4) & 3);
+ 		break;
+	} 
 
-	int i;
-	for (i = 0; i < 32; i++) 
+	for (i = 0; i < 32; i++) {
+		if (i == 26 || i == 28) 
+			continue;
 		if (highbits[i] && (statushigh & (1<<i)))
 			printk(KERN_ERR "    %s\n", highbits[i]); 
-
+	}
 	if (statushigh & (1<<26)) { 
 		u32 addrhigh, addrlow; 
 		pci_read_config_dword(nb, 0x54, &addrhigh); 
 		pci_read_config_dword(nb, 0x50, &addrlow); 
-		printk(KERN_ERR "    error address %08x%08x\n", addrhigh,addrlow); 
+		printk(KERN_ERR "    NB error address %08x%08x\n", addrhigh,addrlow); 
 	}
 	statushigh &= ~(1<<31); 
 	pci_write_config_dword(nb, 0x4c, statushigh); 		
@@ -307,9 +289,6 @@
 	wrmsrl(MSR_IA32_MC0_STATUS+4*4, 0); 
 	wrmsrl(MSR_IA32_MCG_STATUS, 0);
        
-	if (regs && (status & (1<<1)))
-		printk(KERN_EMERG "MCE at RIP %lx RSP %lx\n", regs->rip, regs->rsp); 
-
  others:
 	generic_machine_check(regs, error_code); 
 
@@ -367,12 +346,13 @@
 	machine_check_vector = k8_machine_check; 
 	for (i = 0; i < banks; i++) { 
 		u64 val = ((1UL<<i) & disabled_banks) ? 0 : ~0UL; 
-		if (val && i == 4) 
-			val = k8_nb_flags;
 		wrmsrl(MSR_IA32_MC0_CTL+4*i, val);
 		wrmsrl(MSR_IA32_MC0_STATUS+4*i,0); 
 	}
 
+	if (cap & (1<<8))
+		wrmsrl(MSR_IA32_MCG_CTL, 0xffffffffffffffffULL);
+
 	set_in_cr4(X86_CR4_MCE);	   	
 
 	if (mcheck_interval && (smp_processor_id() == 0)) { 
@@ -469,7 +449,6 @@
    mce=nok8 disable k8 specific features
    mce=disable<NUMBER> disable bank NUMBER
    mce=enable<NUMBER> enable bank number
-   mce=device	Enable device driver test reporting in NB
    mce=NUMBER mcheck timer interval number seconds. 
    Can be also comma separated in a single mce= */
 static int __init mcheck_enable(char *str)
@@ -486,8 +465,6 @@
 			disabled_banks |= ~(1<<simple_strtol(p+7,NULL,0));
 		else if (!strcmp(p,"nok8"))
 			nok8 = 1;
-		else if (!strcmp(p,"device"))
-			k8_nb_flags = K8_DRIVER_DEBUG;
 	}
 	return 0;
 }
diff -Nru a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c
--- a/arch/x86_64/kernel/e820.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/e820.c	Thu Jan  8 23:00:23 2004
@@ -2,10 +2,6 @@
  * Handle the memory map.
  * The functions here do the job until bootmem takes over.
  * $Id: e820.c,v 1.4 2002/09/19 19:25:32 ak Exp $
-
- * AK: some of these functions are not used in 2.5 yet but they will be when
- * NUMA is completely merged.
-
  */
 #include <linux/config.h>
 #include <linux/kernel.h>
diff -Nru a/arch/x86_64/kernel/head.S b/arch/x86_64/kernel/head.S
--- a/arch/x86_64/kernel/head.S	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/head.S	Thu Jan  8 23:00:24 2004
@@ -38,6 +38,9 @@
 
 	movl %ebx,%ebp	/* Save trampoline flag */
 	
+	movl $__KERNEL_DS,%eax
+	movl %eax,%ds
+	
 	/* If the CPU doesn't support CPUID this will double fault.
 	 * Unfortunately it is hard to check for CPUID without a stack. 
 	 */
@@ -114,24 +117,10 @@
 	movl	$(pGDT32 - __START_KERNEL_map), %eax
 	lgdt	(%eax)
 
+second:	
 	movl    $(ljumpvector - __START_KERNEL_map), %eax
 	/* Finally jump in 64bit mode */
 	ljmp	*(%eax)
-
-second:
-	/* abuse syscall to get into 64bit mode. this way we don't need
-	   a working low identity mapping just for the short 32bit roundtrip. 
-	   XXX kludge. this should not be needed. */
-	movl  $MSR_STAR,%ecx
-	xorl  %eax,%eax
-	movl  $(__USER32_CS<<16)|__KERNEL_CS,%edx
-	wrmsr
-
-	movl  $MSR_CSTAR,%ecx
-	movl  $0xffffffff,%edx
-	movl  $0x80100100,%eax	# reach_long64 absolute
-	wrmsr
-	syscall
 
 	.code64
 	.org 0x100	
diff -Nru a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c
--- a/arch/x86_64/kernel/i8259.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/i8259.c	Thu Jan  8 23:00:23 2004
@@ -446,8 +446,10 @@
 	 * us. (some of these will be overridden and become
 	 * 'special' SMP interrupts)
 	 */
-	for (i = 0; i < NR_IRQS; i++) {
+	for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
 		int vector = FIRST_EXTERNAL_VECTOR + i;
+		if (i >= NR_IRQS)
+			break;
 		if (vector != IA32_SYSCALL_VECTOR && vector != KDB_VECTOR) { 
 			set_intr_gate(vector, interrupt[i]);
 	}
diff -Nru a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
--- a/arch/x86_64/kernel/io_apic.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/io_apic.c	Thu Jan  8 23:00:24 2004
@@ -66,6 +66,14 @@
 	short apic, pin, next;
 } irq_2_pin[PIN_MAP_SIZE];
 
+#ifdef CONFIG_PCI_USE_VECTOR
+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
+#define vector_to_irq(vector) 	\
+	(platform_legacy_irq(vector) ? vector : vector_irq[vector])
+#else
+#define vector_to_irq(vector)	(vector)
+#endif
+
 /*
  * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
  * shared ISA-space IRQs, so we have to support them. We are super
@@ -147,6 +155,13 @@
 	struct IO_APIC_route_entry entry;
 	unsigned long flags;
 
+	/* Check delivery_mode to be sure we're not clearing an SMI pin */
+	spin_lock_irqsave(&ioapic_lock, flags);
+	*(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
+	*(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
+	if (entry.delivery_mode == dest_SMI)
+		return;
 	/*
 	 * Disable it in the IO-APIC irq-routing table:
 	 */
@@ -625,7 +640,8 @@
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
 u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 
-static int __init assign_irq_vector(int irq)
+#ifndef CONFIG_PCI_USE_VECTOR
+int __init assign_irq_vector(int irq)
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
 	BUG_ON(irq >= NR_IRQ_VECTORS);
@@ -647,10 +663,34 @@
 	IO_APIC_VECTOR(irq) = current_vector;
 	return current_vector;
 }
+#endif
 
 extern void (*interrupt[NR_IRQS])(void);
-static struct hw_interrupt_type ioapic_level_irq_type;
-static struct hw_interrupt_type ioapic_edge_irq_type;
+static struct hw_interrupt_type ioapic_level_type;
+static struct hw_interrupt_type ioapic_edge_type;
+
+#define IOAPIC_AUTO	-1
+#define IOAPIC_EDGE	0
+#define IOAPIC_LEVEL	1
+
+static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
+{
+	if (use_pci_vector() && !platform_legacy_irq(irq)) {
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[vector].handler = &ioapic_level_type;
+		else
+			irq_desc[vector].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[vector]);
+	} else	{
+		if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+				trigger == IOAPIC_LEVEL)
+			irq_desc[irq].handler = &ioapic_level_type;
+		else
+			irq_desc[irq].handler = &ioapic_edge_type;
+		set_intr_gate(vector, interrupt[irq]);
+	}
+}
 
 void __init setup_IO_APIC_irqs(void)
 {
@@ -702,13 +742,7 @@
 			vector = assign_irq_vector(irq);
 			entry.vector = vector;
 
-			if (IO_APIC_irq_trigger(irq))
-				irq_desc[irq].handler = &ioapic_level_irq_type;
-			else
-				irq_desc[irq].handler = &ioapic_edge_irq_type;
-
-			set_intr_gate(vector, interrupt[irq]);
-		
+			ioapic_register_intr(irq, vector, IOAPIC_AUTO);
 			if (!apic && (irq < 16))
 				disable_8259A_irq(irq);
 		}
@@ -755,7 +789,7 @@
 	 * The timer IRQ doesn't have to know that behind the
 	 * scene we have a 8259A-master in AEOI mode ...
 	 */
-	irq_desc[0].handler = &ioapic_edge_irq_type;
+	irq_desc[0].handler = &ioapic_edge_type;
 
 	/*
 	 * Add it to the IO-APIC irq-routing table:
@@ -1210,9 +1244,6 @@
  * that was delayed but this is now handled in the device
  * independent code.
  */
-#define enable_edge_ioapic_irq unmask_IO_APIC_irq
-
-static void disable_edge_ioapic_irq (unsigned int irq) { /* nothing */ }
 
 /*
  * Starting up a edge-triggered IO-APIC interrupt is
@@ -1241,8 +1272,6 @@
 	return was_pending;
 }
 
-#define shutdown_edge_ioapic_irq	disable_edge_ioapic_irq
-
 /*
  * Once we have recorded IRQ_PENDING already, we can mask the
  * interrupt for real. This prevents IRQ storms from unhandled
@@ -1256,9 +1285,6 @@
 	ack_APIC_irq();
 }
 
-static void end_edge_ioapic_irq (unsigned int i) { /* nothing */ }
-
-
 /*
  * Level triggered interrupts can just be masked,
  * and shutting down and starting up the interrupt
@@ -1280,10 +1306,6 @@
 	return 0; /* don't check for pending */
 }
 
-#define shutdown_level_ioapic_irq	mask_IO_APIC_irq
-#define enable_level_ioapic_irq		unmask_IO_APIC_irq
-#define disable_level_ioapic_irq	mask_IO_APIC_irq
-
 static void end_level_ioapic_irq (unsigned int irq)
 {
 	unsigned long v;
@@ -1343,9 +1365,7 @@
 	}
 }
 
-static void mask_and_ack_level_ioapic_irq (unsigned int irq) { /* nothing */ }
-
-static void set_ioapic_affinity (unsigned int irq, cpumask_t mask)
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
 {
 	unsigned long flags;
 	unsigned int dest;
@@ -1362,6 +1382,58 @@
 	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
+#ifdef CONFIG_PCI_USE_VECTOR
+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_edge_ioapic_irq(irq);
+}
+
+static void ack_edge_ioapic_vector(unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	ack_edge_ioapic_irq(irq);
+}
+
+static unsigned int startup_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	return startup_level_ioapic_irq (irq);
+}
+
+static void end_level_ioapic_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	end_level_ioapic_irq(irq);
+}
+
+static void mask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	mask_IO_APIC_irq(irq);
+}
+
+static void unmask_IO_APIC_vector (unsigned int vector)
+{
+	int irq = vector_to_irq(vector);
+
+	unmask_IO_APIC_irq(irq);
+}
+
+static void set_ioapic_affinity_vector (unsigned int vector,
+					cpumask_t cpu_mask)
+{
+	int irq = vector_to_irq(vector);
+
+	set_ioapic_affinity_irq(irq, cpu_mask);
+}
+#endif
+
 /*
  * Level and edge triggered IO-APIC interrupts need different handling,
  * so we use two separate IRQ descriptors. Edge triggered IRQs can be
@@ -1371,25 +1443,25 @@
  * races.
  */
 
-static struct hw_interrupt_type ioapic_edge_irq_type = {
+static struct hw_interrupt_type ioapic_edge_type = {
 	.typename = "IO-APIC-edge",
-	.startup = startup_edge_ioapic_irq,
-	.shutdown = shutdown_edge_ioapic_irq,
-	.enable = enable_edge_ioapic_irq,
-	.disable = disable_edge_ioapic_irq,
-	.ack = ack_edge_ioapic_irq,
-	.end = end_edge_ioapic_irq,
+	.startup 	= startup_edge_ioapic,
+	.shutdown 	= shutdown_edge_ioapic,
+	.enable 	= enable_edge_ioapic,
+	.disable 	= disable_edge_ioapic,
+	.ack 		= ack_edge_ioapic,
+	.end 		= end_edge_ioapic,
 	.set_affinity = set_ioapic_affinity,
 };
 
-static struct hw_interrupt_type ioapic_level_irq_type = {
+static struct hw_interrupt_type ioapic_level_type = {
 	.typename = "IO-APIC-level",
-	.startup = startup_level_ioapic_irq,
-	.shutdown = shutdown_level_ioapic_irq,
-	.enable = enable_level_ioapic_irq,
-	.disable = disable_level_ioapic_irq,
-	.ack = mask_and_ack_level_ioapic_irq,
-	.end = end_level_ioapic_irq,
+	.startup 	= startup_level_ioapic,
+	.shutdown 	= shutdown_level_ioapic,
+	.enable 	= enable_level_ioapic,
+	.disable 	= disable_level_ioapic,
+	.ack 		= mask_and_ack_level_ioapic,
+	.end 		= end_level_ioapic,
 	.set_affinity = set_ioapic_affinity,
 };
 
@@ -1409,7 +1481,13 @@
 	 * 0x80, because int 0x80 is hm, kind of importantish. ;)
 	 */
 	for (irq = 0; irq < NR_IRQS ; irq++) {
-		if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq)) {
+		int tmp = irq;
+		if (use_pci_vector()) {
+			if (!platform_legacy_irq(tmp))
+				if ((tmp = vector_to_irq(tmp)) == -1)
+					continue;
+		}
+		if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
 			/*
 			 * Hmm.. We don't have an entry for this,
 			 * so default to an old-fashioned 8259
@@ -1837,10 +1915,12 @@
 	       mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
 	       edge_level, active_high_low);
 
+ 	if (use_pci_vector() && !platform_legacy_irq(irq))
+		irq = IO_APIC_VECTOR(irq);
 	if (edge_level) {
-		irq_desc[irq].handler = &ioapic_level_irq_type;
+		irq_desc[irq].handler = &ioapic_level_type;
 	} else {
-		irq_desc[irq].handler = &ioapic_edge_irq_type;
+		irq_desc[irq].handler = &ioapic_edge_type;
 	}
 
 	set_intr_gate(entry.vector, interrupt[irq]);
@@ -1853,7 +1933,7 @@
 	io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
 	spin_unlock_irqrestore(&ioapic_lock, flags);
 
-	return entry.vector;
+	return 0;
 }
 
 #endif /*CONFIG_ACPI_BOOT*/
diff -Nru a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c
--- a/arch/x86_64/kernel/irq.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/irq.c	Thu Jan  8 23:00:23 2004
@@ -138,17 +138,19 @@
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-	int i, j;
+	int i = *(loff_t *) v, j;
 	struct irqaction * action;
 	unsigned long flags;
 
-	seq_printf(p, "           ");
-	for (j=0; j<NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "CPU%d       ",j);
-	seq_putc(p, '\n');
+	if (i == 0) {
+		seq_printf(p, "           ");
+		for (j=0; j<NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "CPU%d       ",j);
+		seq_putc(p, '\n');
+	}
 
-	for (i = 0 ; i < NR_IRQS ; i++) {
+	if (i < NR_IRQS) {
 		spin_lock_irqsave(&irq_desc[i].lock, flags);
 		action = irq_desc[i].action;
 		if (!action) 
@@ -170,25 +172,26 @@
 		seq_putc(p, '\n');
 skip:
 		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-	}
-	seq_printf(p, "NMI: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
-	seq_putc(p, '\n');
+	} else if (i == NR_IRQS) {
+		seq_printf(p, "NMI: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
+		seq_putc(p, '\n');
 #ifdef CONFIG_X86_LOCAL_APIC
-	seq_printf(p, "LOC: ");
-	for (j = 0; j < NR_CPUS; j++)
-		if (cpu_online(j))
-		seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
-	seq_putc(p, '\n');
+		seq_printf(p, "LOC: ");
+		for (j = 0; j < NR_CPUS; j++)
+			if (cpu_online(j))
+				seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
+		seq_putc(p, '\n');
 #endif
-	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #ifdef CONFIG_X86_IO_APIC
 #ifdef APIC_MISMATCH_DEBUG
-	seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
+	}
 	return 0;
 }
 
@@ -405,6 +408,20 @@
 	return 1;
 }
 
+int can_request_irq(unsigned int irq, unsigned long irqflags)
+{
+	struct irqaction *action;
+
+	if (irq >= NR_IRQS)
+		return 0;
+	action = irq_desc[irq].action;
+	if (action) {
+		if (irqflags & action->flags & SA_SHIRQ)
+			action = NULL;
+	}
+	return !action;
+}
+
 /**
  *	request_irq - allocate an interrupt line
  *	@irq: Interrupt line to allocate
@@ -801,47 +818,6 @@
 static struct proc_dir_entry * root_irq_dir;
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 
-#define HEX_DIGITS (2*sizeof(cpumask_t))
-
-static unsigned int parse_hex_value (const char *buffer,
-		unsigned long count, cpumask_t *ret)
-{
-	unsigned char hexnum [HEX_DIGITS];
-	cpumask_t value = CPU_MASK_NONE;
-	unsigned i;
-
-	if (!count)
-		return -EINVAL;
-	if (count > HEX_DIGITS)
-		count = HEX_DIGITS;
-	if (copy_from_user(hexnum, buffer, count))
-		return -EFAULT;
-
-	/*
-	 * Parse the first 8 characters as a hex string, any non-hex char
-	 * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-	 */
-
-	for (i = 0; i < count; i++) {
-		unsigned int k, c = hexnum[i];
-
-		switch (c) {
-			case '0' ... '9': c -= '0'; break;
-			case 'a' ... 'f': c -= 'a'-10; break;
-			case 'A' ... 'F': c -= 'A'-10; break;
-		default:
-			goto out;
-		}
-		cpus_shift_left(value, value, 4);
-		for (k = 0; k < 4; ++k)
-			if (c & (1 << k))
-				cpu_set(k, value);
-	}
-out:
-	*ret = value;
-	return 0;
-}
-
 #ifdef CONFIG_SMP
 
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
@@ -850,19 +826,10 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
+	if (count - len < 2)
 		return -EINVAL;
-
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -875,7 +842,7 @@
 	if (!irq_desc[irq].handler->set_affinity)
 		return -EIO;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 
 	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
@@ -897,20 +864,10 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len;
-
-	if (count < HEX_DIGITS+1)
+	int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
+	if (count - len < 2)
 		return -EINVAL;
-
-	tmp = *mask;
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-	len += sprintf(page, "\n");
+	len += sprintf(page + len, "\n");
 	return len;
 }
 
@@ -920,7 +877,7 @@
 	unsigned long full_count = count, err;
 	cpumask_t new_value, *mask = (cpumask_t *)data;
 
-	err = parse_hex_value(buffer, count, &new_value);
+	err = cpumask_parse(buffer, count, new_value);
 	if (err)
 		return err;
 
diff -Nru a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
--- a/arch/x86_64/kernel/mpparse.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/mpparse.c	Thu Jan  8 23:00:23 2004
@@ -226,7 +226,7 @@
 	unsigned char *mpt=((unsigned char *)mpc)+count;
 
 	if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-		panic("SMP mptable: bad signature [%c%c%c%c]!\n",
+		printk("SMP mptable: bad signature [%c%c%c%c]!\n",
 			mpc->mpc_signature[0],
 			mpc->mpc_signature[1],
 			mpc->mpc_signature[2],
@@ -234,7 +234,7 @@
 		return 0;
 	}
 	if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-		panic("SMP mptable: checksum error!\n");
+		printk("SMP mptable: checksum error!\n");
 		return 0;
 	}
 	if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
@@ -881,7 +881,6 @@
 {
 	struct list_head	*node = NULL;
 	struct acpi_prt_entry	*entry = NULL;
-	int			vector = 0;
 	int			ioapic = -1;
 	int			ioapic_pin = 0;
 	int			irq = 0;
@@ -933,20 +932,22 @@
 		if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
 			printk(KERN_DEBUG "Pin %d-%d already programmed\n",
 				mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
 			entry->irq = irq;
 			continue;
 		}
 
 		mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-
-		vector = io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low);
-		if (vector)
+		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low)) {
+ 			if (use_pci_vector() && !platform_legacy_irq(irq))
+ 				irq = IO_APIC_VECTOR(irq);
 			entry->irq = irq;
-
-		printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> vector 0x%02x"
+ 		}
+		printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d"
 			" -> IRQ %d\n", entry->id.segment, entry->id.bus, 
 			entry->id.device, ('A' + entry->pin), 
-			mp_ioapic_routing[ioapic].apic_id, ioapic_pin, vector, 
+			mp_ioapic_routing[ioapic].apic_id, ioapic_pin,
 			entry->irq);
 	}
 	
diff -Nru a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c
--- a/arch/x86_64/kernel/pci-gart.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/pci-gart.c	Thu Jan  8 23:00:23 2004
@@ -44,12 +44,15 @@
 #ifdef CONFIG_IOMMU_DEBUG
 int panic_on_overflow = 1; 
 int force_iommu = 1;
-int sac_force_size = 0; 
 #else
-int panic_on_overflow = 1; /* for testing */
+int panic_on_overflow = 0;
 int force_iommu = 0;
-int sac_force_size = 256*1024*1024;
 #endif
+int iommu_merge = 0; 
+int iommu_sac_force = 0; 
+int iommu_fullflush = 1;
+
+#define MAX_NB 8
 
 /* Allocation bitmap for the remapping area */ 
 static spinlock_t iommu_bitmap_lock = SPIN_LOCK_UNLOCKED;
@@ -70,8 +73,8 @@
 	     if (dev->bus->number == 0 && 				     \
 		    (PCI_SLOT(dev->devfn) >= 24) && (PCI_SLOT(dev->devfn) <= 31))
 
-static struct pci_dev *northbridges[NR_CPUS + 1];
-static u32 northbridge_flush_word[NR_CPUS + 1];
+static struct pci_dev *northbridges[MAX_NB];
+static u32 northbridge_flush_word[MAX_NB];
 
 #define EMERGENCY_PAGES 32 /* = 128KB */ 
 
@@ -106,6 +109,8 @@
 			need_flush = 1;
 		} 
 	} 
+	if (iommu_fullflush)
+		need_flush = 1;
 	spin_unlock_irqrestore(&iommu_bitmap_lock, flags);      
 	return offset;
 } 
@@ -125,7 +130,7 @@
 /* 
  * Use global flush state to avoid races with multiple flushers.
  */
-static void __flush_gart(struct pci_dev *dev)
+static void flush_gart(struct pci_dev *dev)
 { 
 	unsigned long flags;
 	int bus = dev ? dev->bus->number : -1;
@@ -134,13 +139,19 @@
 	int i;
 
 	spin_lock_irqsave(&iommu_bitmap_lock, flags);
-	/* recheck flush count inside lock */
 	if (need_flush) { 
-		for (i = 0; northbridges[i]; i++) {
+		for (i = 0; i < MAX_NB; i++) {
+			u32 w;
+			if (!northbridges[i]) 
+				continue;
 			if (bus >= 0 && !(cpu_isset_const(i, bus_cpumask)))
 				continue;
 			pci_write_config_dword(northbridges[i], 0x9c, 
 					       northbridge_flush_word[i] | 1); 
+			/* Make sure the hardware actually executed the flush. */
+			do { 
+				pci_read_config_dword(northbridges[i], 0x9c, &w);
+			} while (w & 1);
 			flushed++;
 		} 
 		if (!flushed) 
@@ -150,12 +161,6 @@
 	spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
 } 
 
-static inline void flush_gart(struct pci_dev *dev)
-{ 
-	if (need_flush)
-		__flush_gart(dev);
-} 
-
 /* 
  * Allocate memory for a consistent mapping.
  * All mappings are consistent here, so this is just a wrapper around
@@ -174,11 +179,16 @@
 	} else {
 		dma_mask = hwdev->consistent_dma_mask; 
 	}
+
 	if (dma_mask == 0) 
 		dma_mask = 0xffffffff; 
 	if (dma_mask < 0xffffffff || no_iommu)
 		gfp |= GFP_DMA;
 
+	/* Kludge to make it bug-to-bug compatible with i386. i386
+	   uses the normal dma_mask for alloc_consistent. */
+	dma_mask &= hwdev->dma_mask;
+
 	memory = (void *)__get_free_pages(gfp, get_order(size));
 	if (memory == NULL) {
 		return NULL; 
@@ -394,7 +404,9 @@
 	
 	for (i = start; i < stopat; i++) {
 		struct scatterlist *s = &sg[i];
-		unsigned long start_addr = s->dma_address;
+		unsigned long pages, addr;
+		unsigned long phys_addr = s->dma_address;
+		
 		BUG_ON(i > start && s->offset);
 		if (i == start) {
 			*sout = *s; 
@@ -403,8 +415,10 @@
 		} else { 
 			sout->length += s->length; 
 		}
-		unsigned long addr = start_addr;
-		while (addr < start_addr + s->length) { 
+
+		addr = phys_addr;
+		pages = to_pages(s->offset, s->length); 
+		while (pages--) { 
 			iommu_gatt_base[iommu_page] = GPTE_ENCODE(addr); 
 			SET_LEAK(iommu_page);
 			addr += PAGE_SIZE;
@@ -437,7 +451,7 @@
 	int out;
 	int start;
 	unsigned long pages = 0;
-	int need = 0;
+	int need = 0, nextneed;
 
 	unsigned long size = 0; 
 
@@ -453,13 +467,14 @@
 		BUG_ON(s->length == 0); 
 
 		size += s->length; 
+		nextneed = need_iommu(dev, addr, s->length); 
 
 		/* Handle the previous not yet processed entries */
 		if (i > start) {
 			struct scatterlist *ps = &sg[i-1];
 			/* Can only merge when the last chunk ends on a page 
-			   boundary. */
-			if (!force_iommu || !need || (i-1 > start && ps->offset) ||
+			   boundary and the new one doesn't have an offset. */
+			if (!iommu_merge || !nextneed || !need || s->offset ||
 			    (ps->offset + ps->length) % PAGE_SIZE) { 
 				if (pci_map_cont(sg, start, i, sg+out, pages, 
 						 need) < 0)
@@ -470,7 +485,7 @@
 			}
 	}
 
-		need = need_iommu(dev, addr, s->length); 
+		need = nextneed;
 		pages += to_pages(s->offset, s->length);
 	}
 	if (pci_map_cont(sg, start, i, sg+out, pages, need) < 0)
@@ -544,14 +559,12 @@
 
 	   Problem with this is that if we overflow the IOMMU area
 	   and return DAC as fallback address the device may not handle it correctly.
-	   As a compromise we only do this if the IOMMU area is >= 256MB 
-	   which should make overflow unlikely enough.
 	   
 	   As a special case some controllers have a 39bit address mode 
 	   that is as efficient as 32bit (aic79xx). Don't force SAC for these.
 	   Assume all masks <= 40 bits are of this type. Normally this doesn't
 	   make any difference, but gives more gentle handling of IOMMU overflow. */
-	if (force_iommu && (mask > 0xffffffffffULL) && (iommu_size >= sac_force_size)){ 
+	if (iommu_sac_force && (mask >= 0xffffffffffULL)) { 
 		printk(KERN_INFO "%s: Force SAC with mask %Lx\n", dev->slot_name,mask);
 		return 0; 
 	}
@@ -680,7 +693,7 @@
 	unsigned long iommu_start;
 	struct pci_dev *dev;
 		
-#ifndef CONFIG_AGP_AMD_8151
+#ifndef CONFIG_AGP_AMD64
 	no_agp = 1; 
 #else
 	/* Makefile puts PCI initialization via subsys_initcall first. */
@@ -760,10 +773,9 @@
 	for_all_nb(dev) {
 		u32 flag; 
 		int cpu = PCI_SLOT(dev->devfn) - 24;
-		if (cpu >= NR_CPUS)
+		if (cpu >= MAX_NB)
 			continue;
 		northbridges[cpu] = dev;
-
 		pci_read_config_dword(dev, 0x9c, &flag); /* cache flush word */
 		northbridge_flush_word[cpu] = flag; 
 	}
@@ -776,7 +788,8 @@
 /* Must execute after PCI subsystem */
 fs_initcall(pci_iommu_init);
 
-/* iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]]
+/* iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
+         [,forcesac][,fullflush][,nomerge]
    size  set size of iommu (in bytes) 
    noagp don't initialize the AGP driver and use full aperture.
    off   don't use the IOMMU
@@ -784,6 +797,10 @@
    memaper[=order] allocate an own aperture over RAM with size 32MB^order.  
    noforce don't force IOMMU usage. Default.
    force  Force IOMMU.
+   merge  Do SG merging. Implies force (experimental)  
+   nomerge Don't do SG merging.
+   forcesac For SAC mode for masks <40bits  (experimental)
+   fullflush Flush IOMMU on each allocation (for testing)
 */
 __init int iommu_setup(char *opt) 
 { 
@@ -797,8 +814,10 @@
 		    no_iommu = 1;
 	    if (!memcmp(p,"force", 5))
 		    force_iommu = 1;
-	    if (!memcmp(p,"noforce", 7))
+	    if (!memcmp(p,"noforce", 7)) { 
+		    iommu_merge = 0;
 		    force_iommu = 0;
+	    }
 	    if (!memcmp(p, "memaper", 7)) { 
 		    fallback_aper_force = 1; 
 		    p += 7; 
@@ -809,6 +828,16 @@
 		    panic_on_overflow = 1;
 	    if (!memcmp(p, "nopanic", 7))
 		    panic_on_overflow = 0;	    
+	    if (!memcmp(p, "merge", 5)) { 
+		    iommu_merge = 1;
+		    force_iommu = 1; 
+	    }
+	    if (!memcmp(p, "nomerge", 7))
+		    iommu_merge = 0;
+	    if (!memcmp(p, "forcesac", 8))
+		    iommu_sac_force = 1;
+	    if (!memcmp(p, "fullflush", 9))
+		    iommu_fullflush = 1;
 #ifdef CONFIG_IOMMU_LEAK
 	    if (!memcmp(p,"leak", 4)) { 
 		    leak_trace = 1;
diff -Nru a/arch/x86_64/kernel/pci-nommu.c b/arch/x86_64/kernel/pci-nommu.c
--- a/arch/x86_64/kernel/pci-nommu.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/pci-nommu.c	Thu Jan  8 23:00:23 2004
@@ -4,6 +4,8 @@
 #include <linux/string.h>
 #include <asm/proto.h>
 
+int iommu_merge = 0;
+
 /* 
  * Dummy IO MMU functions
  */
diff -Nru a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c
--- a/arch/x86_64/kernel/process.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/process.c	Thu Jan  8 23:00:24 2004
@@ -152,6 +152,19 @@
 
 __setup("idle=", idle_setup);
 
+void idle_warning(void) 
+{ 
+	static int warned;
+	if (warned)
+		return; 
+	warned = 1;
+	if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) 
+		BUG();
+	printk(KERN_ERR "******* Your BIOS seems to not contain a fix for K8 errata #93\n"); 
+	printk(KERN_ERR "******* Working around it, but it will cost you a lot of power\n");
+	printk(KERN_ERR "******* Please consider a BIOS update.\n");
+	printk(KERN_ERR "******* Disabling USB legacy in the BIOS may also help.\n");
+} 
 
 /* Prints also some state that isn't saved in the pt_regs */ 
 void __show_regs(struct pt_regs * regs)
diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
--- a/arch/x86_64/kernel/setup.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/setup.c	Thu Jan  8 23:00:23 2004
@@ -237,6 +237,9 @@
 		}
 #endif
 
+		if (!memcmp(from,"oops=panic", 10))
+			panic_on_oops = 1;
+
 	next_char:
 		c = *(from++);
 		if (!c)
@@ -332,6 +335,7 @@
 void __init setup_arch(char **cmdline_p)
 {
 	unsigned long low_mem_size;
+	unsigned long kernel_end;
 
  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
  	drive_info = DRIVE_INFO;
@@ -380,7 +384,6 @@
 				(table_end - table_start) << PAGE_SHIFT);
 
 	/* reserve kernel */
-	unsigned long kernel_end;
 	kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE);
 	reserve_bootmem_generic(HIGH_MEMORY, kernel_end - HIGH_MEMORY);
 
diff -Nru a/arch/x86_64/kernel/signal.c b/arch/x86_64/kernel/signal.c
--- a/arch/x86_64/kernel/signal.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/signal.c	Thu Jan  8 23:00:24 2004
@@ -93,6 +93,8 @@
 {
 	unsigned int err = 0;
 
+	/* Always make any pending restarted system calls return -EINTR */
+	current_thread_info()->restart_block.fn = do_no_restart_syscall;
 
 #define COPY(x)		err |= __get_user(regs->x, &sc->x)
 
@@ -355,8 +357,6 @@
 		/* If so, check system call restarting.. */
 		switch (regs->rax) {
 		        case -ERESTART_RESTARTBLOCK:
-				current_thread_info()->restart_block.fn = do_no_restart_syscall;
-				/* FALL THROUGH */
 			case -ERESTARTNOHAND:
 				regs->rax = -EINTR;
 				break;
@@ -371,10 +371,6 @@
 				regs->rax = regs->orig_rax;
 				regs->rip -= 2;
 		}
-		if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK){
-			regs->rax = __NR_restart_syscall;
- 			regs->rip -= 2;
- 		}		
 	}
 
 #ifdef CONFIG_IA32_EMULATION
@@ -451,6 +447,10 @@
 		    res == -ERESTARTSYS ||
 		    res == -ERESTARTNOINTR) {
 			regs->rax = regs->orig_rax;
+			regs->rip -= 2;
+		}
+		if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK) {
+			regs->rax = __NR_restart_syscall;
 			regs->rip -= 2;
 		}
 	}
diff -Nru a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c
--- a/arch/x86_64/kernel/time.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/time.c	Thu Jan  8 23:00:24 2004
@@ -111,13 +111,14 @@
 		sec = xtime.tv_sec;
 		usec = xtime.tv_nsec / 1000;
 
-		/*
-		 * If time_adjust is negative then NTP is slowing the clock
-		 * so make sure not to go into next possible interval.
-		 * Better to lose some accuracy than have time go backwards..
-		 */
-		if (unlikely(time_adjust < 0) && usec > tickadj)
-			usec = tickadj;
+		/* i386 does some correction here to keep the clock 
+		   monotonus even when ntpd is fixing drift.
+		   But they didn't work for me, there is a non monotonic
+		   clock anyways with ntp.
+		   I dropped all corrections now until a real solution can
+		   be found. Note when you fix it here you need to do the same
+		   in arch/x86_64/kernel/vsyscall.c and export all needed
+		   variables in vmlinux.lds. -AK */ 
 
 		t = (jiffies - wall_jiffies) * (1000000L / HZ) +
 			do_gettimeoffset();
@@ -592,6 +593,7 @@
 	if (!vxtime.hpet_address)
 		return -1;
 	set_fixmap_nocache(FIX_HPET_BASE, vxtime.hpet_address);
+	__set_fixmap(VSYSCALL_HPET, vxtime.hpet_address, PAGE_KERNEL_VSYSCALL_NOCACHE);
 
 /*
  * Read the period, compute tick and quotient.
diff -Nru a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c
--- a/arch/x86_64/kernel/traps.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/kernel/traps.c	Thu Jan  8 23:00:23 2004
@@ -218,8 +218,12 @@
 	// debugging aid: "show_stack(NULL, NULL);" prints the
 	// back trace for this cpu.
 
-	if(rsp==NULL)
-		rsp=(unsigned long*)&rsp;
+	if (rsp == NULL) {
+		if (tsk)
+			rsp = (unsigned long *)tsk->thread.rsp;
+		else
+			rsp = (unsigned long *)&rsp;
+	}
 
 	stack = rsp;
 	for(i=0; i < kstack_depth_to_print; i++) {
@@ -341,6 +345,8 @@
 	bust_spinlocks(0); 
 	spin_unlock(&die_lock); 
 	local_irq_enable();	/* make sure back scroll still works */
+	if (panic_on_oops)
+		panic("Oops"); 
 } 
 
 void __die(const char * str, struct pt_regs * regs, long err)
@@ -349,8 +355,8 @@
 	printk(KERN_EMERG "%s: %04lx [%u]\n", str, err & 0xffff,++die_counter);
 	notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV);
 	show_registers(regs);
-	/* Execute summary in case the oops scrolled away */
-	printk(KERN_EMERG "RIP "); 
+	/* Executive summary in case the oops scrolled away */
+	printk("RIP "); 
 	printk_address(regs->rip); 
 	printk(" RSP <%016lx>\n", regs->rsp); 
 }
@@ -844,3 +850,11 @@
 	cpu_init();
 }
 
+
+/* Actual parsing is done early in setup.c. */
+static int __init oops_dummy(char *s)
+{ 
+	panic_on_oops = 1;
+	return -1; 
+} 
+__setup("oops=", oops_dummy); 
diff -Nru a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c
--- a/arch/x86_64/kernel/vsyscall.c	Thu Jan  8 23:00:24 2004
+++ b/arch/x86_64/kernel/vsyscall.c	Thu Jan  8 23:00:24 2004
@@ -49,6 +49,7 @@
 #include <asm/page.h>
 #include <asm/fixmap.h>
 #include <asm/errno.h>
+#include <asm/io.h>
 
 #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
 #define force_inline __attribute__((always_inline)) inline
@@ -88,11 +89,10 @@
 			if (t < __vxtime.last_tsc) t = __vxtime.last_tsc;
 			usec += ((t - __vxtime.last_tsc) *
 				 __vxtime.tsc_quot) >> 32;
+			/* See comment in x86_64 do_gettimeopfday. */ 
 		} else {
-#if 0
 			usec += ((readl(fix_to_virt(VSYSCALL_HPET) + 0xf0) -
 				  __vxtime.last) * __vxtime.quot) >> 32;
-#endif
 		}
 	} while (read_seqretry(&__xtime_lock, sequence));
 
diff -Nru a/arch/x86_64/lib/memset.S b/arch/x86_64/lib/memset.S
--- a/arch/x86_64/lib/memset.S	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/lib/memset.S	Thu Jan  8 23:00:23 2004
@@ -113,7 +113,7 @@
 	/* expand byte value  */
 	movzbl %sil,%esi
 	movabs $0x0101010101010101,%rax
-	mul    %esi		/* with rax, clobbers rdx */
+	mulq   %rsi		/* with rax, clobbers rdx */
 	rep
 	stosq	
 	movl %r8d,%ecx
diff -Nru a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c
--- a/arch/x86_64/mm/fault.c	Thu Jan  8 23:00:23 2004
+++ b/arch/x86_64/mm/fault.c	Thu Jan  8 23:00:23 2004
@@ -73,6 +73,9 @@
 	if (regs->cs & (1<<2))
 		return 0;
 
+	if ((regs->cs & 3) != 0 && regs->rip >= TASK_SIZE)
+		return 0;
+
 	while (scan_more && instr < max_instr) { 
 		unsigned char opcode;
 		unsigned char instr_hi;
@@ -337,7 +340,8 @@
 		}
        
 		tsk->thread.cr2 = address;
-		tsk->thread.error_code = error_code;
+		/* Kernel addresses are always protection faults */
+		tsk->thread.error_code = error_code | (address >= TASK_SIZE);
 		tsk->thread.trap_no = 14;
 		info.si_signo = SIGSEGV;
 		info.si_errno = 0;
@@ -374,7 +378,7 @@
 	printk_address(regs->rip);
 	dump_pagetable(address);
 	__die("Oops", regs, error_code);
-	/* Execute summary in case the body of the oops scrolled away */
+	/* Executive summary in case the body of the oops scrolled away */
 	printk(KERN_EMERG "CR2: %016lx\n", address);
 	oops_end(); 
 	do_exit(SIGKILL);
diff -Nru a/crypto/tcrypt.c b/crypto/tcrypt.c
--- a/crypto/tcrypt.c	Thu Jan  8 23:00:24 2004
+++ b/crypto/tcrypt.c	Thu Jan  8 23:00:24 2004
@@ -6,13 +6,16 @@
  *
  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
- * 
+ *
  * 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.
  *
+ * 14 - 09 - 2003 
+ *	Rewritten by Kartikey Mahendra Bhatt
  */
+
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/mm.h>
@@ -41,6 +44,16 @@
 #define IDX7		27333
 #define IDX8		3000
 
+/*
+* Used by test_cipher()
+*/
+#define ENCRYPT 1
+#define DECRYPT 0
+#define MODE_ECB 1
+#define MODE_CBC 0
+
+static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
+
 static int mode;
 static char *xbuf;
 static char *tvmem;
@@ -60,2332 +73,344 @@
 	printk("\n");
 }
 
-static void
-test_md5(void)
+static void 
+test_hash (char * algo, struct hash_testvec * template, unsigned int tcount)
 {
-	char *p;
-	unsigned int i;
-	struct scatterlist sg[2];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct md5_testvec *md5_tv;
-	unsigned int tsize;
+	char *p; 
+        unsigned int i, j, k, temp;
+        struct scatterlist sg[8];
+        char result[64];
+        struct crypto_tfm *tfm;
+        struct hash_testvec *hash_tv;
+        unsigned int tsize;
+	 
+        printk("\ntesting %s\n", algo);
 
-	printk("\ntesting md5\n");
-
-	tsize = sizeof (md5_tv_template);
+	tsize = sizeof (struct hash_testvec);
+	tsize *= tcount;
+	
 	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
+		printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
 		return;
 	}
 
-	memcpy(tvmem, md5_tv_template, tsize);
-	md5_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("md5", 0);
+	memcpy(tvmem, template, tsize);
+	hash_tv = (void *) tvmem;
+	tfm = crypto_alloc_tfm(algo, 0);
 	if (tfm == NULL) {
-		printk("failed to load transform for md5\n");
+		printk("failed to load transform for %s\n", algo);
 		return;
 	}
 
-	for (i = 0; i < MD5_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
+	for (i = 0; i < tcount; i++) {
+		printk ("test %u:\n", i + 1);
+		memset (result, 0, 64);
 
-		p = md5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(md5_tv[i].plaintext);
+		p = hash_tv[i].plaintext;
+		sg[0].page = virt_to_page (p);
+		sg[0].offset = offset_in_page (p);
+		sg[0].length = hash_tv[i].psize;
 
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
+		crypto_digest_init (tfm);
+		crypto_digest_update (tfm, sg, 1);
+		crypto_digest_final (tfm, result);
 
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
+		hexdump (result, crypto_tfm_alg_digestsize (tfm));
 		printk("%s\n",
-		       memcmp(result, md5_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
+			memcmp(result, hash_tv[i].digest,
+				crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+			"pass");
 	}
 
-	printk("\ntesting md5 across pages\n");
+	printk ("testing %s across pages\n", algo);
 
 	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
-	memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
+        memset(xbuf, 0, XBUFSIZE);
 
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 13;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 13;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, md5_tv[4].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-	crypto_free_tfm(tfm);
-}
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (hash_tv[i].np) {
+			j++;
+			printk ("test %u:\n", j);
+			memset (result, 0, 64);
 
-#ifdef CONFIG_CRYPTO_HMAC
-static void
-test_hmac_md5(void)
-{
-	char *p;
-	unsigned int i, klen;
-	struct scatterlist sg[2];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct hmac_md5_testvec *hmac_md5_tv;
-	unsigned int tsize;
+			temp = 0;
+			for (k = 0; k < hash_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp, 
+						hash_tv[i].tap[k]);	
+				temp += hash_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = hash_tv[i].tap[k];
+			}
 
-	tfm = crypto_alloc_tfm("md5", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for md5\n");
-		return;
+			crypto_digest_digest (tfm, sg, hash_tv[i].np, result);
+			
+			hexdump (result, crypto_tfm_alg_digestsize (tfm));
+			printk("%s\n",
+				memcmp(result, hash_tv[i].digest,
+					crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+				"pass");
+		}
 	}
-
-	printk("\ntesting hmac_md5\n");
 	
-	tsize = sizeof (hmac_md5_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-
-	memcpy(tvmem, hmac_md5_tv_template, tsize);
-	hmac_md5_tv = (void *) tvmem;
-
-	for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = hmac_md5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_md5_tv[i].plaintext);
-
-		klen = strlen(hmac_md5_tv[i].key);
-		crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, hmac_md5_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting hmac_md5 across pages\n");
-
-	memset(xbuf, 0, XBUFSIZE);
+	crypto_free_tfm (tfm);
+}
 
-	memcpy(&xbuf[IDX1], "what do ya want ", 16);
-	memcpy(&xbuf[IDX2], "for nothing?", 12);
 
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 16;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	memset(result, 0, sizeof (result));
-	klen = strlen(hmac_md5_tv[7].key);
-	crypto_hmac(tfm, hmac_md5_tv[7].key, &klen, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, hmac_md5_tv[7].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
-	crypto_free_tfm(tfm);
-}
+#ifdef CONFIG_CRYPTO_HMAC
 
 static void
-test_hmac_sha1(void)
+test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
 {
 	char *p;
-	unsigned int i, klen;
+	unsigned int i, j, k, temp;
+	struct scatterlist sg[8];
+	char result[64];
 	struct crypto_tfm *tfm;
-	struct hmac_sha1_testvec *hmac_sha1_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA1_DIGEST_SIZE];
+	struct hmac_testvec *hmac_tv;
+	unsigned int tsize, klen;
 
-	tfm = crypto_alloc_tfm("sha1", 0);
+	tfm = crypto_alloc_tfm(algo, 0);
 	if (tfm == NULL) {
-		printk("failed to load transform for sha1\n");
+		printk("failed to load transform for %s\n", algo);
 		return;
 	}
 
-	printk("\ntesting hmac_sha1\n");
-
-	tsize = sizeof (hmac_sha1_tv_template);
+	printk("\ntesting hmac_%s\n", algo);
+	
+	tsize = sizeof (struct hmac_testvec);
+	tsize *= tcount;
 	if (tsize > TVMEMSIZE) {
 		printk("template (%u) too big for tvmem (%u)\n", tsize,
 		       TVMEMSIZE);
 		goto out;
 	}
 
-	memcpy(tvmem, hmac_sha1_tv_template, tsize);
-	hmac_sha1_tv = (void *) tvmem;
+	memcpy(tvmem, template, tsize);
+	hmac_tv = (void *) tvmem;
 
-	for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
+	for (i = 0; i < tcount; i++) {
 		printk("test %u:\n", i + 1);
 		memset(result, 0, sizeof (result));
 
-		p = hmac_sha1_tv[i].plaintext;
+		p = hmac_tv[i].plaintext;
+		klen = hmac_tv[i].ksize;
 		sg[0].page = virt_to_page(p);
 		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_sha1_tv[i].plaintext);
+		sg[0].length = hmac_tv[i].psize;
 
-		klen = strlen(hmac_sha1_tv[i].key);
-		
-		crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
+		crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
 
-		hexdump(result, sizeof (result));
+		hexdump(result, crypto_tfm_alg_digestsize(tfm));
 		printk("%s\n",
-		       memcmp(result, hmac_sha1_tv[i].digest,
+		       memcmp(result, hmac_tv[i].digest,
 			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
 		       "pass");
 	}
 
-	printk("\ntesting hmac_sha1 across pages\n");
+	printk("\ntesting hmac_%s across pages\n", algo);
 
-	/* setup the dummy buffer first */
 	memset(xbuf, 0, XBUFSIZE);
-
-	memcpy(&xbuf[IDX1], "what do ya want ", 16);
-	memcpy(&xbuf[IDX2], "for nothing?", 12);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 16;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	memset(result, 0, sizeof (result));
-	klen = strlen(hmac_sha1_tv[7].key);
-	crypto_hmac(tfm, hmac_sha1_tv[7].key, &klen, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
-	printk("%s\n",
-	       memcmp(result, hmac_sha1_tv[7].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_hmac_sha256(void)
-{
-	char *p;
-	unsigned int i, klen;
-	struct crypto_tfm *tfm;
-	struct hmac_sha256_testvec *hmac_sha256_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA256_DIGEST_SIZE];
-
-	tfm = crypto_alloc_tfm("sha256", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha256\n");
-		return;
-	}
-
-	printk("\ntesting hmac_sha256\n");
-
-	tsize = sizeof (hmac_sha256_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-
-	memcpy(tvmem, hmac_sha256_tv_template, tsize);
-	hmac_sha256_tv = (void *) tvmem;
-
-	for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = hmac_sha256_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(hmac_sha256_tv[i].plaintext);
-
-		klen = strlen(hmac_sha256_tv[i].key);
 	
-		hexdump(hmac_sha256_tv[i].key, strlen(hmac_sha256_tv[i].key));
-		crypto_hmac(tfm, hmac_sha256_tv[i].key, &klen, sg, 1, result);
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, hmac_sha256_tv[i].digest,
-		       crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (hmac_tv[i].np) {
+			j++;
+			printk ("test %u:\n",j);
+			memset (result, 0, 64);
+
+			temp = 0;
+			klen = hmac_tv[i].ksize;
+			for (k = 0; k < hmac_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp, 
+						hmac_tv[i].tap[k]);	
+				temp += hmac_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = hmac_tv[i].tap[k];
+			}
+
+			crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np, 
+					result);
+			hexdump(result, crypto_tfm_alg_digestsize(tfm));
+			
+			printk("%s\n",
+				memcmp(result, hmac_tv[i].digest,
+					crypto_tfm_alg_digestsize(tfm)) ? "fail" : 
+				"pass");
+		}
 	}
-
 out:
 	crypto_free_tfm(tfm);
 }
 
 #endif	/* CONFIG_CRYPTO_HMAC */
 
-static void
-test_md4(void)
-{
-	char *p;
-	unsigned int i;
-	struct scatterlist sg[1];
-	char result[128];
-	struct crypto_tfm *tfm;
-	struct md4_testvec *md4_tv;
-	unsigned int tsize;
-
-	printk("\ntesting md4\n");
-
-	tsize = sizeof (md4_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, md4_tv_template, tsize);
-	md4_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("md4", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for md4\n");
-		return;
-	}
-
-	for (i = 0; i < MD4_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = md4_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(md4_tv[i].plaintext);
-
-		crypto_digest_digest(tfm, sg, 1, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, md4_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha1(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha1_testvec *sha1_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA1_DIGEST_SIZE];
-
-	printk("\ntesting sha1\n");
-
-	tsize = sizeof (sha1_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha1_tv_template, tsize);
-	sha1_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha1", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha1\n");
-		return;
-	}
-
-	for (i = 0; i < SHA1_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha1_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha1_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha1_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting sha1 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-	memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 28;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 28;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-	printk("%s\n",
-	       memcmp(result, sha1_tv[1].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha256(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha256_testvec *sha256_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA256_DIGEST_SIZE];
-
-	printk("\ntesting sha256\n");
-
-	tsize = sizeof (sha256_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha256_tv_template, tsize);
-	sha256_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha256", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha256\n");
-		return;
-	}
-
-	for (i = 0; i < SHA256_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha256_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha256_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha256_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	printk("\ntesting sha256 across pages\n");
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-	memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-	memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 28;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 28;
-
-	memset(result, 0, sizeof (result));
-	crypto_digest_digest(tfm, sg, 2, result);
-	hexdump(result, crypto_tfm_alg_digestsize(tfm));
-	printk("%s\n",
-	       memcmp(result, sha256_tv[1].digest,
-		      crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-		     
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha384(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha384_testvec *sha384_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA384_DIGEST_SIZE];
-
-	printk("\ntesting sha384\n");
-
-	tsize = sizeof (sha384_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha384_tv_template, tsize);
-	sha384_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha384", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha384\n");
-		return;
-	}
-
-	for (i = 0; i < SHA384_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha384_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha384_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha384_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_sha512(void)
-{
-	char *p;
-	unsigned int i;
-	struct crypto_tfm *tfm;
-	struct sha512_testvec *sha512_tv;
-	struct scatterlist sg[2];
-	unsigned int tsize;
-	char result[SHA512_DIGEST_SIZE];
-
-	printk("\ntesting sha512\n");
-
-	tsize = sizeof (sha512_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, sha512_tv_template, tsize);
-	sha512_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("sha512", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for sha512\n");
-		return;
-	}
-
-	for (i = 0; i < SHA512_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-		memset(result, 0, sizeof (result));
-
-		p = sha512_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = strlen(sha512_tv[i].plaintext);
-
-		crypto_digest_init(tfm);
-		crypto_digest_update(tfm, sg, 1);
-		crypto_digest_final(tfm, result);
-
-		hexdump(result, crypto_tfm_alg_digestsize(tfm));
-		printk("%s\n",
-		       memcmp(result, sha512_tv[i].digest,
-			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-		       "pass");
-	}
-
-	crypto_free_tfm(tfm);
-}
-
 void
-test_des(void)
+test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount)
 {
-	unsigned int ret, i, len;
+	unsigned int ret, i, j, k, temp;
 	unsigned int tsize;
 	char *p, *q;
 	struct crypto_tfm *tfm;
 	char *key;
-	char res[8];
-	struct des_tv *des_tv;
+	struct cipher_testvec *cipher_tv;
 	struct scatterlist sg[8];
+	char e[11], m[4];
 
-	printk("\ntesting des encryption\n");
-
-	tsize = sizeof (des_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("des", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for des (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
-	}
-
-	printk("\ntesting des ecb encryption across pages\n");
-
-	i = 5;
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	hexdump(key, 8);
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 8;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario A\n");
-
-	/*
-	 * Scenario A:
-	 * 
-	 *  F1       F2      F3
-	 *  [8 + 6]  [2 + 8] [8]
-	 *       ^^^^^^   ^
-	 *       a    b   c
-	 *
-	 * Chunking should begin at a, then end with b, and
-	 * continue encrypting at an offset of 2 until c.
-	 *
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 8 + 6 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
-
-	/* Frag 2: 2 + 8 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
-
-	/* Frag 3: 8 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 14;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 10;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
-
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 14);
-	printk("%s\n", memcmp(q, des_tv[i].result, 14) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 10);
-	printk("%s\n", memcmp(q, des_tv[i].result + 14, 10) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 24, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario B\n");
-
-	/*
-	 * Scenario B:
-	 * 
-	 *  F1  F2  F3  F4
-	 *  [2] [1] [3] [2 + 8 + 8]
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 2 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
-	/* Frag 2: 1 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
-
-	/* Frag 3: 3 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
-
-	/* Frag 4: 2 + 8 + 8 */
-	memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 2;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 1;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 3;
-
-	p = &xbuf[IDX6];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 18;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 1);
-	printk("%s\n", memcmp(q, des_tv[i].result + 2, 1) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 3);
-	printk("%s\n", memcmp(q, des_tv[i].result + 3, 3) ? "fail" : "pass");
-
-	printk("page 4\n");
-	q = kmap(sg[3].page) + sg[3].offset;
-	hexdump(q, 18);
-	printk("%s\n", memcmp(q, des_tv[i].result + 6, 18) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario C\n");
-
-	/*
-	 * Scenario B:
-	 * 
-	 *  F1  F2  F3  F4  F5
-	 *  [2] [2] [2] [2] [8]
-	 */
-	i = 7;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	/* Frag 1: 2 */
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
-	/* Frag 2: 2 */
-	memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
-
-	/* Frag 3: 2 */
-	memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
-
-	/* Frag 4: 2 */
-	memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
-
-	/* Frag 5: 8 */
-	memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX3];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 2;
-
-	p = &xbuf[IDX4];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 2;
-
-	p = &xbuf[IDX5];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 2;
-
-	p = &xbuf[IDX6];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 2;
-
-	p = &xbuf[IDX7];
-	sg[4].page = virt_to_page(p);
-	sg[4].offset = offset_in_page(p);
-	sg[4].length = 8;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 2, 2) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 4, 2) ? "fail" : "pass");
-
-	printk("page 4\n");
-	q = kmap(sg[3].page) + sg[3].offset;
-	hexdump(q, 2);
-	printk("%s\n", memcmp(q, des_tv[i].result + 6, 2) ? "fail" : "pass");
-
-	printk("page 5\n");
-	q = kmap(sg[4].page) + sg[4].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	printk("\ntesting des ecb encryption chunking scenario D\n");
-
-	/*
-	 * Scenario D, torture test, one byte per frag.
-	 */
-	i = 7;
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, XBUFSIZE);
-
-	xbuf[IDX1] = des_tv[i].plaintext[0];
-	xbuf[IDX2] = des_tv[i].plaintext[1];
-	xbuf[IDX3] = des_tv[i].plaintext[2];
-	xbuf[IDX4] = des_tv[i].plaintext[3];
-	xbuf[IDX5] = des_tv[i].plaintext[4];
-	xbuf[IDX6] = des_tv[i].plaintext[5];
-	xbuf[IDX7] = des_tv[i].plaintext[6];
-	xbuf[IDX8] = des_tv[i].plaintext[7];
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 1;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 1;
-
-	p = &xbuf[IDX3];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 1;
-
-	p = &xbuf[IDX4];
-	sg[3].page = virt_to_page(p);
-	sg[3].offset = offset_in_page(p);
-	sg[3].length = 1;
-
-	p = &xbuf[IDX5];
-	sg[4].page = virt_to_page(p);
-	sg[4].offset = offset_in_page(p);
-	sg[4].length = 1;
-
-	p = &xbuf[IDX6];
-	sg[5].page = virt_to_page(p);
-	sg[5].offset = offset_in_page(p);
-	sg[5].length = 1;
-
-	p = &xbuf[IDX7];
-	sg[6].page = virt_to_page(p);
-	sg[6].offset = offset_in_page(p);
-	sg[6].length = 1;
-
-	p = &xbuf[IDX8];
-	sg[7].page = virt_to_page(p);
-	sg[7].offset = offset_in_page(p);
-	sg[7].length = 1;
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 8);
-	if (ret) {
-		printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	for (i = 0; i < 8; i++)
-		res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
+	if (enc == ENCRYPT)
+	        strncpy(e, "encryption", 11);
+	else
+        	strncpy(e, "decryption", 11);
+	if (mode == MODE_ECB)
+        	strncpy(m, "ECB", 4);
+	else
+        	strncpy(m, "CBC", 4);
 
-	hexdump(res, 8);
-	printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
+	printk("\ntesting %s %s %s \n", algo, m, e);
 
-	printk("\ntesting des decryption\n");
-
-	tsize = sizeof (des_dec_tv_template);
+	tsize = sizeof (struct cipher_testvec);	
+	tsize *= tcount;
+	
 	if (tsize > TVMEMSIZE) {
 		printk("template (%u) too big for tvmem (%u)\n", tsize,
 		       TVMEMSIZE);
 		return;
 	}
-	memcpy(tvmem, des_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-
-		tfm->crt_flags = 0;
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("des_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
-	}
-
-	printk("\ntesting des ecb decryption across pages\n");
-
-	i = 6;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
 
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 8;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 8;
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 8);
-	printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
-	/*
-	 * Scenario E:
-	 * 
-	 *  F1   F2      F3
-	 *  [3]  [5 + 7] [1]
-	 *
-	 */
-	printk("\ntesting des ecb decryption chunking scenario E\n");
-	i = 2;
-
-	key = des_tv[i].key;
-	tfm->crt_flags = 0;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 3);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 3, 12);
-	memcpy(&xbuf[IDX3], des_tv[i].plaintext + 15, 1);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 3;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 12;
-
-	p = &xbuf[IDX3];
-	sg[2].page = virt_to_page(p);
-	sg[2].offset = offset_in_page(p);
-	sg[2].length = 1;
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-
-	if (ret) {
-		printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 3);
-	printk("%s\n", memcmp(q, des_tv[i].result, 3) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 12);
-	printk("%s\n", memcmp(q, des_tv[i].result + 3, 12) ? "fail" : "pass");
-
-	printk("page 3\n");
-	q = kmap(sg[2].page) + sg[2].offset;
-	hexdump(q, 1);
-	printk("%s\n", memcmp(q, des_tv[i].result + 15, 1) ? "fail" : "pass");
-
-	crypto_free_tfm(tfm);
+	memcpy(tvmem, template, tsize);
+	cipher_tv = (void *) tvmem;
 
-	tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
+	if (mode) 
+		tfm = crypto_alloc_tfm (algo, 0);
+	else 
+		tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC);
+	
 	if (tfm == NULL) {
-		printk("failed to load transform for des cbc\n");
-		return;
-	}
-
-	printk("\ntesting des cbc encryption\n");
-
-	tsize = sizeof (des_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
+		printk("failed to load transform for %s %s\n", algo, m);
 		return;
 	}
-	memcpy(tvmem, des_cbc_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
+	
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (!(cipher_tv[i].np)) {
+			j++;	
+			printk("test %u (%d bit key):\n",
+			j, cipher_tv[i].klen * 8);
 
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-	crypto_cipher_get_iv(tfm, res, crypto_tfm_alg_ivsize(tfm));
+			tfm->crt_flags = 0;
+			if (cipher_tv[i].wk) 
+				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+			key = cipher_tv[i].key;
 	
-	if (memcmp(res, des_tv[i].iv, sizeof(res))) {
-		printk("crypto_cipher_[set|get]_iv() failed\n");
-		goto out;
-	}
+			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
+			if (ret) {
+				printk("setkey() failed flags=%x\n", tfm->crt_flags);
 	
-	for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-		p = des_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		crypto_cipher_set_iv(tfm, des_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("des_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	crypto_free_tfm(tfm);
-
-	/*
-	 * Scenario F:
-	 * 
-	 *  F1       F2      
-	 *  [8 + 5]  [3 + 8]
-	 *
-	 */
-	printk("\ntesting des cbc encryption chunking scenario F\n");
-	i = 4;
-
-	tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
-		return;
-	}
-
-	tfm->crt_flags = 0;
-	key = des_tv[i].key;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 13;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 11;
-
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
-	ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-	if (ret) {
-		printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 13);
-	printk("%s\n", memcmp(q, des_tv[i].result, 13) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 11);
-	printk("%s\n", memcmp(q, des_tv[i].result + 13, 11) ? "fail" : "pass");
-
-	tsize = sizeof (des_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-	memcpy(tvmem, des_cbc_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	printk("\ntesting des cbc decryption\n");
-
-	for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		tfm->crt_flags = 0;
-		key = des_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, 8);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		len = des_tv[i].len;
-		p = des_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-
-		crypto_cipher_set_iv(tfm, des_tv[i].iv,
-				      crypto_tfm_alg_blocksize(tfm));
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("des_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		hexdump(tfm->crt_cipher.cit_iv, 8);
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	/*
-	 * Scenario G:
-	 * 
-	 *  F1   F2      
-	 *  [4]  [4]
-	 *
-	 */
-	printk("\ntesting des cbc decryption chunking scenario G\n");
-	i = 3;
-
-	tfm->crt_flags = 0;
-	key = des_tv[i].key;
-
-	ret = crypto_cipher_setkey(tfm, key, 8);
-	if (ret) {
-		printk("setkey() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
-
-	/* setup the dummy buffer first */
-	memset(xbuf, 0, sizeof (xbuf));
-	memcpy(&xbuf[IDX1], des_tv[i].plaintext, 4);
-	memcpy(&xbuf[IDX2], des_tv[i].plaintext + 4, 4);
-
-	p = &xbuf[IDX1];
-	sg[0].page = virt_to_page(p);
-	sg[0].offset = offset_in_page(p);
-	sg[0].length = 4;
-
-	p = &xbuf[IDX2];
-	sg[1].page = virt_to_page(p);
-	sg[1].offset = offset_in_page(p);
-	sg[1].length = 4;
-
-	crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
-	ret = crypto_cipher_decrypt(tfm, sg, sg, 8);
-	if (ret) {
-		printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-		goto out;
-	}
+				if (!cipher_tv[i].fail)
+					goto out;
+			}	
 
-	printk("page 1\n");
-	q = kmap(sg[0].page) + sg[0].offset;
-	hexdump(q, 4);
-	printk("%s\n", memcmp(q, des_tv[i].result, 4) ? "fail" : "pass");
-
-	printk("page 2\n");
-	q = kmap(sg[1].page) + sg[1].offset;
-	hexdump(q, 4);
-	printk("%s\n", memcmp(q, des_tv[i].result + 4, 4) ? "fail" : "pass");
-
-      out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_des3_ede(void)
-{
-	unsigned int ret, i, len;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	/*char res[8]; */
-	struct des_tv *des_tv;
-	struct scatterlist sg[8];
-
-	printk("\ntesting des3 ede encryption\n");
-
-	tsize = sizeof (des3_ede_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des3_ede_enc_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB);
-	if (tfm == NULL) {
-		printk("failed to load transform for 3des ecb\n");
-		return;
-	}
-
-	for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		ret = crypto_cipher_setkey(tfm, key, 24);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-	printk("\ntesting des3 ede decryption\n");
-
-	tsize = sizeof (des3_ede_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, des3_ede_dec_tv_template, tsize);
-	des_tv = (void *) tvmem;
-
-	for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
-		printk("test %u:\n", i + 1);
-
-		key = des_tv[i].key;
-		ret = crypto_cipher_setkey(tfm, key, 24);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!des_tv[i].fail)
-				goto out;
-		}
-
-		len = des_tv[i].len;
-
-		p = des_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = len;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, len);
-
-		printk("%s\n",
-		       memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-	}
-
-      out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_blowfish(void)
-{
-	unsigned int ret, i;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	struct bf_tv *bf_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting blowfish encryption\n");
-
-	tsize = sizeof (bf_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, bf_enc_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("blowfish", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < BF_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!bf_tv[i].fail)
-				goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = bf_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	printk("\ntesting blowfish decryption\n");
-
-	tsize = sizeof (bf_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, bf_dec_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!bf_tv[i].fail)
+			p = cipher_tv[i].input;
+			sg[0].page = virt_to_page(p);
+			sg[0].offset = offset_in_page(p);
+			sg[0].length = cipher_tv[i].ilen;
+	
+			if (!mode) {
+				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+					crypto_tfm_alg_ivsize (tfm));
+			}
+		
+			if (enc)
+				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			else
+				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			
+				
+			if (ret) {
+				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
 				goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = bf_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
+			}	
 	
-	crypto_free_tfm(tfm);
+			q = kmap(sg[0].page) + sg[0].offset;
+			hexdump(q, cipher_tv[i].rlen);
 	
-	tfm = crypto_alloc_tfm("blowfish", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish cbc\n");
-		return;
-	}
-
-	printk("\ntesting blowfish cbc encryption\n");
-
-	tsize = sizeof (bf_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  bf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-	printk("\ntesting blowfish cbc decryption\n");
-
-	tsize = sizeof (bf_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
-	bf_tv = (void *) tvmem;
-
-	for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, bf_tv[i].keylen * 8);
-		key = bf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = bf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  bf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
+			printk("%s\n", 
+				memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" : 
+			"pass");
 		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, bf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-
-void
-test_twofish(void)
-{
-	unsigned int ret, i;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	struct tf_tv *tf_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting twofish encryption\n");
-
-	tsize = sizeof (tf_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
 	}
-
-	memcpy(tvmem, tf_enc_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("twofish", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for blowfish (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < TF_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!tf_tv[i].fail)
-				goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = tf_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	printk("\ntesting twofish decryption\n");
-
-	tsize = sizeof (tf_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, tf_dec_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!tf_tv[i].fail)
-				goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = tf_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-			"fail" : "pass");
-	}
-
-	crypto_free_tfm(tfm);
 	
-	tfm = crypto_alloc_tfm("twofish", CRYPTO_TFM_MODE_CBC);
-	if (tfm == NULL) {
-		printk("failed to load transform for twofish cbc\n");
-		return;
-	}
-
-	printk("\ntesting twofish cbc encryption\n");
-
-	tsize = sizeof (tf_cbc_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_CBC_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  tf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_encrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-	printk("\ntesting twofish cbc decryption\n");
-
-	tsize = sizeof (tf_cbc_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		goto out;
-	}
-	memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
-	tf_tv = (void *) tvmem;
-
-	for (i = 0; i < TF_CBC_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, tf_tv[i].keylen * 8);
-
-		key = tf_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		p = tf_tv[i].plaintext;
-
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length =  tf_tv[i].plen;
-
-		crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-				     crypto_tfm_alg_ivsize(tfm));
-
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("blowfish_cbc_decrypt() failed flags=%x\n",
-			       tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, tf_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-			? "fail" : "pass");
-	}
-
-out:	
-	crypto_free_tfm(tfm);
-}
-
-void
-test_serpent(void)
-{
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
-	struct crypto_tfm *tfm;
-	struct serpent_tv *serp_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting serpent encryption\n");
-
-	tfm = crypto_alloc_tfm("serpent", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for serpent (default ecb)\n");
-		return;
-	}
-
-	tsize = sizeof (serpent_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, serpent_enc_tv_template, tsize);
-	serp_tv = (void *) tvmem;
-	for (i = 0; i < SERPENT_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-		key = serp_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!serp_tv[i].fail)
-				goto out;
-		}
-
-		p = serp_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = sizeof(serp_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(serp_tv[i].result));
-
-		printk("%s\n", memcmp(q, serp_tv[i].result,
-			sizeof(serp_tv[i].result)) ? "fail" : "pass");
-	}
-
-	printk("\ntesting serpent decryption\n");
-
-	tsize = sizeof (serpent_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, serpent_dec_tv_template, tsize);
-	serp_tv = (void *) tvmem;
-	for (i = 0; i < SERPENT_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-		key = serp_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!serp_tv[i].fail)
-				goto out;
-		}
-
-		p = serp_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = sizeof(serp_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(serp_tv[i].result));
-
-		printk("%s\n", memcmp(q, serp_tv[i].result,
-			sizeof(serp_tv[i].result)) ? "fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-static void
-test_cast6(void)
-{
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
-	struct crypto_tfm *tfm;
-	struct cast6_tv *cast_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting cast6 encryption\n");
-
-	tfm = crypto_alloc_tfm("cast6", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for cast6 (default ecb)\n");
-		return;
-	}
-
-	tsize = sizeof (cast6_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, cast6_enc_tv_template, tsize);
-	cast_tv = (void *) tvmem;
-	for (i = 0; i < CAST6_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-		key = cast_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!cast_tv[i].fail)
-				goto out;
-		}
-
-		p = cast_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(cast_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(cast_tv[i].result));
-
-		printk("%s\n", memcmp(q, cast_tv[i].result,
-			sizeof(cast_tv[i].result)) ? "fail" : "pass");
-	}
-
-	printk("\ntesting cast6 decryption\n");
-
-	tsize = sizeof (cast6_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, cast6_dec_tv_template, tsize);
-	cast_tv = (void *) tvmem;
-	for (i = 0; i < CAST6_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-		key = cast_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!cast_tv[i].fail)
-				goto out;
-		}
-
-		p = cast_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(cast_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(cast_tv[i].result));
-
-		printk("%s\n", memcmp(q, cast_tv[i].result,
-			sizeof(cast_tv[i].result)) ? "fail" : "pass");
-	}
-
-out:
-	crypto_free_tfm(tfm);
-}
-
-void
-test_aes(void)
-{
-	unsigned int ret, i;
-	unsigned int tsize;
-	char *p, *q;
-	struct crypto_tfm *tfm;
-	char *key;
-	struct aes_tv *aes_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting aes encryption\n");
-
-	tsize = sizeof (aes_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, aes_enc_tv_template, tsize);
-	aes_tv = (void *) tvmem;
-
-	tfm = crypto_alloc_tfm("aes", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for aes (default ecb)\n");
-		return;
-	}
-
-	for (i = 0; i < AES_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, aes_tv[i].keylen * 8);
-		key = aes_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!aes_tv[i].fail)
-				goto out;
-		}
-
-		p = aes_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = aes_tv[i].plen;
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, aes_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-			"fail" : "pass");
-	}
+	printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e);
+	memset(xbuf, 0, XBUFSIZE);
 	
-	printk("\ntesting aes decryption\n");
-
-	tsize = sizeof (aes_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, aes_dec_tv_template, tsize);
-	aes_tv = (void *) tvmem;
-
-	for (i = 0; i < AES_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n",
-			i + 1, aes_tv[i].keylen * 8);
-		key = aes_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!aes_tv[i].fail)
-				goto out;
-		}
-
-		p = aes_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = offset_in_page(p);
-		sg[0].length = aes_tv[i].plen;
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
+	j = 0;
+	for (i = 0; i < tcount; i++) {
+		if (cipher_tv[i].np) {
+			j++;				
+			printk("test %u (%d bit key):\n",
+			j, cipher_tv[i].klen * 8);
+
+			tfm->crt_flags = 0;			
+			if (cipher_tv[i].wk) 
+				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+			key = cipher_tv[i].key;
+			
+			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);		
+			if (ret) {
+				printk("setkey() failed flags=%x\n", tfm->crt_flags);
+				
+				if (!cipher_tv[i].fail)
+					goto out;
+			}
+
+			temp = 0;
+			for (k = 0; k < cipher_tv[i].np; k++) {
+				memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp, 
+						cipher_tv[i].tap[k]);	
+				temp += cipher_tv[i].tap[k];
+				p = &xbuf[IDX[k]];
+				sg[k].page = virt_to_page (p);
+				sg[k].offset = offset_in_page (p);
+				sg[k].length = cipher_tv[i].tap[k];
+			}
+			
+			if (!mode) {
+				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+						crypto_tfm_alg_ivsize (tfm));
+			}
+			
+			if (enc)
+				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			else
+				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+			
+			if (ret) {
+				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
+				goto out;
+			}
+
+			temp = 0;
+			for (k = 0; k < cipher_tv[i].np; k++) {
+				printk("page %u\n", k);
+				q = kmap(sg[k].page) + sg[k].offset;
+				hexdump(q, cipher_tv[i].tap[k]);
+				printk("%s\n", 
+					memcmp(q, cipher_tv[i].result + temp, 
+						cipher_tv[i].tap[k]) ? "fail" : 
+					"pass");
+				temp += cipher_tv[i].tap[k];
+			}
 		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, aes_tv[i].rlen);
-
-		printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-			"fail" : "pass");
 	}
 
 out:
 	crypto_free_tfm(tfm);
 }
 
-void
-test_cast5(void)
-{
-	unsigned int ret, i, tsize;
-	u8 *p, *q, *key;
-	struct crypto_tfm *tfm;
-	struct cast5_tv *c5_tv;
-	struct scatterlist sg[1];
-
-	printk("\ntesting cast5 encryption\n");
-
-	tfm = crypto_alloc_tfm("cast5", 0);
-	if (tfm == NULL) {
-		printk("failed to load transform for cast5 (default ecb)\n");
-		return;
-	}
-
-	tsize = sizeof (cast5_enc_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, cast5_enc_tv_template, tsize);
-	c5_tv = (void *) tvmem;
-	for (i = 0; i < CAST5_ENC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-		key = c5_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!c5_tv[i].fail)
-				goto out;
-		}
-
-		p = c5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(c5_tv[i].plaintext);
-		ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(c5_tv[i].ciphertext));
-
-		printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-			sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
-	}
-	
-	tsize = sizeof (cast5_dec_tv_template);
-	if (tsize > TVMEMSIZE) {
-		printk("template (%u) too big for tvmem (%u)\n", tsize,
-		       TVMEMSIZE);
-		return;
-	}
-
-	memcpy(tvmem, cast5_dec_tv_template, tsize);
-	c5_tv = (void *) tvmem;
-	for (i = 0; i < CAST5_DEC_TEST_VECTORS; i++) {
-		printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-		key = c5_tv[i].key;
-
-		ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-		if (ret) {
-			printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
-			if (!c5_tv[i].fail)
-				goto out;
-		}
-
-		p = c5_tv[i].plaintext;
-		sg[0].page = virt_to_page(p);
-		sg[0].offset = ((long) p & ~PAGE_MASK);
-		sg[0].length = sizeof(c5_tv[i].plaintext);
-		ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-		if (ret) {
-			printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-			goto out;
-		}
-
-		q = kmap(sg[0].page) + sg[0].offset;
-		hexdump(q, sizeof(c5_tv[i].ciphertext));
-
-		printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-			sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
-	}
-out:
-	crypto_free_tfm (tfm);
-}
-
 static void
 test_deflate(void)
 {
@@ -2485,75 +510,118 @@
 	switch (mode) {
 
 	case 0:
-		test_md5();
-		test_sha1();
-		test_des();
-		test_des3_ede();
-		test_md4();
-		test_sha256();
-		test_blowfish();
-		test_twofish();
-		test_serpent();
-		test_cast6();
-		test_aes();
-		test_sha384();
-		test_sha512();
-		test_deflate();
-		test_cast5();
-		test_cast6();
+		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
+		
+		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
+		
+		//DES
+		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+                test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+                test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+                test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
+	
+		//DES3_EDE
+		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+                test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
+		
+		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
+		
+		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
+		
+		//BLOWFISH
+		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
+		
+		//TWOFISH
+		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
+		
+		//SERPENT
+		test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
+		test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
+		
+		//AES
+		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
+
+		//CAST5
+		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
+		
+		//CAST6
+		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
+
+		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
+		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
+		test_deflate();		
 #ifdef CONFIG_CRYPTO_HMAC
-		test_hmac_md5();
-		test_hmac_sha1();
-		test_hmac_sha256();
+		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
+		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);		
+		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
 #endif		
 		break;
 
 	case 1:
-		test_md5();
+		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
 		break;
 
 	case 2:
-		test_sha1();
+		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
 		break;
 
 	case 3:
-		test_des();
+		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+		test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+		test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+		test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
 		break;
 
 	case 4:
-		test_des3_ede();
+		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+                test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
 		break;
 
 	case 5:
-		test_md4();
+		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
 		break;
 		
 	case 6:
-		test_sha256();
+		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
 		break;
 	
 	case 7:
-		test_blowfish();
+		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
 		break;
 
 	case 8:
-		test_twofish();
+		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
 		break;
-
+		
 	case 9:
-		test_serpent();
 		break;
 
 	case 10:
-		test_aes();
+		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);	
 		break;
 
 	case 11:
-		test_sha384();
+		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
 		break;
 		
 	case 12:
-		test_sha512();
+		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
 		break;
 
 	case 13:
@@ -2561,24 +629,26 @@
 		break;
 
 	case 14:
-		test_cast5();
+		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
 		break;
 
 	case 15:
-		test_cast6();
+		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
 		break;
 
 #ifdef CONFIG_CRYPTO_HMAC
 	case 100:
-		test_hmac_md5();
+		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
 		break;
 		
 	case 101:
-		test_hmac_sha1();
+		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);		
 		break;
 	
 	case 102:
-		test_hmac_sha256();
+		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
 		break;
 
 #endif
@@ -2614,7 +684,14 @@
 	return 0;
 }
 
+/*
+ * If an init function is provided, an exit function must also be provided
+ * to allow module unload.
+ */
+static void __exit fini(void) { }
+
 module_init(init);
+module_exit(fini);
 
 MODULE_PARM(mode, "i");
 
diff -Nru a/crypto/tcrypt.h b/crypto/tcrypt.h
--- a/crypto/tcrypt.h	Thu Jan  8 23:00:24 2004
+++ b/crypto/tcrypt.h	Thu Jan  8 23:00:24 2004
@@ -1,4 +1,4 @@
-/* 
+/*
  * Quick & dirty crypto testing module.
  *
  * This will only exist until we have a better testing mechanism
@@ -6,565 +6,165 @@
  *
  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
- * 
+ *
  * 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.
  *
+ * 14 - 09 - 2003 Changes by Kartikey Mahendra Bhatt
+ *
  */
 #ifndef _CRYPTO_TCRYPT_H
 #define _CRYPTO_TCRYPT_H
 
-#define MD5_DIGEST_SIZE		16
-#define MD4_DIGEST_SIZE		16
-#define SHA1_DIGEST_SIZE	20
-#define SHA256_DIGEST_SIZE	32
-#define SHA384_DIGEST_SIZE	48
-#define SHA512_DIGEST_SIZE	64
-
-/*
- * MD4 test vectors from RFC1320
- */
-#define MD4_TEST_VECTORS	7
-
-struct md4_testvec {
-	char plaintext[128];
-	char digest[MD4_DIGEST_SIZE];
-} md4_tv_template[] = {
-	{ "",
-		{ 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
-		  0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 }
-	},
-	
-	{ "a",
-		{ 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
-		  0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 }
-	},
-
-	{ "abc",
-		{ 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
-		  0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d }
-	},
-	
-	{ "message digest",
-		{ 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
-		  0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyz",
-		{ 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
-		  0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 }
-	},
-		
-	{ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-		{ 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
-		  0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 }
-	},
-	
-	{ "123456789012345678901234567890123456789012345678901234567890123"
-	  "45678901234567890",
-		{ 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
-		  0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 }
-	},
-};
+#define MAX_DIGEST_SIZE		64
+#define MAX_TAP			8
 
-/*
- * MD5 test vectors from RFC1321
- */
-#define MD5_TEST_VECTORS	7
+#define MAX_KEYLEN		56
+#define MAX_IVLEN		32
 
-struct md5_testvec {
+struct hash_testvec {
 	char plaintext[128];
-	char digest[MD5_DIGEST_SIZE];
-} md5_tv_template[] = {
-	{ "",
-		{ 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
-		  0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e } },
-	        	
-	{ "a",
-		{ 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
-		  0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 } },
-		  
-	{ "abc",
-		{ 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
-		  0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 } }, 
-		  
-	{ "message digest",
-		{ 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
-		  0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 } },
-		  
-	{ "abcdefghijklmnopqrstuvwxyz",
-		{ 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
-		  0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b } },
-		  
-	{ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-		{ 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
-		  0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f } },
-		  
-	{ "12345678901234567890123456789012345678901234567890123456789012"
-	  "345678901234567890",
-		{ 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
-		  0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a } }
+	unsigned char psize;
+	char digest[MAX_DIGEST_SIZE];
+	unsigned char np;
+	unsigned char tap[MAX_TAP];		
 };
 
-#ifdef CONFIG_CRYPTO_HMAC
-/*
- * HMAC-MD5 test vectors from RFC2202
- * (These need to be fixed to not use strlen).
- */
-#define HMAC_MD5_TEST_VECTORS	7
-
-struct hmac_md5_testvec {
+struct hmac_testvec {	
 	char key[128];
+	unsigned char ksize;
 	char plaintext[128];
-	char digest[MD5_DIGEST_SIZE];
+	unsigned char psize;
+	char digest[MAX_DIGEST_SIZE];
+	unsigned char np;
+	unsigned char tap[MAX_TAP];		
 };
 
-struct hmac_md5_testvec hmac_md5_tv_template[] =
-{
-	
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00},
-		  
-		"Hi There",
-		
-		{ 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
-		  0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d }
-	},
-	    
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-		
-		{ 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-		  0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		  
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0x00 },
-		  
-		{ 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
-		  0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
-		  
-		{ 
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0x00 },
-		  
-		{ 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
-		  0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 }
-	},
-	
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
-		  
-		"Test With Truncation",
-		
-		{ 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
-		  0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		  
-		"Test Using Larger Than Block-Size Key - Hash Key First",
-		
-		{ 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
-		  0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		
-		"Test Using Larger Than Block-Size Key and Larger Than One "
-		"Block-Size Data",
-		
-		{ 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
-		  0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e }
-	},
-	
-	/* cross page test, need to retain key */
-	
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-		
-		{ 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-		  0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-	},
-	
+struct cipher_testvec {
+	unsigned char fail;
+	unsigned char wk; /* weak key flag */
+	char key[MAX_KEYLEN];
+	unsigned char klen;
+	char iv[MAX_IVLEN];
+	char input[48];
+	unsigned char ilen;
+	char result[48];
+	unsigned char rlen;
+	int np;
+	unsigned char tap[MAX_TAP];	
 };
 
-	
 /*
- * HMAC-SHA1 test vectors from RFC2202
+ * MD4 test vectors from RFC1320
  */
+#define MD4_TEST_VECTORS	7
 
-#define HMAC_SHA1_TEST_VECTORS	7
-
-struct hmac_sha1_testvec {
-	char key[128];
-	char plaintext[128];
-	char digest[SHA1_DIGEST_SIZE];
-} hmac_sha1_tv_template[] = {
-	
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x00},
-		  
-		"Hi There",
-
-		{ 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
-                  0xe2, 0x8b, 0xc0, 0xb6, 0xfb ,0x37, 0x8c, 0x8e, 0xf1,
-                  0x46, 0xbe, 0x00 }
-	},
-	    
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-
-		{ 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
-		  0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
-
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00},
-
-		  
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0x00 },
-		  
-		{ 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, 
-		  0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 }
-
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
-		  
-		{ 
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0x00 },
-		  
-		{ 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, 
-		  0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda }
-
-	},
-	
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x00 },
-		  
-		"Test With Truncation",
-		
-		{ 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, 
-  		  0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 }
-
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		  
-		"Test Using Larger Than Block-Size Key - Hash Key First",
-		
-		{ 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, 
-  		  0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 }
-
-	},
-	
+struct hash_testvec md4_tv_template [] = {
 	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0x00 },
-		
-		"Test Using Larger Than Block-Size Key and Larger Than One "
-		"Block-Size Data",
-		
-		{ 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, 
-		  0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 }
+		.plaintext = "",
+		.digest	= { 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
+			    0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 },
+	}, {
+		.plaintext = "a",
+		.psize	= 1,
+		.digest	= { 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
+			    0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 },
+	}, {
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
+			    0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d },
+	}, {
+		.plaintext = "message digest",
+		.psize	= 14,
+		.digest	= { 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
+			    0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyz",
+		.psize	= 26,
+		.digest	= { 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
+			    0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 },
+		.np	= 2,
+		.tap	= { 13, 13 },
+	}, {
+		.plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+		.psize	= 62,
+		.digest	= { 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
+			    0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 },
+	}, {
+		.plaintext = "123456789012345678901234567890123456789012345678901234567890123"
+			     "45678901234567890",
+		.psize	= 80,
+		.digest	= { 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
+			    0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 },
 	},
-	
-	/* cross page test */
-	{
-		{ 'J', 'e', 'f', 'e', 0 },
-		
-		"what do ya want for nothing?",
-
-		{ 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
-		  0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
-
-	},
-
 };
 
 /*
- * HMAC-SHA256 test vectors from
- * draft-ietf-ipsec-ciph-sha-256-01.txt
+ * MD5 test vectors from RFC1321
  */
-#define HMAC_SHA256_TEST_VECTORS	10
-
-struct hmac_sha256_testvec {
-	char key[128];
-	char plaintext[128];
-	char digest[SHA256_DIGEST_SIZE];
-} hmac_sha256_tv_template[] = {
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		  
-	
-		{ "abc" },
-		
-		{ 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
-		  0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
-		  0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
-		  0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
-
-	},
-	
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		   0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		
-		{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
-		
-		{ 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
-		  0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
-		  0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
-		  0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 }
-	},
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
-		
-		{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-		  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
-		
-		{ 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
-		  0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
-		  0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
-		  0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 }
-	},
-
-	{
-		{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-		  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00 },
-		
-		{ "Hi There" },
-		
-		{ 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
-		  0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
-		  0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
-		  0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 }
-	},
-
-	{
-		{ "Jefe" },
-		
-		{ "what do ya want for nothing?" },
-		
-		{ 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
-		  0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
-		  0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
-		  0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 }
-	},
-
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-		  0xdd, 0xdd, 0x00 },
-		
-		{ 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
-		  0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
-		  0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
-		  0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 }
-	},
-
-	{
-		{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-		  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-		  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-		  0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
-		  0x21, 0x22, 0x23, 0x24, 0x25, 0x00 },
-		
-		{ 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-		  0xcd, 0xcd, 0x00 },
-		
-		{ 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
-		  0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
-		  0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
-		  0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 }
-	},
-
-	{
-		{ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-		  0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
-		
-		{ "Test With Truncation" },
-		
-		{ 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
-		  0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
-		  0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
-		  0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 }
-	},
-	
-	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ "Test Using Larger Than Block-Size Key - Hash Key First" },
-		
-		{ 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
-		  0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
-		  0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
-		  0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f }
-	},
+#define MD5_TEST_VECTORS	7
 
+struct hash_testvec md5_tv_template[] = {
 	{
-		{ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-		  0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
-		
-		{ "Test Using Larger Than Block-Size Key and Larger Than "
-		  "One Block-Size Data" },
-		
-		{ 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
-		  0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
-		  0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
-		  0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 }
-	},
+		.digest	= { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
+			    0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e },
+	}, {
+		.plaintext = "a",
+		.psize	= 1,
+		.digest	= { 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
+			    0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 },
+	}, {
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
+			    0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 },
+	}, {
+		.plaintext = "message digest",
+		.psize	= 14,
+		.digest	= { 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
+			    0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyz",
+		.psize	= 26,
+		.digest	= { 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
+			    0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b },
+		.np	= 2,
+		.tap	= {13, 13}
+	}, {
+		.plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+		.psize	= 62,
+		.digest	= { 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
+			    0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f },
+	}, {
+		.plaintext = "12345678901234567890123456789012345678901234567890123456789012"
+			     "345678901234567890",
+		.psize	= 80,
+		.digest	= { 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
+			    0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a },
+	}
 };
 
-
-#endif	/* CONFIG_CRYPTO_HMAC */
-
 /*
  * SHA1 test vectors  from from FIPS PUB 180-1
  */
 #define SHA1_TEST_VECTORS	2
 
-struct sha1_testvec {
-	char plaintext[128];
-	char digest[SHA1_DIGEST_SIZE];
-} sha1_tv_template[] = {
-	{ "abc",
-	  { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 
-	    0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C ,0x9C, 0xD0, 0xD8, 0x9D }
-	},
-	        	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-
-	  { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E ,0xBA, 0xAE,
-	    0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }
+struct hash_testvec sha1_tv_template[] = {
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
+			    0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
+			    0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1 },
+		.np	= 2,
+		.tap	= { 28, 28 }
 	}
 };
 
@@ -573,22 +173,23 @@
  */
 #define SHA256_TEST_VECTORS	2
 
-struct sha256_testvec {
-	char plaintext[128];
-	char digest[SHA256_DIGEST_SIZE];
-} sha256_tv_template[] = {
-	{ "abc",
-	  { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
-	    0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
-	    0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
-	    0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad }
-	},
-	        	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
-	    0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
-	    0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
-	    0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 }
+struct hash_testvec sha256_tv_template[] = {	
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
+			    0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
+			    0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
+			    0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
+			    0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
+			    0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
+			    0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 },
+		.np	= 2,
+		.tap	= { 28, 28 }
 	},
 };
 
@@ -597,47 +198,47 @@
  */
 #define SHA384_TEST_VECTORS	4
 
-struct sha384_testvec {
-	char plaintext[128];
-	char digest[SHA384_DIGEST_SIZE];
-} sha384_tv_template[] = {
-
-	{ "abc",
-	  { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
-	    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
-	    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
-	    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
-	    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
-	    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
-	},
-	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
-	    0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
-	    0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
-	    0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
-	    0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
-	    0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b  }
-	},
-	
-	{ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-	  "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-	  { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
-	    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
-	    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
-	    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
-	    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
-	    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39  }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-	  "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-	  { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
-	    0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
-	    0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
-	    0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
-	    0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
-	    0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 }
+struct hash_testvec sha384_tv_template[] = {
+	{ 
+		.plaintext= "abc",
+		.psize	= 3,
+		.digest	= { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
+			    0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
+			    0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
+			    0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
+			    0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
+			    0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
+			    0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
+			    0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
+			    0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
+			    0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
+			    0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b},
+	}, {
+		.plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+ 			     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+		.psize	= 112,
+		.digest	= { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
+			    0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
+			    0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
+			    0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
+			    0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
+			    0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39  },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
+			     "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
+		.psize	= 104,
+		.digest	= { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
+			    0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
+			    0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
+			    0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
+			    0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
+			    0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 },
+		.np	= 4,
+		.tap	= { 26, 26, 26, 26 }
 	},
 };
 
@@ -646,439 +247,616 @@
  */
 #define SHA512_TEST_VECTORS	4
 
-struct sha512_testvec {
-	char plaintext[128];
-	char digest[SHA512_DIGEST_SIZE];
-} sha512_tv_template[] = {
-
-	{ "abc",
-	  { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
-	    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
-	    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
-	    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
-	    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
-	    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
-	    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
-	    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f }
-	},
-	
-	{ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	  { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
-	    0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
-	    0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
-	    0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
-	    0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
-	    0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
-	    0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
-	    0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 }
-	},
-	
-	{ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-	  "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-	  { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
-	    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
-	    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
-	    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
-	    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
-	    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
-	    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
-	    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 }
-	},
-	
-	{ "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-	  "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-	  { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
-	    0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
-	    0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
-	    0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
-	    0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
-	    0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
-	    0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
-	    0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9
-	  }
+struct hash_testvec sha512_tv_template[] = {
+	{ 
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
+			    0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
+			    0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
+			    0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
+			    0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
+			    0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
+			    0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
+			    0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f },
+	}, {
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
+			    0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
+			    0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
+			    0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
+			    0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
+			    0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
+			    0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
+			    0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 },
+	}, {
+		.plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+			     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+		.psize	= 112,
+		.digest	= { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
+			    0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
+			    0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
+			    0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
+			    0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
+			    0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
+			    0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
+			    0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 },
+	}, {
+		.plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
+			     "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
+		.psize	= 104,
+		.digest	= { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
+			    0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
+			    0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
+			    0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
+			    0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
+			    0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
+			    0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
+			    0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9 },
+		.np	= 4,
+		.tap	= { 26, 26, 26, 26 }
 	},
 };
 
+#ifdef CONFIG_CRYPTO_HMAC
 /*
- * DES test vectors.
+ * HMAC-MD5 test vectors from RFC2202
+ * (These need to be fixed to not use strlen).
  */
-#define DES_ENC_TEST_VECTORS		5
-#define DES_DEC_TEST_VECTORS		2
-#define DES_CBC_ENC_TEST_VECTORS	4
-#define DES_CBC_DEC_TEST_VECTORS	3
-#define DES3_EDE_ENC_TEST_VECTORS	3
-#define DES3_EDE_DEC_TEST_VECTORS	3
-
-struct des_tv {
-	unsigned int len;
-	int fail;
-	char key[24];
-	char iv[8];
-	char plaintext[128];
-	char result[128];
-};
-
-struct des_tv des_enc_tv_template[] = {
-
-	/* From Applied Cryptography */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-	},
-	
-	/* Same key, different plaintext block */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-		{ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-	},
-	
-	/* Sbox test from NBS */
-	{
-		8, 0,
-		
-		{ 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-		{ 0 },
-		{ 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 },
-		{ 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B }
-	},
-	
-	/* Three blocks */
-	{
-		24, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-		  0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-		  0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },		  
-	},
-	
-	/* Weak key */
-	{
-		8, 1,
-		
-		{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-	},
-	
-	/* Two blocks -- for testing encryption across pages */
-	{
-		16, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-	},
+#define HMAC_MD5_TEST_VECTORS	7
 
-	/* Two blocks -- for testing decryption across pages */
-	{
-		16, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-		  
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-	},
-	
-	/* Four blocks -- for testing encryption with chunking */
+struct hmac_testvec hmac_md5_tv_template[] =
+{	
 	{
-		24, 0,
-		
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		
-		{ 0 },
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-		  0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
-		  0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-		  0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
-		  0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.key	= { [0 ... 15] =  0x0b },
+		.ksize	= 16,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
+			    0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d },
+	}, {
+		.key	= { 'J', 'e', 'f', 'e' },
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
+			    0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 },
+		.np	= 2,
+		.tap	= {14, 14}
+	}, {
+		.key	= { [0 ... 15] = 0xaa },
+		.ksize	= 16,
+		.plaintext = { [0 ... 49] =  0xdd },
+		.psize	= 50,
+		.digest	= { 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
+			    0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, },
+		.ksize	= 25,
+		.plaintext = { [0 ... 49] =  0xcd },
+		.psize	= 50,
+		.digest	= { 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
+			    0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 },
+	}, {
+		.key	= { [0 ... 15] = 0x0c },
+		.ksize	= 16,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
+			    0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c },
+	}, {
+		.key	= { [0 ... 79] =  0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
+			    0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd },
+	}, {
+		.key	= { [0 ... 79] =  0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
+			     "Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
+			    0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e },
 	},
-	
 };
 
-struct des_tv des_dec_tv_template[] = {
-
-	/* From Applied Cryptography */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-	},
-	
-	/* Sbox test from NBS */
-	{
-		8, 0,
+/*
+ * HMAC-SHA1 test vectors from RFC2202
+ */
+#define HMAC_SHA1_TEST_VECTORS	7
 
-		{ 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-		{ 0 },
-		{ 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
-		{ 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 }
-	},
-	
-	/* Two blocks, for chunking test */
+struct hmac_testvec hmac_sha1_tv_template[] = {	
 	{
-		16, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0 },
-		
-		{ 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-		  0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
-		  
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-		  0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 }
+		.key	= { [0 ... 19] = 0x0b },
+		.ksize	= 20,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
+			    0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1,
+			    0x46, 0xbe },
+	}, {
+		.key	= { 'J', 'e', 'f', 'e' },		
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, 
+			    0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 },
+		.np	= 2,
+		.tap	= { 14, 14 }
+	}, {
+		.key	= { [0 ... 19] = 0xaa },
+		.ksize	= 20,
+		.plaintext = { [0 ... 49] = 0xdd },
+		.psize	= 50,
+		.digest	= { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, 
+			    0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 },
+		.ksize	= 25,
+		.plaintext = { [0 ... 49] = 0xcd },
+		.psize	= 50,
+		.digest	= { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, 
+			    0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda },
+	}, {
+		.key	= { [0 ... 19] = 0x0c },
+		.ksize	= 20,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, 
+			    0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, 
+			    0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
+			     "Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, 
+			    0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 },
 	},
-
 };
 
-struct des_tv des_cbc_enc_tv_template[] = {
-	/* From OpenSSL */
-	{
-		24, 0,
-		
-		{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
-		  
-		{ 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
-		  0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
-		  0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, 
-		  0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
-	},
+/*
+ * HMAC-SHA256 test vectors from
+ * draft-ietf-ipsec-ciph-sha-256-01.txt
+ */
+#define HMAC_SHA256_TEST_VECTORS	10
 
-	/* FIPS Pub 81 */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-		{ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		
-	},
-	
+struct hmac_testvec hmac_sha256_tv_template[] = {
 	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-	},
-	
-	{	
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-	},
-	
-	/* Copy of openssl vector for chunk testing */
-	
-	/* From OpenSSL */
-	{
-		24, 0,
-		
-		{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
-		  
-		{ 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
-		  0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
-		  0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, 
-		  0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20},
+		.ksize	= 32,
+		.plaintext = "abc",
+		.psize	= 3,
+		.digest	= { 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
+			    0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
+			    0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
+			    0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
+		.ksize	= 32,
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 56,
+		.digest	= { 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
+			    0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
+			    0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
+			    0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
+		.ksize	= 32,
+		.plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+			     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+		.psize	= 112,
+		.digest	= { 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
+			    0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
+			    0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
+			    0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 },
+	}, {
+		.key	= { [0 ... 31] = 0x0b },
+		.ksize	= 32,
+		.plaintext = "Hi There",
+		.psize	= 8,
+		.digest	= { 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
+			    0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
+			    0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
+			    0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 },
+	}, {
+		.key	= "Jefe",
+		.ksize	= 4,
+		.plaintext = "what do ya want for nothing?",
+		.psize	= 28,
+		.digest	= { 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
+			    0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
+			    0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
+			    0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 },
+		.np	= 2,
+		.tap	= { 14, 14 }
+	}, {
+		.key	= { [0 ... 31] = 0xaa },
+		.ksize	= 32,
+		.plaintext = { [0 ... 49] = 0xdd },
+		.psize	= 50,
+		.digest	= { 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
+			    0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
+			    0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
+			    0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 },
+	}, {
+		.key	= { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+			    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+			    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+			    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
+			    0x21, 0x22, 0x23, 0x24, 0x25 },
+		.ksize	= 37,
+		.plaintext = { [0 ... 49] = 0xcd },
+		.psize	= 50,
+		.digest	= { 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
+			    0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
+			    0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
+			    0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 },
+	}, {
+		.key	= { [0 ... 31] = 0x0c },
+		.ksize	= 32,
+		.plaintext = "Test With Truncation",
+		.psize	= 20,
+		.digest	= { 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
+			    0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
+			    0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
+			    0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
+		.psize	= 54,
+		.digest	= { 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
+			    0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
+			    0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
+			    0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f },
+	}, {
+		.key	= { [0 ... 79] = 0xaa },
+		.ksize	= 80,
+		.plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
+			     "One Block-Size Data",
+		.psize	= 73,
+		.digest	= { 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
+			    0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
+			    0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
+			    0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 },
 	},
-
-	
 };
 
-struct des_tv des_cbc_dec_tv_template[] = {
+#endif	/* CONFIG_CRYPTO_HMAC */
 
-	/* FIPS Pub 81 */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-	},
-	
-	/* Copy of above, for chunk testing */
-	
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-		{ 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
-		{ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+/*
+ * DES test vectors.
+ */
+#define DES_ENC_TEST_VECTORS		10
+#define DES_DEC_TEST_VECTORS		4
+#define DES_CBC_ENC_TEST_VECTORS	5
+#define DES_CBC_DEC_TEST_VECTORS	4
+#define DES3_EDE_ENC_TEST_VECTORS	3
+#define DES3_EDE_DEC_TEST_VECTORS	3
+
+struct cipher_testvec des_enc_tv_template[] = {
+	{ /* From Applied Cryptography */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+	}, { /* Same key, different plaintext block */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 8,
+		.result	= { 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 8,
+	}, { /* Sbox test from NBS */
+		.key	= { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },
+		.klen	= 8,
+		.input	= { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
+		.ilen	= 8,
+		.result	= { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.rlen	= 8,
+	}, { /* Three blocks */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
+		.ilen	= 24,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
+		.rlen	= 24,
+	}, { /* Weak key */
+		.fail	= 1,
+		.wk	= 1,
+		.key	= { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+	}, { /* Two blocks -- for testing encryption across pages */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 16,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 16,
+		.np	= 2,
+		.tap	= { 8, 8 }
+	}, { /* Four blocks -- for testing encryption with chunking */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 32,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 32,
+		.np	= 3,
+		.tap	= { 14, 10, 8 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
+			    0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
+		.ilen	= 24,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
+			    0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
+		.rlen	= 24,
+		.np	= 4,
+		.tap	= { 2, 1, 3, 18 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
+		.ilen	= 16,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
+		.rlen	= 16,
+		.np	= 5,
+		.tap	= { 2, 2, 2, 2, 8 } 
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.ilen	= 8,
+		.result	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.rlen	= 8,
+		.np	= 8,
+		.tap	= { 1, 1, 1, 1, 1, 1, 1, 1 } 
+	},
+};
+
+struct cipher_testvec des_dec_tv_template[] = {
+	{ /* From Applied Cryptography */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
+		.rlen	= 8,
+	}, { /* Sbox test from NBS */
+		.key	= { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },		
+		.klen	= 8,
+		.input	= { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 8,
+		.result	= { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
+		.rlen	= 8,
+	}, { /* Two blocks, for chunking test */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 16,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
+		.rlen	= 16,
+		.np	= 2,
+		.tap	= { 8, 8 }
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.input	= { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
+			    0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
+		.ilen	= 16,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
+			    0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
+		.rlen	= 16,
+		.np	= 3,
+		.tap	= { 3, 12, 1 }
+	},
+};
+
+struct cipher_testvec des_cbc_enc_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
+		.klen	= 8,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.ilen	= 24,
+		.result	= { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
+			    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
+			    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 
+		.rlen	= 24,
+	}, { /* FIPS Pub 81 */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },		
+		.input	= { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
+		.ilen	= 8,
+		.result	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.input	= { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
+		.ilen	= 8,
+		.result	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.rlen	= 8,
+	}, {	
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.ilen	= 8,
+		.result	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
+		.rlen	= 8,
+	}, { /* Copy of openssl vector for chunk testing */	
+	     /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
+		.klen	= 8,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.ilen	= 24,
+		.result	= { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 
+			    0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 
+			    0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 
+		.rlen	= 24,
+		.np	= 2,
+		.tap	= { 13, 11 }
+	},
+};
+
+struct cipher_testvec des_cbc_dec_tv_template[] = {
+	{ /* FIPS Pub 81 */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
+		.input	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
+		.ilen	= 8,
+		.result	= { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },		
+		.input	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.ilen	= 8,
+		.result	= { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
+		.ilen	= 8,
+		.result	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.rlen	= 8,
+	}, { /* Copy of above, for chunk testing */	
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.klen	= 8,
+		.iv	= { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
+		.input	= { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, 
+		.ilen	= 8,
+		.result	= { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
+		.rlen	= 8,
+		.np	= 2,
+		.tap	= { 4, 4 }
 	},
 };
 
 /*
  * We really need some more test vectors, especially for DES3 CBC.
  */
-struct des_tv des3_ede_enc_tv_template[] = {
-
-	/* These are from openssl */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
-		  
-		{ 0 },
-		
-		{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61  },
-		
-		{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-		  0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-		  0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
-		 
-		{ 0 },
-		
-		{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
-		
-		{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  }
-	},
-	
-
-	{
-		8, 0,
-		
-		{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-		  0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-		  0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
-		  
-		{ 0 },
-			  
-		{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
-		
-		{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  }	
+struct cipher_testvec des3_ede_enc_tv_template[] = {
+	{ /* These are from openssl */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
+		.klen	= 24,
+		.input	= { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
+		.ilen	= 8,
+		.result	= { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
+			    0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
+			    0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
+		.klen	= 24,
+		.input	= { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
+		.ilen	= 8,
+		.result	= { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
+			    0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
+			    0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
+		.klen	= 24,
+		.input	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 8,
+		.result	= { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
+		.rlen	= 8,
 	},
 };
 
-struct des_tv des3_ede_dec_tv_template[] = {
-
-	/* These are from openssl */
-	{
-		8, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
-		  
-		{ 0 },
-		
-		
-		{ 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-		
-		{ 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61  },
-	},
-	
-	{
-		8, 0,
-		
-		{ 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-		  0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-		  0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
-		 
-		{ 0 },
-		
-		{ 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  },
-		
-		{ 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
-		
-	},
-	
-
-	{
-		8, 0,
-		
-		{ 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-		  0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-		  0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
-		  
-		{ 0 },
-			  
-		{ 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  },
-		
-		{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
+struct cipher_testvec des3_ede_dec_tv_template[] = {
+	{ /* These are from openssl */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
+		.klen	= 24,
+		.input	= { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
+		.ilen	= 8,
+		.result	= { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
+			    0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
+			    0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
+		.klen	= 24,
+		.input	= { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
+		.ilen	= 8,
+		.result	= { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
+			    0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
+			    0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
+		.klen	= 24,
+		.input	= { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
+		.ilen	= 8,
+		.result	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 8,
 	},
 };
 
@@ -1090,189 +868,151 @@
 #define BF_CBC_ENC_TEST_VECTORS	1
 #define BF_CBC_DEC_TEST_VECTORS	1
 
-struct bf_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[56];
-	char iv[8];
-	char plaintext[32];
-	char result[32];
-};
-
-struct bf_tv bf_enc_tv_template[] = {
-
-	/* DES test vectors from OpenSSL */
-	{
-		8, 8, 8, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,  },
-		{ 0 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
-		{ 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 }
-	},
-	
-	/* Vary the keylength... */
-	
-	{
-		16, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C }
-	},
-	
-	{
-		21, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44 },
-		{ 0 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		{ 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F }
-	},
-	
-	/* Generated with bf488 */
-	{
-		56, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F, 
-		  0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76, 
-		  0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, 
-		  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-		  { 0 },
-		  { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		  { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 }
-	}
-	
-};
-
-struct bf_tv bf_dec_tv_template[] = {
-
-	/* DES test vectors from OpenSSL */
-	{
-		8, 8, 8, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-		{ 0 },
-		{ 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,  },
-		{ 0 },
-		{ 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }
-	},
-	
-	{
-		8, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-		{ 0 },
-		{ 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	/* Vary the keylength... */
-	
-	{
-		16, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-		{ 0 },
-		{ 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	{
-		21, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44 },
-		{ 0 },
-		{ 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	},
-	
-	/* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
-	{
-		56, 8, 8, 0,
-		{ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-		  0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F, 
-		  0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76, 
-		  0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, 
-		  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-		{ 0 },
-		{ 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-	}
-};
-
-struct bf_tv bf_cbc_enc_tv_template[] = {
-
-	/* From OpenSSL */
-	{
-		16, 32, 32, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
-		  
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
-		  
-		{ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-		  0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-		  0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-		  0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC }
-	},
-};
-
-struct bf_tv bf_cbc_dec_tv_template[] = {
-
-	/* From OpenSSL */
-	{
-		16, 32, 32, 0,
-		
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
-		  
-		{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-		
-		{ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-		  0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-		  0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-		  0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC },
-		  
-		{ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-		  0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-		  0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-		  0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 }
+struct cipher_testvec bf_enc_tv_template[] = {
+	{ /* DES test vectors from OpenSSL */
+		.key	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
+		.klen	= 8,
+		.input	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 8,
+		.result	= { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
+		.klen	= 8,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 8,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
+		.rlen	= 8,
+	}, { /* Vary the keylength... */	
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
+		.klen	= 16,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44 },
+		.klen	= 21,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
+		.rlen	= 8,
+	}, { /* Generated with bf488 */
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 
+			    0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 
+			    0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 
+			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+		.klen	= 56,
+		.input	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.ilen	= 8,
+		.result	= { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
+		.rlen	= 8,
+	},
+};
+
+struct cipher_testvec bf_dec_tv_template[] = {
+	{ /* DES test vectors from OpenSSL */
+		.key	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.klen	= 8,
+		.input	= { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
+		.ilen	= 8,
+		.result	= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
+		.klen	= 8,
+		.input	= { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 8,
+		.input	= { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, { /* Vary the keylength... */	
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44 },
+		.klen	= 21,
+		.input	= { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	}, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
+		.key	= { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
+			    0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 
+			    0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 
+			    0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 
+			    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+		.klen	= 56,
+		.input	= { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
+		.ilen	= 8,
+		.result	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
+		.rlen	= 8,
+	},
+};
+
+struct cipher_testvec bf_cbc_enc_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 16,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },		
+		.input	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
+			    0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
+		.ilen	= 32,
+		.result	= { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
+			    0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
+			    0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
+			    0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
+		.rlen	= 32,
+	},
+};
+
+struct cipher_testvec bf_cbc_dec_tv_template[] = {
+	{ /* From OpenSSL */
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
+		.klen	= 16,
+		.iv	= { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },		
+		.input	= { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
+			    0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
+			    0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
+			    0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
+		.ilen	= 32,
+		.result	= { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
+			    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
+			    0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
+			    0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
+		.rlen	= 32,
 	},
 };
 
@@ -1284,212 +1024,161 @@
 #define TF_CBC_ENC_TEST_VECTORS		4
 #define TF_CBC_DEC_TEST_VECTORS		4
 
-struct tf_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[32];
-	char iv[16];
-	char plaintext[48];
-	char result[48];
-};
-
-struct tf_tv tf_enc_tv_template[] = {
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-		  0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A }
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-		  0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 }
-	},
-	{	
-		32, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-		{ 0 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-		  0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 }
-	},
-};
-
-struct tf_tv tf_dec_tv_template[] = {
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0 },
-		{ 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-		  0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-		{ 0 },
-		{ 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-		  0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	{	
-		32, 16, 16, 0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-		  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-		  0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-		{ 0 },
-		{ 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-		  0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-};
-
-struct tf_tv tf_cbc_enc_tv_template[] = {
-	/* Generated with Nettle */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-	},
-	
-	{
-		16, 48, 48, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-		  0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-		  0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-	},
-};
-
-struct tf_tv tf_cbc_dec_tv_template[] = {
-	/* Reverse of the first four above */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		  
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-		{ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	},
-	
+struct cipher_testvec tf_enc_tv_template[] = {
 	{
-		16, 48, 48, 0,
-		
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-		  0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-		  0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-		  0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-		  0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-		  0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
+		.klen	= 24,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
+			    0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.klen	= 32,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
+			    0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec tf_dec_tv_template[] = {
+	{
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
+		.klen	= 24,
+		.input	= { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
+			    0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+			    0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
+			    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.klen	= 32,
+		.input	= { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
+			    0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec tf_cbc_enc_tv_template[] = {
+	{ /* Generated with Nettle */
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { [0 ... 47] = 0x00 },
+		.ilen	= 48,
+		.result	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
+			    0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
+			    0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.rlen	= 48,
+	},
+};
+
+struct cipher_testvec tf_cbc_dec_tv_template[] = {
+	{ /* Reverse of the first four above */
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },		  
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
+		.input	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
+		.input	= { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { [0 ... 15] = 0x00 },
+		.klen	= 16,
+		.iv	= { [0 ... 15] = 0x00 },
+		.input	= { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
+			    0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
+			    0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
+			    0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
+			    0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
+			    0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
+		.ilen	= 48,
+		.result	= { [0 ... 47] = 0x00 },
+		.rlen	= 48,
 	},
 };
 
@@ -1500,179 +1189,162 @@
 #define SERPENT_ENC_TEST_VECTORS	4
 #define SERPENT_DEC_TEST_VECTORS	4
 
-struct serpent_tv {
-	unsigned int keylen, fail;
-	u8 key[32], plaintext[16], result[16];
-};
-
-struct serpent_tv serpent_enc_tv_template[] = 
+struct cipher_testvec serpent_enc_tv_template[] = 
 {
 	{
-		0, 0,
-		{ 0 },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-		  0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 }
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
+			    0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
+			    0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.ilen	= 16,
+		.result	= { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
+			    0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
+		.rlen	= 16,
+	}, {
+		.key	= { [15] = 0x80 },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
+			    0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
+		.rlen	= 16,
 	},
-	{
-		16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-		  0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d }
-	},
-	{
-		32, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-		  0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c }
-	},
-	{
-		16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-		  0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49}
-	}
 };
 
-struct serpent_tv serpent_dec_tv_template[] = 
+struct cipher_testvec serpent_dec_tv_template[] = 
 {
 	{
-		0, 0,
-		{ 0 },
-		{ 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-		  0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-
-	},
-	{
-		16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-		  0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-	},
-	{
-		32, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-
-		{ 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-		  0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.input	= { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
+			    0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
+			    0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
+			    0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
+		.ilen	= 16,
+		.result	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.rlen	= 16,
+	}, {
+		.key	= { [15] = 0x80 },
+		.klen	= 16,
+		.input	= { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
+			    0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
 	},
-	{
-		16, 0,
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-		{ 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-		  0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  
-	}
 };
 
 /* Cast6 test vectors from RFC 2612 */
 #define CAST6_ENC_TEST_VECTORS	3
 #define CAST6_DEC_TEST_VECTORS  3
 
-struct cast6_tv {
-	unsigned keylen;
-	unsigned fail;
-	u8 key[32];
-	u8 plaintext[16];
-	u8 result[16];
-};
-
-struct cast6_tv cast6_enc_tv_template[] = 
+struct cipher_testvec cast6_enc_tv_template[] = 
 {
 	{
-		16, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
-		  0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
+		.klen	= 16,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
+			    0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
+			    0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
+		.klen	= 24,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
+			    0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
+			    0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
+			    0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
+		.klen	= 32,
+		.input	= { [0 ... 15] = 0x00 },
+		.ilen	= 16,
+		.result	= { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
+			    0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
+		.rlen	= 16,
 	},
-	{
-		24, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
-		  0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
-		  0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-	},
-	{
-		32, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-                  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-		  0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-		  0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-		{ 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
-		  0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-	}
 };
 
-struct cast6_tv cast6_dec_tv_template[] = 
+struct cipher_testvec cast6_dec_tv_template[] = 
 {
 	{
-		16, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-		{ 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
-		  0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	},
-	{
-		24, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
-		  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
-		  0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-		{ 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
-		  0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
+		.klen	= 16,
+		.input	= { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, 
+			    0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, 
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 
+			    0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
+		.klen	= 24,
+		.input	= { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, 
+			    0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
+			    0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
+			    0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
+			    0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
+		.klen	= 32,
+		.input	= { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
+			    0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
+		.ilen	= 16,
+		.result	= { [0 ... 15] = 0x00 },
+		.rlen	= 16,
 	},
-	{
-		32, 
-		0,
-		{ 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-                  0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-		  0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-		  0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },				  
-		{ 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, 
-		  0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-	}
 };
 
 
@@ -1682,90 +1354,77 @@
 #define AES_ENC_TEST_VECTORS 3
 #define AES_DEC_TEST_VECTORS 3
 
-struct aes_tv {
-	unsigned int keylen;
-	unsigned int plen;
-	unsigned int rlen;
-	int fail;
-	char key[32];
-	char iv[8];
-	char plaintext[16];
-	char result[16];
-};
-
-struct aes_tv aes_enc_tv_template[] = { 
-	/* From FIPS-197 */
-	{
-		16, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-		  0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-	},
-	{
-		24, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-		  0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-	},
-	{
-		32, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-		{ 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-		  0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-	},
-};
-
-struct aes_tv aes_dec_tv_template[] = { 
-	/* From FIPS-197 */
-	{
-		16, 16, 16, 0,
-		
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-		{ 0 },
-		{ 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-		  0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-	},
-	
-	{
-		24, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-		{ 0 },
-		{ 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-		  0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },  
-	},
-	{
-		32, 16, 16, 0,
-		{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-		  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-		{ 0 },
-		{ 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-		  0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-		{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
-		  0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+struct cipher_testvec aes_enc_tv_template[] = { 
+	{ /* From FIPS-197 */
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
+			    0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
+		.klen	= 24,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
+			    0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.ilen	= 16,
+		.result	= { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
+			    0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
+		.rlen	= 16,
+	},
+};
+
+struct cipher_testvec aes_dec_tv_template[] = { 
+	{ /* From FIPS-197 */
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
+		.klen	= 16,
+		.input	= { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
+			    0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
+		.klen	= 24,
+		.input	= { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
+			    0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },  
+		.rlen	= 16,
+	}, {
+		.key	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+			    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+			    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+			    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
+		.klen	= 32,
+		.input	= { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
+			    0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
+		.ilen	= 16,
+		.result	= { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
+			    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
+		.rlen	= 16,
 	},
 };
 
@@ -1773,68 +1432,60 @@
 #define CAST5_ENC_TEST_VECTORS	3
 #define CAST5_DEC_TEST_VECTORS	3
 
-struct cast5_tv {
-	unsigned keylen;
-	unsigned fail;
-	u8 key[16];
-	u8 plaintext[8];
-	u8 ciphertext[8];
-};
-
-struct cast5_tv cast5_enc_tv_template[] =
+struct cipher_testvec cast5_enc_tv_template[] =
 {
 	{
-		16,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-
-	},
-	{
-		10,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
+		.klen	= 16,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45 },
+		.klen	= 10,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12 },
+		.klen	= 5,
+		.input	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.ilen	= 8,
+		.result	= { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
+		.rlen	= 8,
 	},
-	{
-		5,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-		{ 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-	}
 };
 
-struct cast5_tv cast5_dec_tv_template[] =
+struct cipher_testvec cast5_dec_tv_template[] =
 {
 	{
-		16,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-		{ 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-
-	},
-	{
-		10,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-		  0x23, 0x45 },
-		{ 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
+		.klen	= 16,
+		.input	= { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+			    0x23, 0x45 },
+		.klen	= 10,
+		.input	= { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
+	}, {
+		.key	= { 0x01, 0x23, 0x45, 0x67, 0x12 },
+		.klen	= 5,
+		.input	= { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
+		.ilen	= 8,
+		.result	= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+		.rlen	= 8,
 	},
-	{
-		5,
-		0,
-		{ 0x01, 0x23, 0x45, 0x67, 0x12 },
-		{ 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-		{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-	}
 };
 
 /*
@@ -1857,83 +1508,73 @@
 
 struct comp_testvec deflate_comp_tv_template[] = {
 	{
-	  70, 38,
-	  
-	  "Join us now and share the software "
-	  "Join us now and share the software ",
-
-          { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-            0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-            0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-            0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-            0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 
-          },
-	},
-	  
-	{
-	  191, 122,
-	  
-	  "This document describes a compression method based on the DEFLATE"
-	  "compression algorithm.  This document defines the application of "
-	  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-	  
-	  { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-	    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-	    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-	    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-	    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-	    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-	    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-	    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-	    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-	    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-	    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-	    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-	    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-	    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-	    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-	    0xfa, 0x02 },
+		.inlen	= 70,
+		.outlen	= 38,
+	  	.input	= "Join us now and share the software "
+			  "Join us now and share the software ",
+		.output	= { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
+			    0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
+			    0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
+			    0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
+			    0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
+	}, {
+		.inlen	= 191,
+		.outlen	= 122,
+		.input	= "This document describes a compression method based on the DEFLATE"
+			  "compression algorithm.  This document defines the application of "
+			  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
+		.output	= { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
+			    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
+			    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
+			    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
+			    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
+			    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
+			    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
+			    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
+			    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
+			    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
+			    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
+			    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
+			    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
+			    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
+			    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
+			    0xfa, 0x02 },
 	},
 };
 
 struct comp_testvec deflate_decomp_tv_template[] = {
 	{
-	  122, 191,
-	  
-	  { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-	    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-	    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-	    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-	    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-	    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-	    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-	    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-	    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-	    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-	    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-	    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-	    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-	    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-	    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-	    0xfa, 0x02 },
-	    
-	    "This document describes a compression method based on the DEFLATE"
-	    "compression algorithm.  This document defines the application of "
-	    "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-	},
-	
-	{
-	  38, 70,
-	  
-          { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-            0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-            0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-            0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-            0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00
-          },
-          
-          "Join us now and share the software "
-	  "Join us now and share the software ",
+		.inlen	= 122,
+		.outlen	= 191,
+		.input	= { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
+			    0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
+			    0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
+			    0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
+			    0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
+			    0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
+			    0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
+			    0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
+			    0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
+			    0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
+			    0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
+			    0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
+			    0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
+			    0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
+			    0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
+			    0xfa, 0x02 },
+		.output	= "This document describes a compression method based on the DEFLATE"
+			  "compression algorithm.  This document defines the application of "
+			  "the DEFLATE algorithm to the IP Payload Compression Protocol.",
+	}, {
+		.inlen	= 38,
+		.outlen	= 70,
+		.input	= { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
+			    0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
+			    0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
+			    0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
+			    0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
+		.output	= "Join us now and share the software "
+			  "Join us now and share the software ",
 	},
 };
 
diff -Nru a/drivers/acorn/char/i2c.c b/drivers/acorn/char/i2c.c
--- a/drivers/acorn/char/i2c.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/acorn/char/i2c.c	Thu Jan  8 23:00:24 2004
@@ -280,13 +280,15 @@
 	    client->addr == 0x50) {
 		struct rtc_tm rtctm;
 		unsigned int year;
+		struct timespec tv;
 
 		rtc_client = client;
 		get_rtc_time(&rtctm, &year);
 
-		xtime.tv_nsec = rtctm.cs * 10000000;
-		xtime.tv_sec  = mktime(year, rtctm.mon, rtctm.mday,
-				       rtctm.hours, rtctm.mins, rtctm.secs);
+		tv.tv_nsec = rtctm.cs * 10000000;
+		tv.tv_sec  = mktime(year, rtctm.mon, rtctm.mday,
+				    rtctm.hours, rtctm.mins, rtctm.secs);
+		do_settimeofday(&tv);
 		set_rtc = k_set_rtc_time;
 	}
 
diff -Nru a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
--- a/drivers/acpi/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/acpi/Kconfig	Thu Jan  8 23:00:24 2004
@@ -251,12 +251,6 @@
 	  This driver will enable your system to shut down using ACPI, and
 	  dump your ACPI DSDT table using /proc/acpi/dsdt.
 
-config ACPI_EFI
-	bool
-	depends on ACPI_INTERPRETER
-	depends on IA64
-	default y
-
 config ACPI_RELAXED_AML
 	bool "Relaxed AML"
 	depends on ACPI_INTERPRETER
diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c
--- a/drivers/acpi/osl.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/acpi/osl.c	Thu Jan  8 23:00:24 2004
@@ -41,10 +41,7 @@
 #include <acpi/acpi_bus.h>
 #include <asm/uaccess.h>
 
-#ifdef CONFIG_ACPI_EFI
 #include <linux/efi.h>
-u64 efi_mem_attributes (u64 phys_addr);
-#endif
 
 
 #define _COMPONENT		ACPI_OS_SERVICES
@@ -140,22 +137,24 @@
 acpi_status
 acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr)
 {
-#ifdef CONFIG_ACPI_EFI
-	addr->pointer_type = ACPI_PHYSICAL_POINTER;
-	if (efi.acpi20)
-		addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi20);
-	else if (efi.acpi)
-		addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi);
-	else {
-		printk(KERN_ERR PREFIX "System description tables not found\n");
-		return AE_NOT_FOUND;
-	}
-#else
-	if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
-		printk(KERN_ERR PREFIX "System description tables not found\n");
-		return AE_NOT_FOUND;
+	if (efi_enabled) {
+		addr->pointer_type = ACPI_PHYSICAL_POINTER;
+		if (efi.acpi20)
+			addr->pointer.physical =
+				(acpi_physical_address) virt_to_phys(efi.acpi20);
+		else if (efi.acpi)
+			addr->pointer.physical =
+				(acpi_physical_address) virt_to_phys(efi.acpi);
+		else {
+			printk(KERN_ERR PREFIX "System description tables not found\n");
+			return AE_NOT_FOUND;
+		}
+	} else {
+		if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
+			printk(KERN_ERR PREFIX "System description tables not found\n");
+			return AE_NOT_FOUND;
+		}
 	}
-#endif /*CONFIG_ACPI_EFI*/
 
 	return AE_OK;
 }
@@ -163,22 +162,22 @@
 acpi_status
 acpi_os_map_memory(acpi_physical_address phys, acpi_size size, void **virt)
 {
-#ifdef CONFIG_ACPI_EFI
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
-		*virt = phys_to_virt(phys);
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
+			*virt = phys_to_virt(phys);
+		} else {
+			*virt = ioremap(phys, size);
+		}
 	} else {
-		*virt = ioremap(phys, size);
-	}
-#else
-	if (phys > ULONG_MAX) {
-		printk(KERN_ERR PREFIX "Cannot map memory that high\n");
-		return AE_BAD_PARAMETER;
+		if (phys > ULONG_MAX) {
+			printk(KERN_ERR PREFIX "Cannot map memory that high\n");
+			return AE_BAD_PARAMETER;
+		}
+		/*
+	 	 * ioremap checks to ensure this is in reserved space
+	 	 */
+		*virt = ioremap((unsigned long) phys, size);
 	}
-	/*
-	 * ioremap checks to ensure this is in reserved space
-	 */
-	*virt = ioremap((unsigned long) phys, size);
-#endif
 
 	if (!*virt)
 		return AE_NO_MEMORY;
@@ -369,19 +368,17 @@
 {
 	u32			dummy;
 	void			*virt_addr;
-
-#ifdef CONFIG_ACPI_EFI
 	int			iomem = 0;
 
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+			virt_addr = phys_to_virt(phys_addr);
+		} else {
+			iomem = 1;
+			virt_addr = ioremap(phys_addr, width);
+		}
+	} else
 		virt_addr = phys_to_virt(phys_addr);
-	} else {
-		iomem = 1;
-		virt_addr = ioremap(phys_addr, width);
-	}
-#else
-	virt_addr = phys_to_virt(phys_addr);
-#endif
 	if (!value)
 		value = &dummy;
 
@@ -399,10 +396,10 @@
 		BUG();
 	}
 
-#ifdef CONFIG_ACPI_EFI
-	if (iomem)
-		iounmap(virt_addr);
-#endif
+	if (efi_enabled) {
+		if (iomem)
+			iounmap(virt_addr);
+	}
 
 	return AE_OK;
 }
@@ -414,19 +411,17 @@
 	u32			width)
 {
 	void			*virt_addr;
-
-#ifdef CONFIG_ACPI_EFI
 	int			iomem = 0;
 
-	if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+	if (efi_enabled) {
+		if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
+			virt_addr = phys_to_virt(phys_addr);
+		} else {
+			iomem = 1;
+			virt_addr = ioremap(phys_addr, width);
+		}
+	} else
 		virt_addr = phys_to_virt(phys_addr);
-	} else {
-		iomem = 1;
-		virt_addr = ioremap(phys_addr, width);
-	}
-#else
-	virt_addr = phys_to_virt(phys_addr);
-#endif
 
 	switch (width) {
 	case 8:
@@ -442,10 +437,8 @@
 		BUG();
 	}
 
-#ifdef CONFIG_ACPI_EFI
 	if (iomem)
 		iounmap(virt_addr);
-#endif
 
 	return AE_OK;
 }
diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
--- a/drivers/acpi/pci_irq.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/acpi/pci_irq.c	Thu Jan  8 23:00:24 2004
@@ -237,7 +237,7 @@
                           PCI Interrupt Routing Support
    -------------------------------------------------------------------------- */
 
-static int
+int
 acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin)
 {
 	struct acpi_prt_entry	*entry = NULL;
diff -Nru a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
--- a/drivers/base/firmware_class.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/base/firmware_class.c	Thu Jan  8 23:00:23 2004
@@ -415,18 +415,22 @@
 	void (*cont)(const struct firmware *fw, void *context);
 };
 
-static void
+static int
 request_firmware_work_func(void *arg)
 {
 	struct firmware_work *fw_work = arg;
 	const struct firmware *fw;
-	if (!arg)
-		return;
+	if (!arg) {
+		WARN_ON(1);
+		return 0;
+	}
+	daemonize("%s/%s", "firmware", fw_work->name);
 	request_firmware(&fw, fw_work->name, fw_work->device);
 	fw_work->cont(fw, fw_work->context);
 	release_firmware(fw);
 	module_put(fw_work->module);
 	kfree(fw_work);
+	return 0;
 }
 
 /**
@@ -451,6 +455,8 @@
 {
 	struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
 						GFP_ATOMIC);
+	int ret;
+
 	if (!fw_work)
 		return -ENOMEM;
 	if (!try_module_get(module)) {
@@ -465,9 +471,14 @@
 		.context = context,
 		.cont = cont,
 	};
-	INIT_WORK(&fw_work->work, request_firmware_work_func, fw_work);
 
-	schedule_work(&fw_work->work);
+	ret = kernel_thread(request_firmware_work_func, fw_work,
+			    CLONE_FS | CLONE_FILES);
+	
+	if (ret < 0) {
+		fw_work->cont(NULL, fw_work->context);
+		return ret;
+	}
 	return 0;
 }
 
diff -Nru a/drivers/base/node.c b/drivers/base/node.c
--- a/drivers/base/node.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/base/node.c	Thu Jan  8 23:00:23 2004
@@ -18,18 +18,16 @@
 static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
 {
 	struct node *node_dev = to_node(dev);
-	cpumask_t tmp = node_dev->cpumap;
-	int k, len = 0;
+	cpumask_t mask = node_dev->cpumap;
+	int len;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		buf += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-        len += sprintf(buf, "\n");
+	/* FIXME - someone should pass us a buffer size (count) or
+	 * use seq_file or something to avoid buffer overrun risk. */
+	len = cpumask_snprintf(buf, 99 /* XXX FIXME */, mask);
+	len += sprintf(buf + len, "\n");
 	return len;
 }
+
 static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
 
 #define K(x) ((x) << (PAGE_SHIFT - 10))
diff -Nru a/drivers/base/platform.c b/drivers/base/platform.c
--- a/drivers/base/platform.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/base/platform.c	Thu Jan  8 23:00:23 2004
@@ -14,8 +14,8 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-struct device legacy_bus = {
-	.bus_id		= "legacy",
+struct device platform_bus = {
+	.bus_id		= "platform",
 };
 
 /**
@@ -29,7 +29,7 @@
 		return -EINVAL;
 
 	if (!pdev->dev.parent)
-		pdev->dev.parent = &legacy_bus;
+		pdev->dev.parent = &platform_bus;
 
 	pdev->dev.bus = &platform_bus_type;
 	
@@ -105,11 +105,11 @@
 
 int __init platform_bus_init(void)
 {
-	device_register(&legacy_bus);
+	device_register(&platform_bus);
 	return bus_register(&platform_bus_type);
 }
 
-EXPORT_SYMBOL(legacy_bus);
+EXPORT_SYMBOL(platform_bus);
 EXPORT_SYMBOL(platform_bus_type);
 EXPORT_SYMBOL(platform_device_register);
 EXPORT_SYMBOL(platform_device_unregister);
diff -Nru a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
--- a/drivers/base/power/sysfs.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/base/power/sysfs.c	Thu Jan  8 23:00:23 2004
@@ -36,7 +36,7 @@
 	int error = 0;
 
 	state = simple_strtoul(buf,&rest,10);
-	if (rest)
+	if (*rest)
 		return -EINVAL;
 	if (state)
 		error = dpm_runtime_suspend(dev,state);
diff -Nru a/drivers/block/DAC960.c b/drivers/block/DAC960.c
--- a/drivers/block/DAC960.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/block/DAC960.c	Thu Jan  8 23:00:24 2004
@@ -2474,7 +2474,6 @@
 static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
 {
   int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
-  struct request_queue *RequestQueue;
   int n;
 
   /*
@@ -2483,26 +2482,22 @@
   if (register_blkdev(MajorNumber, "dac960") < 0)
       return false;
 
-  /*
-    Initialize the I/O Request Queue.
-  */
-  RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
-  if (!RequestQueue) {
-      unregister_blkdev(MajorNumber, "dac960");
-      return false;
-  }
-  Controller->RequestQueue = RequestQueue;
-  blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
-  RequestQueue->queuedata = Controller;
-  blk_queue_max_hw_segments(RequestQueue,
-			    Controller->DriverScatterGatherLimit);
-  blk_queue_max_phys_segments(RequestQueue,
-		 	    Controller->DriverScatterGatherLimit);
-  blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
-
   for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
 	struct gendisk *disk = Controller->disks[n];
+  	struct request_queue *RequestQueue;
 
+	/* for now, let all request queues share controller's lock */
+  	RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
+  	if (!RequestQueue) {
+		printk("DAC960: failure to allocate request queue\n");
+		continue;
+  	}
+  	Controller->RequestQueue[n] = RequestQueue;
+  	blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
+  	RequestQueue->queuedata = Controller;
+  	blk_queue_max_hw_segments(RequestQueue, Controller->DriverScatterGatherLimit);
+	blk_queue_max_phys_segments(RequestQueue, Controller->DriverScatterGatherLimit);
+	blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
 	disk->queue = RequestQueue;
 	sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
 	sprintf(disk->devfs_name, "rd/host%d/target%d", Controller->ControllerNumber, n);
@@ -2527,17 +2522,17 @@
   int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
   int disk;
 
-  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
-	  del_gendisk(Controller->disks[disk]);
+  /* does order matter when deleting gendisk and cleanup in request queue? */
+  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
+	del_gendisk(Controller->disks[disk]);
+	blk_cleanup_queue(Controller->RequestQueue[disk]);
+	Controller->RequestQueue[disk] = NULL;
+  }
 
   /*
     Unregister the Block Device Major Number for this DAC960 Controller.
   */
   unregister_blkdev(MajorNumber, "dac960");
-  /*
-    Remove the I/O Request Queue.
-  */
-  blk_cleanup_queue(Controller->RequestQueue);
 }
 
 /*
@@ -3253,58 +3248,83 @@
 }
 
 
+static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
+{
+	struct request *Request;
+	DAC960_Command_T *Command;
+
+   while(1) {
+	Request = elv_next_request(req_q);
+	if (!Request)
+		return 1;
+
+	Command = DAC960_AllocateCommand(Controller);
+	if (Command == NULL)
+		return 0;
+
+	if (rq_data_dir(Request) == READ) {
+		Command->DmaDirection = PCI_DMA_FROMDEVICE;
+		Command->CommandType = DAC960_ReadCommand;
+	} else {
+		Command->DmaDirection = PCI_DMA_TODEVICE;
+		Command->CommandType = DAC960_WriteCommand;
+	}
+	Command->Completion = Request->waiting;
+	Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
+	Command->BlockNumber = Request->sector;
+	Command->BlockCount = Request->nr_sectors;
+	Command->Request = Request;
+	blkdev_dequeue_request(Request);
+	Command->SegmentCount = blk_rq_map_sg(req_q,
+		  Command->Request, Command->cmd_sglist);
+	/* pci_map_sg MAY change the value of SegCount */
+	Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
+		 Command->SegmentCount, Command->DmaDirection);
+
+	DAC960_QueueReadWriteCommand(Command);
+  }
+}
+
 /*
   DAC960_ProcessRequest attempts to remove one I/O Request from Controller's
   I/O Request Queue and queues it to the Controller.  WaitForCommand is true if
   this function should wait for a Command to become available if necessary.
   This function returns true if an I/O Request was queued and false otherwise.
 */
-
-static boolean DAC960_ProcessRequest(DAC960_Controller_T *Controller,
-				     boolean WaitForCommand)
+static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
 {
-  struct request_queue *RequestQueue = Controller->RequestQueue;
-  struct request *Request;
-  DAC960_Command_T *Command;
+	int i;
 
-  if (!Controller->ControllerInitialized)
-     return false;
+	if (!controller->ControllerInitialized)
+		return;
 
-  while (true) {
-      Request = elv_next_request(RequestQueue);
-      if (!Request)
-	      return false;
+	/* Do this better later! */
+	for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
+		struct request_queue *req_q = controller->RequestQueue[i];
 
-      Command = DAC960_AllocateCommand(Controller);
-      if (Command != NULL)
-          break;
+		if (req_q == NULL)
+			continue;
 
-      if (!WaitForCommand)
-          return false;
+		if (!DAC960_process_queue(controller, req_q)) {
+			controller->req_q_index = i;
+			return;
+		}
+	}
 
-      DAC960_WaitForCommand(Controller);
-  }
-  if (rq_data_dir(Request) == READ) {
-    Command->DmaDirection = PCI_DMA_FROMDEVICE;
-    Command->CommandType = DAC960_ReadCommand;
-  } else {
-    Command->DmaDirection = PCI_DMA_TODEVICE;
-    Command->CommandType = DAC960_WriteCommand;
-  }
-  Command->Completion = Request->waiting;
-  Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
-  Command->BlockNumber = Request->sector;
-  Command->BlockCount = Request->nr_sectors;
-  Command->Request = Request;
-  blkdev_dequeue_request(Request);
-  Command->SegmentCount = blk_rq_map_sg(Controller->RequestQueue,
-		  Command->Request, Command->cmd_sglist);
-  /* pci_map_sg MAY change the value of SegCount */
-  Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
-		 Command->SegmentCount, Command->DmaDirection);
+	if (controller->req_q_index == 0)
+		return;
 
-  DAC960_QueueReadWriteCommand(Command);
-  return true;
+	for (i = 0; i < controller->req_q_index; i++) {
+		struct request_queue *req_q = controller->RequestQueue[i];
+
+		if (req_q == NULL)
+			continue;
+
+		if (!DAC960_process_queue(controller, req_q)) {
+			controller->req_q_index = i;
+			return;
+		}
+	}
 }
 
 
@@ -3321,6 +3341,7 @@
 {
   DAC960_Controller_T *Controller = Command->Controller;
   struct request *Request = Command->Request;
+  struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
 
   if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
     Command->CommandType = DAC960_ReadRetryCommand;
@@ -3333,11 +3354,9 @@
    * code should almost never be called, just go with a
    * simple coding.
    */
-  (void)blk_rq_map_sg(Controller->RequestQueue, Command->Request,
-                                        Command->cmd_sglist);
+  (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
 
-  (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1,
-		                        Command->DmaDirection);
+  (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
   /*
    * Resubmitting the request sector at a time is really tedious.
    * But, this should almost never happen.  So, we're willing to pay
@@ -3357,9 +3376,7 @@
 
 static void DAC960_RequestFunction(struct request_queue *RequestQueue)
 {
-	int i = 0;
-	while (DAC960_ProcessRequest(RequestQueue->queuedata, (i++ == 0)))
-		;
+	DAC960_ProcessRequest(RequestQueue->queuedata);
 }
 
 /*
@@ -5205,8 +5222,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5249,8 +5265,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5289,8 +5304,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5329,8 +5343,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5365,8 +5378,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
@@ -5440,8 +5452,7 @@
     Attempt to remove additional I/O Requests from the Controller's
     I/O Request Queue and queue them to the Controller.
   */
-  while (DAC960_ProcessRequest(Controller, false))
-	  ;
+  DAC960_ProcessRequest(Controller);
   spin_unlock_irqrestore(&Controller->queue_lock, flags);
   return IRQ_HANDLED;
 }
diff -Nru a/drivers/block/DAC960.h b/drivers/block/DAC960.h
--- a/drivers/block/DAC960.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/block/DAC960.h	Thu Jan  8 23:00:24 2004
@@ -2333,7 +2333,8 @@
   DAC960_Command_T *FreeCommands;
   unsigned char *CombinedStatusBuffer;
   unsigned char *CurrentStatusBuffer;
-  struct request_queue *RequestQueue;
+  struct request_queue *RequestQueue[DAC960_MaxLogicalDrives];
+  int req_q_index;
   spinlock_t queue_lock;
   wait_queue_head_t CommandWaitQueue;
   wait_queue_head_t HealthStatusWaitQueue;
diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c
--- a/drivers/block/floppy.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/block/floppy.c	Thu Jan  8 23:00:23 2004
@@ -2563,7 +2563,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			break;
 		}
@@ -2894,7 +2894,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			return 0;
 		}
diff -Nru a/drivers/block/floppy98.c b/drivers/block/floppy98.c
--- a/drivers/block/floppy98.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/block/floppy98.c	Thu Jan  8 23:00:23 2004
@@ -2594,7 +2594,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			break;
 		}
@@ -2925,7 +2925,7 @@
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
 				printk("read\n");
-			if (CT(COMMAND) == FD_READ)
+			if (CT(COMMAND) == FD_WRITE)
 				printk("write\n");
 			return 0;
 		}
diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c
--- a/drivers/block/genhd.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/block/genhd.c	Thu Jan  8 23:00:24 2004
@@ -296,7 +296,9 @@
 
 static struct kobject *base_probe(dev_t dev, int *part, void *data)
 {
-	request_module("block-major-%d", MAJOR(dev));
+	if (request_module("block-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+		/* Make old-style 2.4 aliases work */
+		request_module("block-major-%d", MAJOR(dev));
 	return NULL;
 }
 
diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
--- a/drivers/block/ll_rw_blk.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/block/ll_rw_blk.c	Thu Jan  8 23:00:23 2004
@@ -780,11 +780,6 @@
 	"REQ_PM_SUSPEND",
 	"REQ_PM_RESUME",
 	"REQ_PM_SHUTDOWN",
-	"REQ_IDETAPE_PC1",
-	"REQ_IDETAPE_PC2",
-	"REQ_IDETAPE_READ",
-	"REQ_IDETAPE_WRITE",
-	"REQ_IDETAPE_READ_BUFFER",
 };
 
 void blk_dump_rq_flags(struct request *rq, char *msg)
@@ -2460,7 +2455,7 @@
 
 	if (!uptodate) {
 		error = -EIO;
-		if (!(req->flags & REQ_QUIET))
+		if (blk_fs_request(req) && !(req->flags & REQ_QUIET))
 			printk("end_request: I/O error, dev %s, sector %llu\n",
 				req->rq_disk ? req->rq_disk->disk_name : "?",
 				(unsigned long long)req->sector);
diff -Nru a/drivers/char/agp/alpha-agp.c b/drivers/char/agp/alpha-agp.c
--- a/drivers/char/agp/alpha-agp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/agp/alpha-agp.c	Thu Jan  8 23:00:24 2004
@@ -13,7 +13,7 @@
 
 static struct page *alpha_core_agp_vm_nopage(struct vm_area_struct *vma,
 					     unsigned long address,
-					     int write_access)
+					     int *type)
 {
 	alpha_agp_info *agp = agp_bridge->dev_private_data;
 	dma_addr_t dma_addr;
@@ -30,6 +30,8 @@
 	 */
 	page = virt_to_page(__va(pa));
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
diff -Nru a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
--- a/drivers/char/agp/amd64-agp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/agp/amd64-agp.c	Thu Jan  8 23:00:24 2004
@@ -38,6 +38,7 @@
 static int nr_garts;
 static struct pci_dev * hammers[MAX_HAMMER_GARTS];
 
+static struct resource *aperture_resource;
 static int __initdata agp_try_unsupported;
 
 static int gart_iterator;
@@ -250,7 +251,6 @@
 /* Some basic sanity checks for the aperture. */
 static int __devinit aperture_valid(u64 aper, u32 size)
 { 
-	static int not_first_call; 
 	u32 pfn, c;
 	if (aper == 0) { 
 		printk(KERN_ERR PFX "No aperture\n");
@@ -279,12 +279,11 @@
 
 	   Maybe better to use pci_assign_resource/pci_enable_device instead trusting
 	   the bridges? */
-	if (!not_first_call && request_mem_region(aper, size, "aperture") < 0) { 
+	if (!aperture_resource &&
+	    !(aperture_resource = request_mem_region(aper, size, "aperture"))) {
 		printk(KERN_ERR PFX "Aperture conflicts with PCI mapping.\n"); 
 		return 0;
 	}
-
-	not_first_call = 1;
 	return 1;
 } 
 
@@ -348,20 +347,27 @@
 	while ((loop_dev = pci_find_device(PCI_VENDOR_ID_AMD, 0x1103, loop_dev)) 
 			!= NULL) {
 		if (fix_northbridge(loop_dev, pdev, cap_ptr) < 0) { 
-			printk(KERN_INFO PFX "No usable aperture found.\n");
+			printk(KERN_ERR PFX "No usable aperture found.\n");
 #ifdef __x86_64__ 
 			/* should port this to i386 */
-			printk(KERN_INFO PFX "Consider rebooting with iommu=memaper=2 to get a good aperture.\n");
+			printk(KERN_ERR PFX "Consider rebooting with iommu=memaper=2 to get a good aperture.\n");
 #endif 
 			return -1;  
 		}
 		hammers[i++] = loop_dev;
 		nr_garts = i;
-		if (i == MAX_HAMMER_GARTS) { 
-			printk(KERN_INFO PFX "Too many northbridges for AGP\n");
+#ifdef CONFIG_SMP
+		if (i > MAX_HAMMER_GARTS) { 
+			printk(KERN_ERR PFX "Too many northbridges for AGP\n");
 			return -1;
 		}
+#else
+		/* Uniprocessor case, return after finding first bridge.
+		   (There may be more, but in UP, we don't care). */
+		return 0;
+#endif
 	}
+
 	return i == 0 ? -1 : 0;
 }
 
@@ -530,6 +536,8 @@
 
 static void __exit agp_amd64_cleanup(void)
 {
+	if (aperture_resource)
+		release_resource(aperture_resource);
 	pci_unregister_driver(&agp_amd64_pci_driver);
 }
 
diff -Nru a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c
--- a/drivers/char/agp/ati-agp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/agp/ati-agp.c	Thu Jan  8 23:00:24 2004
@@ -135,6 +135,15 @@
 	return retval;
 }
 
+static int is_r200(void)
+{
+	if ((agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS100) ||
+	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200) ||
+	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200_B) ||
+	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS250))
+		return 1;
+	return 0;
+}
 
 static int ati_fetch_size(void)
 {
@@ -142,13 +151,10 @@
 	u32 temp;
 	struct aper_size_info_lvl2 *values;
 
-	if ((agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS100) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+	if (is_r200())
 		pci_read_config_dword(agp_bridge->dev, ATI_RS100_APSIZE, &temp);
-	} else {
+	else
 		pci_read_config_dword(agp_bridge->dev, ATI_RS300_APSIZE, &temp);
-	}
 
 	temp = (temp & 0x0000000e);
 	values = A_SIZE_LVL2(agp_bridge->driver->aperture_sizes);
@@ -178,9 +184,7 @@
 	previous_size = A_SIZE_LVL2(agp_bridge->previous_size);
 
 	/* Write back the previous size and disable gart translation */
-	if ((agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS100) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+	if (is_r200()) {
 		pci_read_config_dword(agp_bridge->dev, ATI_RS100_APSIZE, &temp);
 		temp = ((temp & ~(0x0000000f)) | previous_size->size_value);
 		pci_write_config_dword(agp_bridge->dev, ATI_RS100_APSIZE, temp);
@@ -202,13 +206,10 @@
 	temp = (temp & 0xfffff000);
 	ati_generic_private.registers = (volatile u8 *) ioremap(temp, 4096);
 
-	if ((agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS100) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS250)) {
-        	pci_write_config_dword(agp_bridge->dev, ATI_RS100_IG_AGPMODE, 0x20000);
-	} else {
+	if (is_r200())
+       	pci_write_config_dword(agp_bridge->dev, ATI_RS100_IG_AGPMODE, 0x20000);
+	else
 		pci_write_config_dword(agp_bridge->dev, ATI_RS300_IG_AGPMODE, 0x20000);
-	}
 
 	/* address to map too */
         /*
@@ -332,9 +333,7 @@
 	/* Write out the size register */
 	current_size = A_SIZE_LVL2(agp_bridge->current_size);
 
-	if ((agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS100) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS200) ||
-	    (agp_bridge->dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+	if (is_r200()) {
 		pci_read_config_dword(agp_bridge->dev, ATI_RS100_APSIZE, &temp);
 		temp = (((temp & ~(0x0000000e)) | current_size->size_value)
 			| 0x00000001);
@@ -412,6 +411,10 @@
 	{
 		.device_id	= PCI_DEVICE_ID_ATI_RS200,
 		.chipset_name	= "IGP330/340/345/350/M",
+	},
+	{
+		.device_id	= PCI_DEVICE_ID_ATI_RS200_B,
+		.chipset_name	= "IGP345M",
 	},
 	{
 		.device_id	= PCI_DEVICE_ID_ATI_RS250,
diff -Nru a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
--- a/drivers/char/agp/generic.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/agp/generic.c	Thu Jan  8 23:00:23 2004
@@ -180,7 +180,8 @@
 			agp_free_memory(new);
 			return NULL;
 		}
-		new->memory[i] = virt_to_phys(addr);
+		new->memory[i] =
+			agp_bridge->driver->mask_memory(virt_to_phys(addr), type);
 		new->page_count++;
 	}
 
@@ -560,9 +561,6 @@
 
 	command = agp_collect_device_status(mode, command);
 	command |= AGPSTAT_AGP_ENABLE;
-
-	pci_write_config_dword(agp_bridge->dev,
-		       agp_bridge->capndx + PCI_AGP_COMMAND, command);
 
 	/* Do AGP version specific frobbing. */
 	if(agp_bridge->major_version >= 3) {
diff -Nru a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
--- a/drivers/char/agp/intel-agp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/agp/intel-agp.c	Thu Jan  8 23:00:24 2004
@@ -204,7 +204,7 @@
 	if (new == NULL)
 		return NULL;
 
-	new->memory[0] = virt_to_phys(addr);
+	new->memory[0] = agp_bridge->driver->mask_memory(virt_to_phys(addr), type);
 	new->page_count = 1;
 	new->num_scratch_pages = 1;
 	new->type = AGP_PHYS_MEMORY;
diff -Nru a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c
--- a/drivers/char/agp/nvidia-agp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/agp/nvidia-agp.c	Thu Jan  8 23:00:23 2004
@@ -46,10 +46,54 @@
 	return 0;
 }
 
+#define SYSCFG          0xC0010010
+#define IORR_BASE0      0xC0010016
+#define IORR_MASK0      0xC0010017
+#define AMD_K7_NUM_IORR 2
+
+static int nvidia_init_iorr(u32 base, u32 size)
+{
+	u32 base_hi, base_lo;
+	u32 mask_hi, mask_lo;
+	u32 sys_hi, sys_lo;
+	u32 iorr_addr, free_iorr_addr;
+
+	/* Find the iorr that is already used for the base */
+	/* If not found, determine the uppermost available iorr */
+	free_iorr_addr = AMD_K7_NUM_IORR;
+	for(iorr_addr = 0; iorr_addr < AMD_K7_NUM_IORR; iorr_addr++) {
+		rdmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi);
+		rdmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi);
+
+		if ((base_lo & 0xfffff000) == (base & 0xfffff000))
+			break;
+
+		if ((mask_lo & 0x00000800) == 0)
+			free_iorr_addr = iorr_addr;
+	}
+	
+	if (iorr_addr >= AMD_K7_NUM_IORR) {
+		iorr_addr = free_iorr_addr;
+		if (iorr_addr >= AMD_K7_NUM_IORR)
+			return -EINVAL;
+	}
+    base_hi = 0x0;
+    base_lo = (base & ~0xfff) | 0x18;
+    mask_hi = 0xf;
+    mask_lo = ((~(size - 1)) & 0xfffff000) | 0x800;
+    wrmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi);
+    wrmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi);
+
+    rdmsr(SYSCFG, sys_lo, sys_hi);
+    sys_lo |= 0x00100000;
+    wrmsr(SYSCFG, sys_lo, sys_hi);
+
+	return 0;
+}
 
 static int nvidia_configure(void)
 {
-	int i, num_dirs;
+	int i, rc, num_dirs;
 	u32 apbase, aplimit;
 	struct aper_size_info_8 *current_size;
 	u32 temp;
@@ -69,6 +113,8 @@
 	pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APLIMIT, aplimit);
 	pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APBASE, apbase);
 	pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APLIMIT, aplimit);
+	if (0 != (rc = nvidia_init_iorr(apbase, current_size->size * 1024 * 1024)))
+		return rc;
 
 	/* directory size is 64k */
 	num_dirs = current_size->size / 64;
@@ -122,6 +168,10 @@
 	previous_size = A_SIZE_8(agp_bridge->previous_size);
 	pci_write_config_byte(agp_bridge->dev, NVIDIA_0_APSIZE,
 		previous_size->size_value);
+
+	/* restore iorr for previous aperture size */
+	nvidia_init_iorr(agp_bridge->gart_bus_addr,
+		previous_size->size * 1024 * 1024);
 }
 
 
diff -Nru a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
--- a/drivers/char/drm/drmP.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/drm/drmP.h	Thu Jan  8 23:00:24 2004
@@ -760,16 +760,16 @@
 				/* Mapping support (drm_vm.h) */
 extern struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
 				   unsigned long address,
-				   int write_access);
+				   int *type);
 extern struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
 				       unsigned long address,
-				       int write_access);
+				       int *type);
 extern struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
 				       unsigned long address,
-				       int write_access);
+				       int *type);
 extern struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
 				      unsigned long address,
-				      int write_access);
+				      int *type);
 extern void	     DRM(vm_open)(struct vm_area_struct *vma);
 extern void	     DRM(vm_close)(struct vm_area_struct *vma);
 extern void	     DRM(vm_shm_close)(struct vm_area_struct *vma);
diff -Nru a/drivers/char/drm/drm_vm.h b/drivers/char/drm/drm_vm.h
--- a/drivers/char/drm/drm_vm.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/drm/drm_vm.h	Thu Jan  8 23:00:24 2004
@@ -76,7 +76,7 @@
  */
 struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
 			    unsigned long address,
-			    int write_access)
+			    int *type)
 {
 #if __REALLY_HAVE_AGP
 	drm_file_t *priv  = vma->vm_file->private_data;
@@ -133,6 +133,8 @@
 			  baddr, __va(agpmem->memory->memory[offset]), offset,
 			  atomic_read(&page->count));
 
+		if (type)
+			*type = VM_FAULT_MINOR;
 		return page;
         }
 vm_nopage_error:
@@ -154,7 +156,7 @@
  */
 struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
 				unsigned long address,
-				int write_access)
+				int *type)
 {
 	drm_map_t	 *map	 = (drm_map_t *)vma->vm_private_data;
 	unsigned long	 offset;
@@ -170,6 +172,8 @@
 	if (!page)
 		return NOPAGE_OOM;
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	DRM_DEBUG("shm_nopage 0x%lx\n", address);
 	return page;
@@ -268,7 +272,7 @@
  */
 struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
 				unsigned long address,
-				int write_access)
+				int *type)
 {
 	drm_file_t	 *priv	 = vma->vm_file->private_data;
 	drm_device_t	 *dev	 = priv->dev;
@@ -287,6 +291,8 @@
 			     (offset & (~PAGE_MASK))));
 
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	DRM_DEBUG("dma_nopage 0x%lx (page %lu)\n", address, page_nr);
 	return page;
@@ -304,7 +310,7 @@
  */
 struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
 			       unsigned long address,
-			       int write_access)
+			       int *type)
 {
 	drm_map_t        *map    = (drm_map_t *)vma->vm_private_data;
 	drm_file_t *priv = vma->vm_file->private_data;
@@ -325,6 +331,8 @@
 	page_offset = (offset >> PAGE_SHIFT) + (map_offset >> PAGE_SHIFT);
 	page = entry->pagelist[page_offset];
 	get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 
 	return page;
 }
diff -Nru a/drivers/char/drm/ffb_drv.c b/drivers/char/drm/ffb_drv.c
--- a/drivers/char/drm/ffb_drv.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/drm/ffb_drv.c	Thu Jan  8 23:00:24 2004
@@ -372,25 +372,6 @@
 	return ret;
 }
 
-#ifndef MODULE
-/* DRM(options) is called by the kernel to parse command-line options
- * passed via the boot-loader (e.g., LILO).  It calls the insmod option
- * routine, drm_parse_drm.
- */
-
-/* JH- We have to hand expand the string ourselves because of the cpp.  If
- * anyone can think of a way that we can fit into the __setup macro without
- * changing it, then please send the solution my way.
- */
-static int __init ffb_options(char *str)
-{
-	DRM(parse_options)(str);
-	return 1;
-}
-
-__setup(DRIVER_NAME "=", ffb_options);
-#endif
-
 #include "drm_fops.h"
 #include "drm_init.h"
 #include "drm_ioctl.h"
diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c
--- a/drivers/char/keyboard.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/keyboard.c	Thu Jan  8 23:00:23 2004
@@ -941,16 +941,16 @@
 	 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
 	 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
 	 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
-	 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90,
-	284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
-	367,288,302,304,350, 92,334,512,116,377,109,111,373,347,348,349,
-	360, 93, 94, 95, 98,376,100,101,321,316,354,286,289,102,351,355,
+	 80, 81, 82, 83, 84, 93, 86, 87, 88, 94, 95, 85,259,375,260, 90,
+	284,285,309,311,312, 91,327,328,329,331,333,335,336,337,338,339,
+	367,288,302,304,350, 89,334,326,116,377,109,111,126,347,348,349,
+	360,261,262,263,298,376,100,101,321,316,373,286,289,102,351,355,
 	103,104,105,275,287,279,306,106,274,107,294,364,358,363,362,361,
-	291,108,381,281,290,272,292,305,280, 99,112,257,258,359,270,114,
-	118,117,125,374,379,115,112,125,121,123,264,265,266,267,268,269,
-	271,273,276,277,278,282,283,295,296,297,299,300,301,293,303,307,
-	308,310,313,314,315,317,318,319,320,357,322,323,324,325,326,330,
-	332,340,365,342,343,344,345,346,356,113,341,368,369,370,371,372 };
+	291,108,381,281,290,272,292,305,280, 99,112,257,258,359,113,114,
+	264,117,271,374,379,115,125,273,121,123, 92,265,266,267,268,269,
+	120,119,118,277,278,282,283,295,296,297,299,300,301,293,303,307,
+	308,310,313,314,315,317,318,319,320,357,322,323,324,325,276,330,
+	332,340,365,342,343,344,345,346,356,270,341,368,369,370,371,372 };
 
 #ifdef CONFIG_MAC_EMUMOUSEBTN
 extern int mac_hid_mouse_emulate_buttons(int, int, int);
@@ -972,11 +972,18 @@
 	if (keycode > 255 || !x86_keycodes[keycode])
 		return -1; 
 
-	if (keycode == KEY_PAUSE) {
-		put_queue(vc, 0xe1);
-		put_queue(vc, 0x1d | up_flag);
-		put_queue(vc, 0x45 | up_flag);
-		return 0;
+	switch (keycode) {
+		case KEY_PAUSE:
+			put_queue(vc, 0xe1);
+			put_queue(vc, 0x1d | up_flag);
+			put_queue(vc, 0x45 | up_flag);
+			return 0;
+		case KEY_LANG1:
+			if (!up_flag) put_queue(vc, 0xf1);
+			return 0;
+		case KEY_LANG2:
+			if (!up_flag) put_queue(vc, 0xf2);
+			return 0;
 	} 
 
 	if (keycode == KEY_SYSRQ && sysrq_alt) {
diff -Nru a/drivers/char/ppdev.c b/drivers/char/ppdev.c
--- a/drivers/char/ppdev.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/ppdev.c	Thu Jan  8 23:00:24 2004
@@ -67,6 +67,7 @@
 #include <asm/uaccess.h>
 #include <linux/ppdev.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 
 #define PP_VERSION "ppdev: user-space parallel port driver"
 #define CHRDEV "ppdev"
@@ -782,4 +783,4 @@
 module_exit(ppdev_cleanup);
 
 MODULE_LICENSE("GPL");
-
+MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);
diff -Nru a/drivers/char/sx.c b/drivers/char/sx.c
--- a/drivers/char/sx.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/sx.c	Thu Jan  8 23:00:23 2004
@@ -509,13 +509,13 @@
 
 	func_enter ();
 
-	for (i=0; i < TIMEOUT_1 > 0;i++) 
+	for (i=0; i < TIMEOUT_1 ;i++)
 		if ((read_sx_byte (board, offset) & mask) == correctval) {
 			func_exit ();
 			return 1;
 		}
 
-	for (i=0; i < TIMEOUT_2 > 0;i++) {
+	for (i=0; i < TIMEOUT_2 ;i++) {
 		if ((read_sx_byte (board, offset) & mask) == correctval) {
 			func_exit ();
 			return 1;
@@ -535,13 +535,13 @@
 
 	func_enter ();
 
-	for (i=0; i < TIMEOUT_1 > 0;i++) 
+	for (i=0; i < TIMEOUT_1 ;i++)
 		if ((read_sx_byte (board, offset) & mask) != badval) {
 			func_exit ();
 			return 1;
 		}
 
-	for (i=0; i < TIMEOUT_2 > 0;i++) {
+	for (i=0; i < TIMEOUT_2 ;i++) {
 		if ((read_sx_byte (board, offset) & mask) != badval) {
 			func_exit ();
 			return 1;
diff -Nru a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c
--- a/drivers/char/vt_ioctl.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/vt_ioctl.c	Thu Jan  8 23:00:24 2004
@@ -332,7 +332,7 @@
 }
 
 static inline int 
-do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm)
+do_unimap_ioctl(int cmd, struct unimapdesc *user_ud, int perm, unsigned int console)
 {
 	struct unimapdesc tmp;
 	int i = 0; 
@@ -348,9 +348,11 @@
 	case PIO_UNIMAP:
 		if (!perm)
 			return -EPERM;
-		return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries);
+		return con_set_unimap(console, tmp.entry_ct, tmp.entries);
 	case GIO_UNIMAP:
-		return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
+		if (!perm && fg_console != console)
+			return -EPERM;
+		return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
 	}
 	return 0;
 }
@@ -966,13 +968,13 @@
 			return -EPERM;
 		i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit));
 		if (i) return -EFAULT;
-		con_clear_unimap(fg_console, &ui);
+		con_clear_unimap(console, &ui);
 		return 0;
 	      }
 
 	case PIO_UNIMAP:
 	case GIO_UNIMAP:
-		return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm);
+		return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm, console);
 
 	case VT_LOCKSWITCH:
 		if (!capable(CAP_SYS_TTY_CONFIG))
diff -Nru a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig
--- a/drivers/char/watchdog/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/Kconfig	Thu Jan  8 23:00:24 2004
@@ -17,7 +17,7 @@
 	  implementation entirely in software (which can sometimes fail to
 	  reboot the machine) and a driver for hardware watchdog boards, which
 	  are more robust and can also keep track of the temperature inside
-	  your computer. For details, read <file:Documentation/watchdog.txt>
+	  your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
 	  in the kernel source.
 
 	  The watchdog is usually used together with the watchdog daemon
@@ -114,7 +114,7 @@
 	  This card simply watches your kernel to make sure it doesn't freeze,
 	  and if it does, it reboots your computer after a certain amount of
 	  time. This driver is like the WDT501 driver but for different
-	  hardware. Please read <file:Documentation/pcwd-watchdog.txt>. The PC
+	  hardware. Please read <file:Documentation/watchdog/pcwd-watchdog.txt>. The PC
 	  watchdog cards can be ordered from <http://www.berkprod.com/>.
 
 	  To compile this driver as a module, choose M here: the
@@ -273,6 +273,21 @@
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called w83877f_wdt.
+
+	  Most people will say N.
+
+config W83627HF_WDT
+	tristate "W83627HF Watchdog Timer"
+	depends on WATCHDOG
+	---help---
+	  This is the driver for the hardware watchdog on the W83627HF chipset
+	  as used in Advantech PC-9578 and Tyan S2721-533 motherboards
+	  (and likely others).  This watchdog simply watches your kernel to
+	  make sure it doesn't freeze, and if it does, it reboots your computer
+	  after a certain amount of time.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called w83627hf_wdt.
 
 	  Most people will say N.
 
diff -Nru a/drivers/char/watchdog/Makefile b/drivers/char/watchdog/Makefile
--- a/drivers/char/watchdog/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/Makefile	Thu Jan  8 23:00:24 2004
@@ -25,6 +25,7 @@
 obj-$(CONFIG_EUROTECH_WDT) += eurotechwdt.o
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
 obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o
+obj-$(CONFIG_W83627HF_WDT) += w83627hf_wdt.o
 obj-$(CONFIG_SC520_WDT) += sc520_wdt.o
 obj-$(CONFIG_ALIM7101_WDT) += alim7101_wdt.o
 obj-$(CONFIG_ALIM1535_WDT) += alim1535_wdt.o
diff -Nru a/drivers/char/watchdog/i810-tco.c b/drivers/char/watchdog/i810-tco.c
--- a/drivers/char/watchdog/i810-tco.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/watchdog/i810-tco.c	Thu Jan  8 23:00:23 2004
@@ -232,9 +232,8 @@
 
 		/* someone wrote to us, we should reload the timer */
 		tco_timer_reload ();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int i810tco_ioctl (struct inode *inode, struct file *file,
diff -Nru a/drivers/char/watchdog/ib700wdt.c b/drivers/char/watchdog/ib700wdt.c
--- a/drivers/char/watchdog/ib700wdt.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/ib700wdt.c	Thu Jan  8 23:00:24 2004
@@ -161,9 +161,8 @@
 			}
 		}
 		ibwdt_ping();
-		return 1;
 	}
-	return 0;
+	return count;
 }
 
 static int
diff -Nru a/drivers/char/watchdog/indydog.c b/drivers/char/watchdog/indydog.c
--- a/drivers/char/watchdog/indydog.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/indydog.c	Thu Jan  8 23:00:24 2004
@@ -113,9 +113,8 @@
 			}
 		}
 		indydog_ping();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int indydog_ioctl(struct inode *inode, struct file *file,
diff -Nru a/drivers/char/watchdog/machzwd.c b/drivers/char/watchdog/machzwd.c
--- a/drivers/char/watchdog/machzwd.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/watchdog/machzwd.c	Thu Jan  8 23:00:23 2004
@@ -343,10 +343,9 @@
 		next_heartbeat = jiffies + ZF_USER_TIMEO;
 		dprintk("user ping at %ld\n", jiffies);
 		
-		return 1;
 	}
 
-	return 0;
+	return count;
 }
 
 static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
diff -Nru a/drivers/char/watchdog/mixcomwd.c b/drivers/char/watchdog/mixcomwd.c
--- a/drivers/char/watchdog/mixcomwd.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/watchdog/mixcomwd.c	Thu Jan  8 23:00:23 2004
@@ -156,9 +156,8 @@
 			}
 		}
 		mixcomwd_ping();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int mixcomwd_ioctl(struct inode *inode, struct file *file,
diff -Nru a/drivers/char/watchdog/pcwd.c b/drivers/char/watchdog/pcwd.c
--- a/drivers/char/watchdog/pcwd.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/watchdog/pcwd.c	Thu Jan  8 23:00:23 2004
@@ -419,9 +419,8 @@
 			}
 		}
 		pcwd_send_heartbeat();
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int pcwd_open(struct inode *ino, struct file *filep)
diff -Nru a/drivers/char/watchdog/sa1100_wdt.c b/drivers/char/watchdog/sa1100_wdt.c
--- a/drivers/char/watchdog/sa1100_wdt.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/sa1100_wdt.c	Thu Jan  8 23:00:24 2004
@@ -106,7 +106,7 @@
 		OSMR3 = OSCR + pre_margin;
 	}
 
-	return len ? 1 : 0;
+	return len;
 }
 
 static struct watchdog_info ident = {
diff -Nru a/drivers/char/watchdog/softdog.c b/drivers/char/watchdog/softdog.c
--- a/drivers/char/watchdog/softdog.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/char/watchdog/softdog.c	Thu Jan  8 23:00:23 2004
@@ -155,9 +155,8 @@
 			}
 		}
 		mod_timer(&watchdog_ticktock, jiffies+(soft_margin*HZ));
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static int softdog_ioctl(struct inode *inode, struct file *file,
diff -Nru a/drivers/char/watchdog/w83627hf_wdt.c b/drivers/char/watchdog/w83627hf_wdt.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/char/watchdog/w83627hf_wdt.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,324 @@
+/*
+ *	w83627hf WDT driver
+ *
+ *	(c) Copyright 2003 Pádraig Brady <P@draigBrady.com>
+ *
+ *	Based on advantechwdt.c which is based on wdt.c.
+ *	Original copyright messages:
+ *
+ *	(c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl>
+ *
+ *	(c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved.
+ *				http://www.redhat.com
+ *
+ *	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 Alan Cox nor CymruNet Ltd. admit liability nor provide
+ *	warranty for any of this software. This material is provided
+ *	"AS-IS" and at no charge.
+ *
+ *	(c) Copyright 1995    Alan Cox <alan@redhat.com>
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/types.h>
+#include <linux/miscdevice.h>
+#include <linux/watchdog.h>
+#include <linux/fs.h>
+#include <linux/ioport.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+
+#define WATCHDOG_NAME "w83627hf WDT"
+#define PFX WATCHDOG_NAME ": "
+#define WATCHDOG_TIMEOUT 60		/* 60 sec default timeout */
+
+static unsigned long wdt_is_open;
+static char expect_close;
+
+/* You must set this - there is no sane way to probe for this board. */
+static int wdt_io = 0x2E;
+module_param(wdt_io, int, 0);
+MODULE_PARM_DESC(wdt_io, "w83627hf WDT io port (default 0x2E)");
+
+static int timeout = WATCHDOG_TIMEOUT;	/* in seconds */
+module_param(timeout, int, 0);
+MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
+
+#ifdef CONFIG_WATCHDOG_NOWAYOUT
+static int nowayout = 1;
+#else
+static int nowayout = 0;
+#endif
+
+module_param(nowayout, int, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+
+/*
+ *	Kernel methods.
+ */
+
+#define WDT_EFER (wdt_io+0)   /* Extended Function Enable Registers */
+#define WDT_EFIR (wdt_io+0)   /* Extended Function Index Register (same as EFER) */
+#define WDT_EFDR (WDT_EFIR+1) /* Extended Function Data Register */
+
+static void
+wdt_ctrl(int timeout)
+{
+	outb_p(0x87, WDT_EFER); /* Enter extended function mode */
+	outb_p(0x87, WDT_EFER); /* Again according to manual */
+
+	outb_p(0x07, WDT_EFER); /* point to logical device number reg */
+	outb_p(0x08, WDT_EFDR); /* select logical device 8 (GPIO2) */
+	outb_p(0x30, WDT_EFER); /* select CR30 */
+	outb_p(0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */
+
+	outb_p(0xF6, WDT_EFER);    /* Select CRF6 */
+	outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */
+
+	outb_p(0xAA, WDT_EFER); /* Leave extended function mode */
+}
+
+static void
+wdt_ping(void)
+{
+	wdt_ctrl(timeout);
+}
+
+static void
+wdt_disable(void)
+{
+	wdt_ctrl(0);
+}
+
+static ssize_t
+wdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
+{
+	/*  Can't seek (pwrite) on this device  */
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+
+	if (count) {
+		if (!nowayout) {
+			size_t i;
+
+			expect_close = 0;
+
+			for (i = 0; i != count; i++) {
+				char c;
+				if (get_user(c, buf+i))
+					return -EFAULT;
+				if (c == 'V')
+					expect_close = 42;
+			}
+		}
+		wdt_ping();
+	}
+	return count;
+}
+
+static int
+wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+	  unsigned long arg)
+{
+	int new_timeout;
+	static struct watchdog_info ident = {
+		.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+		.firmware_version = 1,
+		.identity = "Advantech WDT",
+	};
+
+	switch (cmd) {
+	case WDIOC_GETSUPPORT:
+	  if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident)))
+	    return -EFAULT;
+	  break;
+
+	case WDIOC_GETSTATUS:
+	case WDIOC_GETBOOTSTATUS:
+	  return put_user(0, (int *)arg);
+
+	case WDIOC_KEEPALIVE:
+	  wdt_ping();
+	  break;
+
+	case WDIOC_SETTIMEOUT:
+	  if (get_user(new_timeout, (int *)arg))
+		  return -EFAULT;
+	  if ((new_timeout < 1) || (new_timeout > 63))
+		  return -EINVAL;
+	  timeout = new_timeout;
+	  wdt_ping();
+	  /* Fall */
+
+	case WDIOC_GETTIMEOUT:
+	  return put_user(timeout, (int *)arg);
+
+	case WDIOC_SETOPTIONS:
+	{
+	  int options, retval = -EINVAL;
+
+	  if (get_user(options, (int *)arg))
+	    return -EFAULT;
+
+	  if (options & WDIOS_DISABLECARD) {
+	    wdt_disable();
+	    retval = 0;
+	  }
+
+	  if (options & WDIOS_ENABLECARD) {
+	    wdt_ping();
+	    retval = 0;
+	  }
+
+	  return retval;
+	}
+
+	default:
+	  return -ENOTTY;
+	}
+	return 0;
+}
+
+static int
+wdt_open(struct inode *inode, struct file *file)
+{
+	if (test_and_set_bit(0, &wdt_is_open))
+		return -EBUSY;
+	/*
+	 *	Activate
+	 */
+
+	wdt_ping();
+	return 0;
+}
+
+static int
+wdt_close(struct inode *inode, struct file *file)
+{
+	if (expect_close == 42) {
+		wdt_disable();
+	} else {
+		printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n");
+		wdt_ping();
+	}
+	clear_bit(0, &wdt_is_open);
+	expect_close = 0;
+	return 0;
+}
+
+/*
+ *	Notifier for system down
+ */
+
+static int
+wdt_notify_sys(struct notifier_block *this, unsigned long code,
+	void *unused)
+{
+	if (code == SYS_DOWN || code == SYS_HALT) {
+		/* Turn the WDT off */
+		wdt_disable();
+	}
+	return NOTIFY_DONE;
+}
+
+/*
+ *	Kernel Interfaces
+ */
+
+static struct file_operations wdt_fops = {
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.write		= wdt_write,
+	.ioctl		= wdt_ioctl,
+	.open		= wdt_open,
+	.release	= wdt_close,
+};
+
+static struct miscdevice wdt_miscdev = {
+	.minor = WATCHDOG_MINOR,
+	.name = "watchdog",
+	.fops = &wdt_fops,
+};
+
+/*
+ *	The WDT needs to learn about soft shutdowns in order to
+ *	turn the timebomb registers off.
+ */
+
+static struct notifier_block wdt_notifier = {
+	.notifier_call = wdt_notify_sys,
+	.next = NULL,
+	.priority = 0,
+};
+
+static int __init
+wdt_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
+
+	if (timeout < 1 || timeout > 63) {
+		timeout = WATCHDOG_TIMEOUT;
+		printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
+			timeout);
+	}
+
+	if (!request_region(wdt_io, 1, WATCHDOG_NAME)) {
+		printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
+			wdt_io);
+		ret = -EIO;
+		goto out;
+	}
+
+	ret = register_reboot_notifier(&wdt_notifier);
+	if (ret != 0) {
+		printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
+			ret);
+		goto unreg_regions;
+	}
+
+	ret = misc_register(&wdt_miscdev);
+	if (ret != 0) {
+		printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
+			WATCHDOG_MINOR, ret);
+		goto unreg_reboot;
+	}
+
+	printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
+		timeout, nowayout);
+
+out:
+	return ret;
+unreg_reboot:
+	unregister_reboot_notifier(&wdt_notifier);
+unreg_regions:
+	release_region(wdt_io, 1);
+	goto out;
+}
+
+static void __exit
+wdt_exit(void)
+{
+	misc_deregister(&wdt_miscdev);
+	unregister_reboot_notifier(&wdt_notifier);
+	release_region(wdt_io,1);
+}
+
+module_init(wdt_init);
+module_exit(wdt_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Pádraig Brady <P@draigBrady.com>");
+MODULE_DESCRIPTION("w38627hf WDT driver");
+
diff -Nru a/drivers/char/watchdog/wdt.c b/drivers/char/watchdog/wdt.c
--- a/drivers/char/watchdog/wdt.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/char/watchdog/wdt.c	Thu Jan  8 23:00:24 2004
@@ -265,9 +265,8 @@
 			}
 		}
 		wdt_ping();
-		return 1;
 	}
-	return 0;
+	return count;
 }
 
 /**
diff -Nru a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
--- a/drivers/cpufreq/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/cpufreq/Kconfig	Thu Jan  8 23:00:24 2004
@@ -74,7 +74,7 @@
 	help
 	  This enables the /proc/sys/cpu/ sysctl interface for controlling
 	  the CPUFreq,"userspace" governor. This is the same interface
-	  as known from the.4.-kernel patches for CPUFreq, and offers
+	  as known from the 2.4.-kernel patches for CPUFreq, and offers
 	  the same functionality as long as "userspace" is the
 	  selected governor for the specified CPU.
 	
diff -Nru a/drivers/fc4/fc.c b/drivers/fc4/fc.c
--- a/drivers/fc4/fc.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/fc4/fc.c	Thu Jan  8 23:00:24 2004
@@ -1156,3 +1156,6 @@
 	kfree(p);
 	return status;
 }
+
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
--- a/drivers/i2c/algos/i2c-algo-bit.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/algos/i2c-algo-bit.c	Thu Jan  8 23:00:24 2004
@@ -18,10 +18,8 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
 /* ------------------------------------------------------------------------- */
 
-/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
-   Frodo Looijaard <frodol@dds.nl> */
-
-/* $Id: i2c-algo-bit.c,v 1.44 2003/01/21 08:08:16 kmalkki Exp $ */
+/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
+   <kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
 
 /* #define DEBUG 1 */
 
@@ -87,8 +85,10 @@
 	setscl(adap,1);
 
 	/* Not all adapters have scl sense line... */
-	if (adap->getscl == NULL )
+	if (adap->getscl == NULL ) {
+		udelay(adap->udelay);
 		return 0;
+	}
 
 	start=jiffies;
 	while (! getscl(adap) ) {	
@@ -222,68 +222,72 @@
  */
 static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
 	int scl,sda;
+
+	if (adap->getscl==NULL)
+		printk(KERN_INFO "i2c-algo-bit.o: Testing SDA only, "
+			"SCL is not readable.\n");
+
 	sda=getsda(adap);
-	if (adap->getscl==NULL) {
-		printk(KERN_WARNING "i2c-algo-bit.o: Warning: Adapter can't read from clock line - skipping test.\n");
-		return 0;		
-	}
-	scl=getscl(adap);
-	printk(KERN_INFO "i2c-algo-bit.o: Adapter: %s scl: %d  sda: %d -- testing...\n",
-	       name,getscl(adap),getsda(adap));
+	scl=(adap->getscl==NULL?1:getscl(adap));
+	printk(KERN_DEBUG "i2c-algo-bit.o: (0) scl=%d, sda=%d\n",scl,sda);
 	if (!scl || !sda ) {
-		printk(KERN_INFO " i2c-algo-bit.o: %s seems to be busy.\n",name);
+		printk(KERN_WARNING "i2c-algo-bit.o: %s seems to be busy.\n", name);
 		goto bailout;
 	}
+
 	sdalo(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:1 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck high!\n",name);
-		sdahi(adap);
+	sda=getsda(adap);
+	scl=(adap->getscl==NULL?1:getscl(adap));
+	printk(KERN_DEBUG "i2c-algo-bit.o: (1) scl=%d, sda=%d\n",scl,sda);
+	if ( 0 != sda ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck high!\n");
 		goto bailout;
 	}
-	if ( 0 == getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while pulling SDA low!\n",
-			name);
+	if ( 0 == scl ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
+			"while pulling SDA low!\n");
 		goto bailout;
 	}		
+
 	sdahi(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:2 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 == getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck low!\n",name);
-		sdahi(adap);
+	sda=getsda(adap);
+	scl=(adap->getscl==NULL?1:getscl(adap));
+	printk(KERN_DEBUG "i2c-algo-bit.o: (2) scl=%d, sda=%d\n",scl,sda);
+	if ( 0 == sda ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck low!\n");
 		goto bailout;
 	}
-	if ( 0 == getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while SDA high!\n",
-		       name);
-	goto bailout;
+	if ( 0 == scl ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
+			"while pulling SDA high!\n");
+		goto bailout;
 	}
+
 	scllo(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:3 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck high!\n",name);
-		sclhi(adap);
+	sda=getsda(adap);
+	scl=(adap->getscl==NULL?0:getscl(adap));
+	printk(KERN_DEBUG "i2c-algo-bit.o: (3) scl=%d, sda=%d\n",scl,sda);
+	if ( 0 != scl ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck high!\n");
 		goto bailout;
 	}
-	if ( 0 == getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while pulling SCL low!\n",
-			name);
+	if ( 0 == sda ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
+			"while pulling SCL low!\n");
 		goto bailout;
 	}
+	
 	sclhi(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:4 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 == getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck low!\n",name);
-		sclhi(adap);
+	sda=getsda(adap);
+	scl=(adap->getscl==NULL?1:getscl(adap));
+	printk(KERN_DEBUG "i2c-algo-bit.o: (4) scl=%d, sda=%d\n",scl,sda);
+	if ( 0 == scl ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck low!\n");
 		goto bailout;
 	}
-	if ( 0 == getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while SCL high!\n",
-			name);
+	if ( 0 == sda ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
+			"while pulling SCL high!\n");
 		goto bailout;
 	}
 	printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
diff -Nru a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c
--- a/drivers/i2c/algos/i2c-algo-ite.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/algos/i2c-algo-ite.c	Thu Jan  8 23:00:24 2004
@@ -60,27 +60,13 @@
  	/* debug the protocol by showing transferred bits */
 #define DEF_TIMEOUT 16
 
-/* debugging - slow down transfer to have a look at the data .. 	*/
-/* I use this with two leds&resistors, each one connected to sda,scl 	*/
-/* respectively. This makes sure that the algorithm works. Some chips   */
-/* might not like this, as they have an internal timeout of some mils	*/
-/*
-#define SLO_IO      jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\
-                        cond_resched();
-*/
-
 
 /* ----- global variables ---------------------------------------------	*/
 
-#ifdef SLO_IO
-	int jif;
-#endif
-
 /* module parameters:
  */
 static int i2c_debug=1;
 static int iic_test=0;	/* see if the line-setting functions work	*/
-static int iic_scan=0;	/* have a look at what's hanging 'round		*/
 
 /* --- setting states on the bus with the right timing: ---------------	*/
 
@@ -757,8 +743,6 @@
  */
 int i2c_iic_add_bus(struct i2c_adapter *adap)
 {
-	int i;
-	short status;
 	struct i2c_algo_iic_data *iic_adap = adap->algo_data;
 
 	if (iic_test) {
@@ -782,24 +766,6 @@
 	i2c_add_adapter(adap);
 	iic_init(iic_adap);
 
-	/* scan bus */
-	/* By default scanning the bus is turned off. */
-	if (iic_scan) {
-		printk(KERN_INFO " i2c-algo-ite: scanning bus %s.\n",
-		       adap->name);
-		for (i = 0x00; i < 0xff; i+=2) {
-			iic_outw(iic_adap, ITE_I2CSAR, i);
-			iic_start(iic_adap);
-			if ( (wait_for_pin(iic_adap, &status) == 0) && 
-			    ((status & ITE_I2CHSR_DNE) == 0) ) { 
-				printk(KERN_INFO "\n(%02x)\n",i>>1); 
-			} else {
-				printk(KERN_INFO "."); 
-				iic_reset(iic_adap);
-			}
-			udelay(iic_adap->udelay);
-		}
-	}
 	return 0;
 }
 
@@ -839,11 +805,9 @@
 MODULE_LICENSE("GPL");
 
 MODULE_PARM(iic_test, "i");
-MODULE_PARM(iic_scan, "i");
 MODULE_PARM(i2c_debug,"i");
 
 MODULE_PARM_DESC(iic_test, "Test if the I2C bus is available");
-MODULE_PARM_DESC(iic_scan, "Scan for active chips on the bus");
 MODULE_PARM_DESC(i2c_debug,
         "debug level - 0 off; 1 normal; 2,3 more verbose; 9 iic-protocol");
 
diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
--- a/drivers/i2c/busses/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/Kconfig	Thu Jan  8 23:00:24 2004
@@ -161,11 +161,12 @@
 	help
 	  If you say yes to this option, support will be included for the Intel
 	  PIIX4 family of mainboard I2C interfaces.  Specifically, the following
-	  versions of the chipset is supported:
+	  versions of the chipset are supported:
 	    Intel PIIX4
 	    Intel 440MX
 	    Serverworks OSB4
 	    Serverworks CSB5
+	    Serverworks CSB6
 	    SMSC Victory66
 
 	  This driver can also be built as a module.  If so, the module
@@ -201,7 +202,7 @@
 
 config SCx200_I2C
 	tristate "NatSemi SCx200 I2C using GPIO pins"
-	depends on SCx200 && I2C_ALGOBIT
+	depends on SCx200_GPIO && I2C_ALGOBIT
 	help
 	  Enable the use of two GPIO pins of a SCx200 processor as an I2C bus.
 
@@ -228,7 +229,7 @@
 
 config SCx200_ACB
 	tristate "NatSemi SCx200 ACCESS.bus"
-	depends on I2C_ALGOBIT!=n && I2C
+	depends on I2C
 	help
 	  Enable the use of the ACCESS.bus controllers of a SCx200 processor.
 
@@ -275,10 +276,10 @@
 	  will be called i2c-sis96x.
 
 config I2C_VELLEMAN
-	tristate "Velleman K9000 adapter"
+	tristate "Velleman K8000 adapter"
 	depends on I2C_ALGOBIT && ISA
 	help
-	  This supports the Velleman K9000 parallel-port I2C adapter.  Say Y
+	  This supports the Velleman K8000 parallel-port I2C adapter.  Say Y
 	  if you own such an adapter.
 
 	  This support is also available as a module.  If so, the module 
@@ -309,6 +310,7 @@
 	  8233
 	  8233A
 	  8235
+	  8237
 
 	  This driver can also be built as a module.  If so, the module
 	  will be called i2c-viapro.
diff -Nru a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
--- a/drivers/i2c/busses/i2c-amd756.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-amd756.c	Thu Jan  8 23:00:24 2004
@@ -28,10 +28,12 @@
     2002-04-08: Added nForce support. (Csaba Halasz)
     2002-10-03: Fixed nForce PnP I/O port. (Michael Steil)
     2002-12-28: Rewritten into something that resembles a Linux driver (hch)
+    2003-11-29: Added back AMD8111 removed by the previous rewrite.
+                (Philip Pokorny)
 */
 
 /*
-   Supports AMD756, AMD766, AMD768 and nVidia nForce
+   Supports AMD756, AMD766, AMD768, AMD8111 and nVidia nForce
    Note: we assume there can only be one device, with one SMBus interface.
 */
 
@@ -213,9 +215,8 @@
 	case I2C_SMBUS_BYTE:
 		outw_p(((addr & 0x7f) << 1) | (read_write & 0x01),
 		       SMB_HOST_ADDRESS);
-		/* TODO: Why only during write? */
 		if (read_write == I2C_SMBUS_WRITE)
-			outb_p(command, SMB_HOST_COMMAND);
+			outb_p(command, SMB_HOST_DATA);
 		size = AMD756_BYTE;
 		break;
 	case I2C_SMBUS_BYTE_DATA:
@@ -308,12 +309,13 @@
 	.name		= "unset",
 };
 
-enum chiptype { AMD756, AMD766, AMD768, NFORCE };
+enum chiptype { AMD756, AMD766, AMD768, NFORCE, AMD8111 };
 
 static struct pci_device_id amd756_ids[] = {
 	{PCI_VENDOR_ID_AMD, 0x740B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AMD756 },
 	{PCI_VENDOR_ID_AMD, 0x7413, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AMD766 },
 	{PCI_VENDOR_ID_AMD, 0x7443, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AMD768 },
+	{PCI_VENDOR_ID_AMD, 0x746B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AMD8111 },
 	{PCI_VENDOR_ID_NVIDIA, 0x01B4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE },
 	{ 0, }
 };
@@ -321,7 +323,8 @@
 static int __devinit amd756_probe(struct pci_dev *pdev,
 				  const struct pci_device_id *id)
 {
-	int nforce = (id->driver_data == NFORCE), error;
+	int nforce = (id->driver_data == NFORCE);
+	int error;
 	u8 temp;
 	
 	if (amd756_ioport) {
@@ -368,7 +371,7 @@
 	amd756_adapter.dev.parent = &pdev->dev;
 
 	snprintf(amd756_adapter.name, I2C_NAME_SIZE,
-		"SMBus AMD75x adapter at %04x", amd756_ioport);
+		"SMBus AMD756 adapter at %04x", amd756_ioport);
 
 	error = i2c_add_adapter(&amd756_adapter);
 	if (error) {
@@ -391,7 +394,7 @@
 }
 
 static struct pci_driver amd756_driver = {
-	.name		= "amd75x smbus",
+	.name		= "amd756 smbus",
 	.id_table	= amd756_ids,
 	.probe		= amd756_probe,
 	.remove		= __devexit_p(amd756_remove),
@@ -408,7 +411,7 @@
 }
 
 MODULE_AUTHOR("Merlin Hughes <merlin@merlin.org>");
-MODULE_DESCRIPTION("AMD756/766/768/nVidia nForce SMBus driver");
+MODULE_DESCRIPTION("AMD756/766/768/8111 and nVidia nForce SMBus driver");
 MODULE_LICENSE("GPL");
 
 module_init(amd756_init)
diff -Nru a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
--- a/drivers/i2c/busses/i2c-amd8111.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-amd8111.c	Thu Jan  8 23:00:24 2004
@@ -192,7 +192,7 @@
 
 		case I2C_SMBUS_BYTE:
 			if (read_write == I2C_SMBUS_WRITE)
-				amd_ec_write(smbus, AMD_SMB_DATA, data->byte);
+				amd_ec_write(smbus, AMD_SMB_CMD, command);
 			protocol |= AMD_SMB_PRTCL_BYTE;
 			break;
 
diff -Nru a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c
--- a/drivers/i2c/busses/i2c-ibm_iic.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-ibm_iic.c	Thu Jan  8 23:00:24 2004
@@ -48,10 +48,6 @@
 MODULE_DESCRIPTION("IBM IIC driver v" DRIVER_VERSION);
 MODULE_LICENSE("GPL");
 
-static int iic_scan = 0;
-MODULE_PARM(iic_scan, "i");
-MODULE_PARM_DESC(iic_scan, "Scan for active chips on the bus");
-
 static int iic_force_poll = 0;
 MODULE_PARM(iic_force_poll, "i");
 MODULE_PARM_DESC(iic_force_poll, "Force polling mode");
@@ -518,32 +514,6 @@
 };
 
 /*
- * Scan bus for valid 7-bit addresses (ie things that ACK on 1 byte read)
- * We only scan range [0x08 - 0x77], all other addresses are reserved anyway
- */
-static void __devinit iic_scan_bus(struct ibm_iic_private* dev)
-{
-	int found = 0;
-	char dummy;
-	struct i2c_msg msg = {
-		.buf   = &dummy,
-		.len   = sizeof(dummy),
-		.flags = I2C_M_RD
-	};
-	
-	printk(KERN_INFO "ibm-iic%d: scanning bus...\n" KERN_INFO, dev->idx);
-	
-	for (msg.addr = 8; msg.addr < 0x78; ++msg.addr)
-		if (iic_xfer(&dev->adap, &msg, 1) == 1){
-			++found;
-			printk(" 0x%02x", msg.addr);
-		}
-
-	printk("%sibm-iic%d: %d device(s) detected\n", 
-		found ? "\n" KERN_INFO : "", dev->idx, found);
-}
-
-/*
  * Calculates IICx_CLCKDIV value for a specific OPB clock frequency
  */
 static inline u8 iic_clckdiv(unsigned int opb)
@@ -648,10 +618,6 @@
 	
 	printk(KERN_INFO "ibm-iic%d: using %s mode\n", dev->idx,
 		dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
-
-	/* Scan bus if requested by user */
-	if (iic_scan)
-		iic_scan_bus(dev);
 
 	return 0;
 
diff -Nru a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
--- a/drivers/i2c/busses/i2c-piix4.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/busses/i2c-piix4.c	Thu Jan  8 23:00:23 2004
@@ -22,7 +22,7 @@
 /*
    Supports:
 	Intel PIIX4, 440MX
-	Serverworks OSB4, CSB5
+	Serverworks OSB4, CSB5, CSB6
 	SMSC Victory66
 
    Note: we assume there can only be one device, with one SMBus interface.
@@ -99,6 +99,13 @@
 		 "Forcibly enable the PIIX4 at the given address. "
 		 "EXTREMELY DANGEROUS!");
 
+/* If fix_hstcfg is set to anything different from 0, we reset one of the
+   registers to be a valid value. */
+static int fix_hstcfg = 0;
+MODULE_PARM(fix_hstcfg, "i");
+MODULE_PARM_DESC(fix_hstcfg,
+		"Fix config register. Needed on some boards (Force CPCI735).");
+
 static int piix4_transaction(void);
 
 
@@ -164,9 +171,17 @@
 	/* Some BIOS will set up the chipset incorrectly and leave a register
 	   in an undefined state (causing I2C to act very strangely). */
 	if (temp & 0x02) {
-		dev_info(&PIIX4_dev->dev, "Worked around buggy BIOS (I2C)\n");
-		temp = temp & 0xfd;
-		pci_write_config_byte(PIIX4_dev, SMBHSTCFG, temp);
+		if (fix_hstcfg) {
+			dev_info(&PIIX4_dev->dev, "Working around buggy BIOS "
+					"(I2C)\n");
+			temp &= 0xfd;
+			pci_write_config_byte(PIIX4_dev, SMBHSTCFG, temp);
+		} else {
+			dev_info(&PIIX4_dev->dev, "Unusual config register "
+					"value\n");
+			dev_info(&PIIX4_dev->dev, "Try using fix_hstcfg=1 if "
+					"you experience problems\n");
+		}
 	}
  
 	/* If force_addr is set, we program the new address here. Just to make
@@ -418,6 +433,13 @@
 	{
 		.vendor =	PCI_VENDOR_ID_SERVERWORKS,
 		.device =	PCI_DEVICE_ID_SERVERWORKS_CSB5,
+		.subvendor =	PCI_ANY_ID,
+		.subdevice =	PCI_ANY_ID,
+		.driver_data =	0,
+	},
+	{
+		.vendor =	PCI_VENDOR_ID_SERVERWORKS,
+		.device =	PCI_DEVICE_ID_SERVERWORKS_CSB6,
 		.subvendor =	PCI_ANY_ID,
 		.subdevice =	PCI_ANY_ID,
 		.driver_data =	0,
diff -Nru a/drivers/i2c/busses/i2c-savage4.c b/drivers/i2c/busses/i2c-savage4.c
--- a/drivers/i2c/busses/i2c-savage4.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-savage4.c	Thu Jan  8 23:00:24 2004
@@ -1,13 +1,11 @@
 /*
     i2c-savage4.c - Part of lm_sensors, Linux kernel modules for hardware
               monitoring
-    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>,
-    Philip Edelbrock <phil@netroedge.com>,
-    Ralph Metzler <rjkm@thp.uni-koeln.de>, and
+    Copyright (C) 1998-2003  The LM Sensors Team
+    Alexander Wold <awold@bigfoot.com>
     Mark D. Studebaker <mdsxyz123@yahoo.com>
     
-    Based on code written by Ralph Metzler <rjkm@thp.uni-koeln.de> and
-    Simon Vogl
+    Based on i2c-voodoo3.c.
 
     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
@@ -195,9 +193,7 @@
 	pci_unregister_driver(&savage4_driver);
 }
 
-MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
-		"Philip Edelbrock <phil@netroedge.com>, "
-		"Ralph Metzler <rjkm@thp.uni-koeln.de>, "
+MODULE_AUTHOR("Alexander Wold <awold@bigfoot.com> "
 		"and Mark D. Studebaker <mdsxyz123@yahoo.com>");
 MODULE_DESCRIPTION("Savage4 I2C/SMBus driver");
 MODULE_LICENSE("GPL");
diff -Nru a/drivers/i2c/busses/i2c-velleman.c b/drivers/i2c/busses/i2c-velleman.c
--- a/drivers/i2c/busses/i2c-velleman.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-velleman.c	Thu Jan  8 23:00:24 2004
@@ -1,5 +1,5 @@
 /* ------------------------------------------------------------------------- */
-/* i2c-velleman.c i2c-hw access for Velleman K9000 adapters		     */
+/* i2c-velleman.c i2c-hw access for Velleman K8000 adapters		     */
 /* ------------------------------------------------------------------------- */
 /*   Copyright (C) 1995-96, 2000 Simon G. Vogl
 
diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
--- a/drivers/i2c/busses/i2c-viapro.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/busses/i2c-viapro.c	Thu Jan  8 23:00:24 2004
@@ -29,6 +29,7 @@
 	8233
 	8233A (0x3147 and 0x3177)
 	8235
+	8237
    Note: we assume there can only be one device, with one SMBus interface.
 */
 
@@ -430,6 +431,13 @@
 	{
 		.vendor		= PCI_VENDOR_ID_VIA,
 		.device 	= PCI_DEVICE_ID_VIA_8235,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA3
+	},
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device 	= PCI_DEVICE_ID_VIA_8237,
 		.subvendor	= PCI_ANY_ID,
 		.subdevice	= PCI_ANY_ID,
 		.driver_data	= SMBBA3
diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
--- a/drivers/i2c/chips/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/chips/Kconfig	Thu Jan  8 23:00:24 2004
@@ -68,6 +68,17 @@
 	  This driver can also be built as a module.  If so, the module
 	  will be called lm78.
 
+config SENSORS_LM83
+	tristate "National Semiconductor LM83"
+	depends on I2C && EXPERIMENTAL
+	select I2C_SENSOR
+	help
+	  If you say yes here you get support for National Semiconductor
+	  LM83 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm83.
+
 config SENSORS_LM85
 	tristate "National Semiconductor LM85 and compatibles"
 	depends on I2C && EXPERIMENTAL
diff -Nru a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
--- a/drivers/i2c/chips/Makefile	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/chips/Makefile	Thu Jan  8 23:00:23 2004
@@ -10,5 +10,6 @@
 obj-$(CONFIG_SENSORS_IT87)	+= it87.o
 obj-$(CONFIG_SENSORS_LM75)	+= lm75.o
 obj-$(CONFIG_SENSORS_LM78)	+= lm78.o
+obj-$(CONFIG_SENSORS_LM83)	+= lm83.o
 obj-$(CONFIG_SENSORS_LM85)	+= lm85.o
 obj-$(CONFIG_SENSORS_VIA686A)	+= via686a.o
diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
--- a/drivers/i2c/chips/it87.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/chips/it87.c	Thu Jan  8 23:00:24 2004
@@ -343,7 +343,6 @@
 	it87_update_client(client);
 	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])*100 );
 }
-/* more like overshoot temperature */
 static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
 {
 	struct i2c_client *client = to_i2c_client(dev);
@@ -351,7 +350,6 @@
 	it87_update_client(client);
 	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr])*100);
 }
-/* more like hysteresis temperature */
 static ssize_t show_temp_min(struct device *dev, char *buf, int nr)
 {
 	struct i2c_client *client = to_i2c_client(dev);
@@ -414,7 +412,6 @@
 show_temp_offset(2);
 show_temp_offset(3);
 
-/* more like overshoot temperature */
 static ssize_t show_sensor(struct device *dev, char *buf, int nr)
 {
 	struct i2c_client *client = to_i2c_client(dev);
@@ -563,15 +560,15 @@
 show_fan_offset(2);
 show_fan_offset(3);
 
-/* Alarm */
-static ssize_t show_alarm(struct device *dev, char *buf)
+/* Alarms */
+static ssize_t show_alarms(struct device *dev, char *buf)
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct it87_data *data = i2c_get_clientdata(client);
 	it87_update_client(client);
 	return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
 }
-static DEVICE_ATTR(alarm, S_IRUGO | S_IWUSR, show_alarm, NULL);
+static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
 
 /* This function is called when:
      * it87_driver is inserted (when this module is loaded), for each
@@ -751,7 +748,7 @@
 	device_create_file(&new_client->dev, &dev_attr_fan_div1);
 	device_create_file(&new_client->dev, &dev_attr_fan_div2);
 	device_create_file(&new_client->dev, &dev_attr_fan_div3);
-	device_create_file(&new_client->dev, &dev_attr_alarm);
+	device_create_file(&new_client->dev, &dev_attr_alarms);
 
 	return 0;
 
diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c
--- a/drivers/i2c/chips/lm75.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/chips/lm75.c	Thu Jan  8 23:00:23 2004
@@ -25,6 +25,7 @@
 #include <linux/slab.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include "lm75.h"
 
 
 /* Addresses to scan */
@@ -44,17 +45,6 @@
 #define LM75_REG_TEMP_HYST	0x02
 #define LM75_REG_TEMP_OS	0x03
 
-/* Conversions. Rounding and limit checking is only done on the TO_REG
-   variants. Note that you should be a bit careful with which arguments
-   these macros are called: arguments may be evaluated more than once.
-   Fixing this is just not worth it. */
-#define TEMP_FROM_REG(val)	((((val & 0x7fff) >> 7) * 5) | ((val & 0x8000)?-256:0))
-#define TEMP_TO_REG(val)	(SENSORS_LIMIT((val<0?(0x200+((val)/5))<<7:(((val) + 2) / 5) << 7),0,0xffff))
-
-/* Initial values */
-#define LM75_INIT_TEMP_OS	600
-#define LM75_INIT_TEMP_HYST	500
-
 /* Each client has this additional data */
 struct lm75_data {
 	struct semaphore	update_lock;
@@ -87,15 +77,12 @@
 static int lm75_id = 0;
 
 #define show(value)	\
-static ssize_t show_##value(struct device *dev, char *buf)	\
-{								\
-	struct i2c_client *client = to_i2c_client(dev);		\
-	struct lm75_data *data = i2c_get_clientdata(client);	\
-	int temp;						\
-								\
-	lm75_update_client(client);				\
-	temp = TEMP_FROM_REG(data->value);			\
-	return sprintf(buf, "%d\n", temp * 100);		\
+static ssize_t show_##value(struct device *dev, char *buf)		\
+{									\
+	struct i2c_client *client = to_i2c_client(dev);			\
+	struct lm75_data *data = i2c_get_clientdata(client);		\
+	lm75_update_client(client);					\
+	return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->value));	\
 }
 show(temp_max);
 show(temp_hyst);
@@ -106,9 +93,8 @@
 {								\
 	struct i2c_client *client = to_i2c_client(dev);		\
 	struct lm75_data *data = i2c_get_clientdata(client);	\
-	int temp = simple_strtoul(buf, NULL, 10) / 100;		\
-								\
-	data->value = TEMP_TO_REG(temp);			\
+	int temp = simple_strtoul(buf, NULL, 10);		\
+	data->value = LM75_TEMP_TO_REG(temp);			\
 	lm75_write_value(client, reg, data->value);		\
 	return count;						\
 }
@@ -116,7 +102,7 @@
 set(temp_hyst, LM75_REG_TEMP_HYST);
 
 static DEVICE_ATTR(temp_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max);
-static DEVICE_ATTR(temp_min, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
+static DEVICE_ATTR(temp_hyst, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst);
 static DEVICE_ATTR(temp_input, S_IRUGO, show_temp_input, NULL);
 
 static int lm75_attach_adapter(struct i2c_adapter *adapter)
@@ -209,7 +195,7 @@
 	
 	/* Register sysfs hooks */
 	device_create_file(&new_client->dev, &dev_attr_temp_max);
-	device_create_file(&new_client->dev, &dev_attr_temp_min);
+	device_create_file(&new_client->dev, &dev_attr_temp_hyst);
 	device_create_file(&new_client->dev, &dev_attr_temp_input);
 
 	return 0;
@@ -258,10 +244,6 @@
 static void lm75_init_client(struct i2c_client *client)
 {
 	/* Initialize the LM75 chip */
-	lm75_write_value(client, LM75_REG_TEMP_OS,
-			 TEMP_TO_REG(LM75_INIT_TEMP_OS));
-	lm75_write_value(client, LM75_REG_TEMP_HYST,
-			 TEMP_TO_REG(LM75_INIT_TEMP_HYST));
 	lm75_write_value(client, LM75_REG_CONF, 0);
 }
 
diff -Nru a/drivers/i2c/chips/lm75.h b/drivers/i2c/chips/lm75.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/chips/lm75.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,49 @@
+/*
+    lm75.h - Part of lm_sensors, Linux kernel modules for hardware
+             monitoring
+    Copyright (c) 2003 Mark M. Hoffman <mhoffman@lightlink.com>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+    This file contains common code for encoding/decoding LM75 type
+    temperature readings, which are emulated by many of the chips
+    we support.  As the user is unlikely to load more than one driver
+    which contains this code, we don't worry about the wasted space.
+*/
+
+#include <linux/i2c-sensor.h>
+
+/* straight from the datasheet */
+#define LM75_TEMP_MIN (-55000)
+#define LM75_TEMP_MAX 125000
+
+/* TEMP: 0.001C/bit (-55C to +125C)
+   REG: (0.5C/bit, two's complement) << 7 */
+static inline u16 LM75_TEMP_TO_REG(int temp)
+{
+	int ntemp = SENSORS_LIMIT(temp, LM75_TEMP_MIN, LM75_TEMP_MAX);
+	ntemp += (ntemp<0 ? -250 : 250);
+	return (u16)((ntemp / 500) << 7);
+}
+
+static inline int LM75_TEMP_FROM_REG(u16 reg)
+{
+	/* use integer division instead of equivalent right shift to
+	   guarantee arithmetic shift and preserve the sign */
+	return ((s16)reg / 128) * 500;
+}
+
diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c
--- a/drivers/i2c/chips/lm78.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/chips/lm78.c	Thu Jan  8 23:00:24 2004
@@ -367,7 +367,7 @@
 static DEVICE_ATTR(temp_input, S_IRUGO, show_temp, NULL)
 static DEVICE_ATTR(temp_max, S_IRUGO | S_IWUSR,
 		show_temp_over, set_temp_over)
-static DEVICE_ATTR(temp_min, S_IRUGO | S_IWUSR,
+static DEVICE_ATTR(temp_hyst, S_IRUGO | S_IWUSR,
 		show_temp_hyst, set_temp_hyst)
 
 /* 3 Fans */
@@ -674,8 +674,8 @@
 	device_create_file(&new_client->dev, &dev_attr_in_min6);
 	device_create_file(&new_client->dev, &dev_attr_in_max6);
 	device_create_file(&new_client->dev, &dev_attr_temp_input);
-	device_create_file(&new_client->dev, &dev_attr_temp_min);
 	device_create_file(&new_client->dev, &dev_attr_temp_max);
+	device_create_file(&new_client->dev, &dev_attr_temp_hyst);
 	device_create_file(&new_client->dev, &dev_attr_fan_input1);
 	device_create_file(&new_client->dev, &dev_attr_fan_min1);
 	device_create_file(&new_client->dev, &dev_attr_fan_div1);
diff -Nru a/drivers/i2c/chips/lm83.c b/drivers/i2c/chips/lm83.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/chips/lm83.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,400 @@
+/*
+ * lm83.c - Part of lm_sensors, Linux kernel modules for hardware
+ *          monitoring
+ * Copyright (C) 2003  Jean Delvare <khali@linux-fr.org>
+ *
+ * Heavily inspired from the lm78, lm75 and adm1021 drivers. The LM83 is
+ * a sensor chip made by National Semiconductor. It reports up to four
+ * temperatures (its own plus up to three external ones) with a 1 deg
+ * resolution and a 3-4 deg accuracy. Complete datasheet can be obtained
+ * from National's website at:
+ *   http://www.national.com/pf/LM/LM83.html
+ * Since the datasheet omits to give the chip stepping code, I give it
+ * here: 0x03 (at register 0xff).
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/i2c-sensor.h>
+
+/*
+ * Addresses to scan
+ * Address is selected using 2 three-level pins, resulting in 9 possible
+ * addresses.
+ */
+
+static unsigned short normal_i2c[] = { I2C_CLIENT_END };
+static unsigned short normal_i2c_range[] = { 0x18, 0x1a, 0x29, 0x2b,
+	0x4c, 0x4e, I2C_CLIENT_END };
+static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
+static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
+
+/*
+ * Insmod parameters
+ */
+
+SENSORS_INSMOD_1(lm83);
+
+/*
+ * The LM83 registers
+ * Manufacturer ID is 0x01 for National Semiconductor.
+ */
+
+#define LM83_REG_R_MAN_ID		0xFE
+#define LM83_REG_R_CHIP_ID		0xFF
+#define LM83_REG_R_CONFIG		0x03
+#define LM83_REG_W_CONFIG		0x09
+#define LM83_REG_R_STATUS1		0x02
+#define LM83_REG_R_STATUS2		0x35
+#define LM83_REG_R_LOCAL_TEMP		0x00
+#define LM83_REG_R_LOCAL_HIGH		0x05
+#define LM83_REG_W_LOCAL_HIGH		0x0B
+#define LM83_REG_R_REMOTE1_TEMP		0x30
+#define LM83_REG_R_REMOTE1_HIGH		0x38
+#define LM83_REG_W_REMOTE1_HIGH		0x50
+#define LM83_REG_R_REMOTE2_TEMP		0x01
+#define LM83_REG_R_REMOTE2_HIGH		0x07
+#define LM83_REG_W_REMOTE2_HIGH		0x0D
+#define LM83_REG_R_REMOTE3_TEMP		0x31
+#define LM83_REG_R_REMOTE3_HIGH		0x3A
+#define LM83_REG_W_REMOTE3_HIGH		0x52
+#define LM83_REG_R_TCRIT		0x42
+#define LM83_REG_W_TCRIT		0x5A
+
+/*
+ * Conversions and various macros
+ * The LM83 uses signed 8-bit values.
+ */
+
+#define TEMP_FROM_REG(val)	((val > 127 ? val-256 : val) * 1000)
+#define TEMP_TO_REG(val)	((val < 0 ? val+256 : val) / 1000)
+
+static const u8 LM83_REG_R_TEMP[] = {
+	LM83_REG_R_LOCAL_TEMP,
+	LM83_REG_R_REMOTE1_TEMP,
+	LM83_REG_R_REMOTE2_TEMP,
+	LM83_REG_R_REMOTE3_TEMP
+};
+
+static const u8 LM83_REG_R_HIGH[] = {
+	LM83_REG_R_LOCAL_HIGH,
+	LM83_REG_R_REMOTE1_HIGH,
+	LM83_REG_R_REMOTE2_HIGH,
+	LM83_REG_R_REMOTE3_HIGH
+};
+
+static const u8 LM83_REG_W_HIGH[] = {
+	LM83_REG_W_LOCAL_HIGH,
+	LM83_REG_W_REMOTE1_HIGH,
+	LM83_REG_W_REMOTE2_HIGH,
+	LM83_REG_W_REMOTE3_HIGH
+};
+
+/*
+ * Functions declaration
+ */
+
+static int lm83_attach_adapter(struct i2c_adapter *adapter);
+static int lm83_detect(struct i2c_adapter *adapter, int address, int kind);
+static int lm83_detach_client(struct i2c_client *client);
+static void lm83_update_client(struct i2c_client *client);
+
+/*
+ * Driver data (common to all clients)
+ */
+ 
+static struct i2c_driver lm83_driver = {
+	.owner		= THIS_MODULE,
+	.name		= "lm83",
+	.id		= I2C_DRIVERID_LM83,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= lm83_attach_adapter,
+	.detach_client	= lm83_detach_client,
+};
+
+/*
+ * Client data (each client gets its own)
+ */
+
+struct lm83_data {
+	struct semaphore update_lock;
+	char valid; /* zero until following fields are valid */
+	unsigned long last_updated; /* in jiffies */
+
+	/* registers values */
+	u8 temp_input[4];
+	u8 temp_high[4];
+	u8 temp_crit;
+	u16 alarms; /* bitvector, combined */
+};
+
+/*
+ * Internal variables
+ */
+
+static int lm83_id = 0;
+
+/*
+ * Sysfs stuff
+ */
+
+#define show_temp(suffix, value) \
+static ssize_t show_temp_##suffix(struct device *dev, char *buf) \
+{ \
+	struct i2c_client *client = to_i2c_client(dev); \
+	struct lm83_data *data = i2c_get_clientdata(client); \
+	lm83_update_client(client); \
+	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
+}
+show_temp(input1, temp_input[0]);
+show_temp(input2, temp_input[1]);
+show_temp(input3, temp_input[2]);
+show_temp(input4, temp_input[3]);
+show_temp(high1, temp_high[0]);
+show_temp(high2, temp_high[1]);
+show_temp(high3, temp_high[2]);
+show_temp(high4, temp_high[3]);
+show_temp(crit, temp_crit);
+
+#define set_temp(suffix, value, reg) \
+static ssize_t set_temp_##suffix(struct device *dev, const char *buf, \
+	size_t count) \
+{ \
+	struct i2c_client *client = to_i2c_client(dev); \
+	struct lm83_data *data = i2c_get_clientdata(client); \
+	data->value = TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); \
+	i2c_smbus_write_byte_data(client, reg, data->value); \
+	return count; \
+}
+set_temp(high1, temp_high[0], LM83_REG_W_LOCAL_HIGH);
+set_temp(high2, temp_high[1], LM83_REG_W_REMOTE1_HIGH);
+set_temp(high3, temp_high[2], LM83_REG_W_REMOTE2_HIGH);
+set_temp(high4, temp_high[3], LM83_REG_W_REMOTE3_HIGH);
+set_temp(crit, temp_crit, LM83_REG_W_TCRIT);
+
+static ssize_t show_alarms(struct device *dev, char *buf)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct lm83_data *data = i2c_get_clientdata(client);
+	lm83_update_client(client);
+	return sprintf(buf, "%d\n", data->alarms);
+}
+
+static DEVICE_ATTR(temp_input1, S_IRUGO, show_temp_input1, NULL);
+static DEVICE_ATTR(temp_input2, S_IRUGO, show_temp_input2, NULL);
+static DEVICE_ATTR(temp_input3, S_IRUGO, show_temp_input3, NULL);
+static DEVICE_ATTR(temp_input4, S_IRUGO, show_temp_input4, NULL);
+static DEVICE_ATTR(temp_max1, S_IWUSR | S_IRUGO, show_temp_high1,
+    set_temp_high1);
+static DEVICE_ATTR(temp_max2, S_IWUSR | S_IRUGO, show_temp_high2,
+    set_temp_high2);
+static DEVICE_ATTR(temp_max3, S_IWUSR | S_IRUGO, show_temp_high3,
+    set_temp_high3);
+static DEVICE_ATTR(temp_max4, S_IWUSR | S_IRUGO, show_temp_high4,
+    set_temp_high4);
+static DEVICE_ATTR(temp_crit, S_IWUSR | S_IRUGO, show_temp_crit,
+    set_temp_crit);
+static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
+
+/*
+ * Real code
+ */
+
+static int lm83_attach_adapter(struct i2c_adapter *adapter)
+{
+	if (!(adapter->class & I2C_ADAP_CLASS_SMBUS))
+		return 0;
+	return i2c_detect(adapter, &addr_data, lm83_detect);
+}
+
+/*
+ * The following function does more than just detection. If detection
+ * succeeds, it also registers the new chip.
+ */
+static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+	struct i2c_client *new_client;
+	struct lm83_data *data;
+	int err = 0;
+	const char *name = "";
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+		goto exit;
+
+	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
+	    sizeof(struct lm83_data), GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto exit;
+	}
+	memset(new_client, 0x00, sizeof(struct i2c_client) +
+	    sizeof(struct lm83_data));
+
+	/* The LM83-specific data is placed right after the common I2C
+	 * client data. */
+	data = (struct lm83_data *) (new_client + 1);
+	i2c_set_clientdata(new_client, data);
+	new_client->addr = address;
+	new_client->adapter = adapter;
+	new_client->driver = &lm83_driver;
+	new_client->flags = 0;
+
+	/* Now we do the detection and identification. A negative kind
+	 * means that the driver was loaded with no force parameter
+	 * (default), so we must both detect and identify the chip
+	 * (actually there is only one possible kind of chip for now, LM83).
+	 * A zero kind means that the driver was loaded with the force
+	 * parameter, the detection step shall be skipped. A positive kind
+	 * means that the driver was loaded with the force parameter and a
+	 * given kind of chip is requested, so both the detection and the
+	 * identification steps are skipped. */
+	if (kind < 0) { /* detection */
+		if (((i2c_smbus_read_byte_data(new_client, LM83_REG_R_STATUS1)
+		    & 0xA8) != 0x00) ||
+		    ((i2c_smbus_read_byte_data(new_client, LM83_REG_R_STATUS2)
+		    & 0x48) != 0x00) ||
+		    ((i2c_smbus_read_byte_data(new_client, LM83_REG_R_CONFIG)
+		    & 0x41) != 0x00)) {
+			dev_dbg(&client->dev,
+			    "LM83 detection failed at 0x%02x.\n", address);
+			goto exit_free;
+		}
+	}
+
+	if (kind <= 0) { /* identification */
+		u8 man_id, chip_id;
+
+		man_id = i2c_smbus_read_byte_data(new_client,
+		    LM83_REG_R_MAN_ID);
+		chip_id = i2c_smbus_read_byte_data(new_client,
+		    LM83_REG_R_CHIP_ID);
+
+		if (man_id == 0x01) { /* National Semiconductor */
+			if (chip_id == 0x03) {
+				kind = lm83;
+				name = "lm83";
+			}
+		}
+
+		if (kind <= 0) { /* identification failed */
+			dev_info(&adapter->dev,
+			    "Unsupported chip (man_id=0x%02X, "
+			    "chip_id=0x%02X).\n", man_id, chip_id);
+			goto exit_free;
+		}
+	}
+
+	/* We can fill in the remaining client fields */
+	strlcpy(new_client->name, name, I2C_NAME_SIZE);
+	new_client->id = lm83_id++;
+	data->valid = 0;
+	init_MUTEX(&data->update_lock);
+
+	/* Tell the I2C layer a new client has arrived */
+	if ((err = i2c_attach_client(new_client)))
+		goto exit_free;
+
+	/*
+	 * Initialize the LM83 chip
+	 * (Nothing to do for this one.)
+	 */
+
+	/* Register sysfs hooks */
+	device_create_file(&new_client->dev, &dev_attr_temp_input1);
+	device_create_file(&new_client->dev, &dev_attr_temp_input2);
+	device_create_file(&new_client->dev, &dev_attr_temp_input3);
+	device_create_file(&new_client->dev, &dev_attr_temp_input4);
+	device_create_file(&new_client->dev, &dev_attr_temp_max1);
+	device_create_file(&new_client->dev, &dev_attr_temp_max2);
+	device_create_file(&new_client->dev, &dev_attr_temp_max3);
+	device_create_file(&new_client->dev, &dev_attr_temp_max4);
+	device_create_file(&new_client->dev, &dev_attr_temp_crit);
+	device_create_file(&new_client->dev, &dev_attr_alarms);
+
+	return 0;
+
+exit_free:
+	kfree(new_client);
+exit:
+	return err;
+}
+
+static int lm83_detach_client(struct i2c_client *client)
+{
+	int err;
+
+	if ((err = i2c_detach_client(client))) {
+		dev_err(&client->dev,
+		    "Client deregistration failed, client not detached.\n");
+		return err;
+	}
+
+	kfree(client);
+	return 0;
+}
+
+static void lm83_update_client(struct i2c_client *client)
+{
+	struct lm83_data *data = i2c_get_clientdata(client);
+
+	down(&data->update_lock);
+
+	if ((jiffies - data->last_updated > HZ * 2) ||
+	    (jiffies < data->last_updated) ||
+	    !data->valid) {
+		int nr;
+
+		dev_dbg(&client->dev, "Updating lm83 data.\n");
+		for (nr = 0; nr < 4 ; nr++) {
+			data->temp_input[nr] =
+			    i2c_smbus_read_byte_data(client,
+			    LM83_REG_R_TEMP[nr]);
+			data->temp_high[nr] =
+			    i2c_smbus_read_byte_data(client,
+			    LM83_REG_R_HIGH[nr]);
+		}
+		data->temp_crit =
+		    i2c_smbus_read_byte_data(client, LM83_REG_R_TCRIT);
+		data->alarms =
+		    i2c_smbus_read_byte_data(client, LM83_REG_R_STATUS1)
+		    + (i2c_smbus_read_byte_data(client, LM83_REG_R_STATUS2)
+		    << 8);
+
+		data->last_updated = jiffies;
+		data->valid = 1;
+	}
+
+	up(&data->update_lock);
+}
+
+static int __init sensors_lm83_init(void)
+{
+	return i2c_add_driver(&lm83_driver);
+}
+
+static void __exit sensors_lm83_exit(void)
+{
+	i2c_del_driver(&lm83_driver);
+}
+
+MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
+MODULE_DESCRIPTION("LM83 driver");
+MODULE_LICENSE("GPL");
+
+module_init(sensors_lm83_init);
+module_exit(sensors_lm83_exit);
diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
--- a/drivers/i2c/chips/via686a.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/chips/via686a.c	Thu Jan  8 23:00:23 2004
@@ -496,21 +496,19 @@
 	via686a_update_client(client);
 	return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr])*100 );
 }
-/* more like overshoot temperature */
-static ssize_t show_temp_max(struct device *dev, char *buf, int nr) {
+static ssize_t show_temp_over(struct device *dev, char *buf, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
 	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr])*100);
 }
-/* more like hysteresis temperature */
-static ssize_t show_temp_min(struct device *dev, char *buf, int nr) {
+static ssize_t show_temp_hyst(struct device *dev, char *buf, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
 	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr])*100);
 }
-static ssize_t set_temp_max(struct device *dev, const char *buf, 
+static ssize_t set_temp_over(struct device *dev, const char *buf, 
 		size_t count, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
@@ -519,7 +517,7 @@
 	via686a_write_value(client, VIA686A_REG_TEMP_OVER(nr), data->temp_over[nr]);
 	return count;
 }
-static ssize_t set_temp_min(struct device *dev, const char *buf, 
+static ssize_t set_temp_hyst(struct device *dev, const char *buf, 
 		size_t count, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
@@ -534,30 +532,30 @@
 	return show_temp(dev, buf, 0x##offset - 1);			\
 }									\
 static ssize_t								\
-show_temp_##offset##_max (struct device *dev, char *buf)		\
+show_temp_##offset##_over (struct device *dev, char *buf)		\
 {									\
-	return show_temp_max(dev, buf, 0x##offset - 1);			\
+	return show_temp_over(dev, buf, 0x##offset - 1);			\
 }									\
 static ssize_t								\
-show_temp_##offset##_min (struct device *dev, char *buf)		\
+show_temp_##offset##_hyst (struct device *dev, char *buf)		\
 {									\
-	return show_temp_min(dev, buf, 0x##offset - 1);			\
+	return show_temp_hyst(dev, buf, 0x##offset - 1);			\
 }									\
-static ssize_t set_temp_##offset##_max (struct device *dev, 		\
+static ssize_t set_temp_##offset##_over (struct device *dev, 		\
 		const char *buf, size_t count) 				\
 {									\
-	return set_temp_max(dev, buf, count, 0x##offset - 1);		\
+	return set_temp_over(dev, buf, count, 0x##offset - 1);		\
 }									\
-static ssize_t set_temp_##offset##_min (struct device *dev, 		\
+static ssize_t set_temp_##offset##_hyst (struct device *dev, 		\
 		const char *buf, size_t count) 				\
 {									\
-	return set_temp_min(dev, buf, count, 0x##offset - 1);		\
+	return set_temp_hyst(dev, buf, count, 0x##offset - 1);		\
 }									\
 static DEVICE_ATTR(temp_input##offset, S_IRUGO, show_temp_##offset, NULL) \
 static DEVICE_ATTR(temp_max##offset, S_IRUGO | S_IWUSR, 		\
-		show_temp_##offset##_max, set_temp_##offset##_max) 	\
-static DEVICE_ATTR(temp_min##offset, S_IRUGO | S_IWUSR, 		\
-		show_temp_##offset##_min, set_temp_##offset##_min)	
+		show_temp_##offset##_over, set_temp_##offset##_over) 	\
+static DEVICE_ATTR(temp_hyst##offset, S_IRUGO | S_IWUSR, 		\
+		show_temp_##offset##_hyst, set_temp_##offset##_hyst)	
 
 show_temp_offset(1);
 show_temp_offset(2);
@@ -637,14 +635,14 @@
 show_fan_offset(1);
 show_fan_offset(2);
 
-/* Alarm */
-static ssize_t show_alarm(struct device *dev, char *buf) {
+/* Alarms */
+static ssize_t show_alarms(struct device *dev, char *buf) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
 	return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms));
 }
-static DEVICE_ATTR(alarm, S_IRUGO | S_IWUSR, show_alarm, NULL);
+static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL);
 
 /* The driver. I choose to use type i2c_driver, as at is identical to both
    smbus_driver and isa_driver, and clients could be of either kind */
@@ -760,16 +758,16 @@
 	device_create_file(&new_client->dev, &dev_attr_temp_max1);
 	device_create_file(&new_client->dev, &dev_attr_temp_max2);
 	device_create_file(&new_client->dev, &dev_attr_temp_max3);
-	device_create_file(&new_client->dev, &dev_attr_temp_min1);
-	device_create_file(&new_client->dev, &dev_attr_temp_min2);
-	device_create_file(&new_client->dev, &dev_attr_temp_min3);
+	device_create_file(&new_client->dev, &dev_attr_temp_hyst1);
+	device_create_file(&new_client->dev, &dev_attr_temp_hyst2);
+	device_create_file(&new_client->dev, &dev_attr_temp_hyst3);
 	device_create_file(&new_client->dev, &dev_attr_fan_input1);
 	device_create_file(&new_client->dev, &dev_attr_fan_input2);
 	device_create_file(&new_client->dev, &dev_attr_fan_min1);
 	device_create_file(&new_client->dev, &dev_attr_fan_min2);
 	device_create_file(&new_client->dev, &dev_attr_fan_div1);
 	device_create_file(&new_client->dev, &dev_attr_fan_div2);
-	device_create_file(&new_client->dev, &dev_attr_alarm);
+	device_create_file(&new_client->dev, &dev_attr_alarms);
 
 	return 0;
 
diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/chips/w83781d.c	Thu Jan  8 23:00:23 2004
@@ -24,10 +24,11 @@
     Supports following chips:
 
     Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA
-    as99127f	7	3	1?	3	0x30	0x12c3	yes	no
-    asb100 "bach" (type_name = as99127f)	0x30	0x0694	yes	no
-    w83781d	7	3	0	3	0x10	0x5ca3	yes	yes
-    w83627hf	9	3	2	3	0x20	0x5ca3	yes	yes(LPC)
+    as99127f	7	3	1?	3	0x31	0x12c3	yes	no
+    as99127f rev.2 (type_name = 1299127f)	0x31	0x5ca3	yes	no
+    asb100 "bach" (type_name = as99127f)	0x31	0x0694	yes	no
+    w83781d	7	3	0	3	0x10-1	0x5ca3	yes	yes
+    w83627hf	9	3	2	3	0x21	0x5ca3	yes	yes(LPC)
     w83627thf	9	3	2	3	0x90	0x5ca3	no	yes(LPC)
     w83782d	9	3	2-4	3	0x30	0x5ca3	yes	yes
     w83783s	5-6	3	2	1-2	0x40	0x5ca3	yes	no
@@ -207,72 +208,6 @@
 	return ((u8) i);
 }
 
-/* Initial limits */
-#define W83781D_INIT_IN_0		(vid == 3500 ? 280 : vid / 10)
-#define W83781D_INIT_IN_1		(vid == 3500 ? 280 : vid / 10)
-#define W83781D_INIT_IN_2		330
-#define W83781D_INIT_IN_3		(((500)   * 100) / 168)
-#define W83781D_INIT_IN_4		(((1200)  * 10) / 38)
-#define W83781D_INIT_IN_5		(((-1200) * -604) / 2100)
-#define W83781D_INIT_IN_6		(((-500)  * -604) / 909)
-#define W83781D_INIT_IN_7		(((500)   * 100) / 168)
-#define W83781D_INIT_IN_8		300
-/* Initial limits for 782d/783s negative voltages */
-/* Note level shift. Change min/max below if you change these. */
-#define W83782D_INIT_IN_5		((((-1200) + 1491) * 100)/514)
-#define W83782D_INIT_IN_6		((( (-500)  + 771) * 100)/314)
-
-#define W83781D_INIT_IN_PERCENTAGE	10
-#define W83781D_INIT_IN_MIN(val)	(val - val * W83781D_INIT_IN_PERCENTAGE / 100)
-#define W83781D_INIT_IN_MAX(val)	(val + val * W83781D_INIT_IN_PERCENTAGE / 100)
-
-#define W83781D_INIT_IN_MIN_0		W83781D_INIT_IN_MIN(W83781D_INIT_IN_0)
-#define W83781D_INIT_IN_MAX_0		W83781D_INIT_IN_MAX(W83781D_INIT_IN_0)
-#define W83781D_INIT_IN_MIN_1		W83781D_INIT_IN_MIN(W83781D_INIT_IN_1)
-#define W83781D_INIT_IN_MAX_1		W83781D_INIT_IN_MAX(W83781D_INIT_IN_1)
-#define W83781D_INIT_IN_MIN_2		W83781D_INIT_IN_MIN(W83781D_INIT_IN_2)
-#define W83781D_INIT_IN_MAX_2		W83781D_INIT_IN_MAX(W83781D_INIT_IN_2)
-#define W83781D_INIT_IN_MIN_3		W83781D_INIT_IN_MIN(W83781D_INIT_IN_3)
-#define W83781D_INIT_IN_MAX_3		W83781D_INIT_IN_MAX(W83781D_INIT_IN_3)
-#define W83781D_INIT_IN_MIN_4		W83781D_INIT_IN_MIN(W83781D_INIT_IN_4)
-#define W83781D_INIT_IN_MAX_4		W83781D_INIT_IN_MAX(W83781D_INIT_IN_4)
-#define W83781D_INIT_IN_MIN_5		W83781D_INIT_IN_MIN(W83781D_INIT_IN_5)
-#define W83781D_INIT_IN_MAX_5		W83781D_INIT_IN_MAX(W83781D_INIT_IN_5)
-#define W83781D_INIT_IN_MIN_6		W83781D_INIT_IN_MIN(W83781D_INIT_IN_6)
-#define W83781D_INIT_IN_MAX_6		W83781D_INIT_IN_MAX(W83781D_INIT_IN_6)
-#define W83781D_INIT_IN_MIN_7		W83781D_INIT_IN_MIN(W83781D_INIT_IN_7)
-#define W83781D_INIT_IN_MAX_7		W83781D_INIT_IN_MAX(W83781D_INIT_IN_7)
-#define W83781D_INIT_IN_MIN_8		W83781D_INIT_IN_MIN(W83781D_INIT_IN_8)
-#define W83781D_INIT_IN_MAX_8		W83781D_INIT_IN_MAX(W83781D_INIT_IN_8)
-
-/* Initial limits for 782d/783s negative voltages */
-/* These aren't direct multiples because of level shift */
-/* Beware going negative - check */
-#define W83782D_INIT_IN_MIN_5_TMP \
-	(((-1200 * (100 + W83781D_INIT_IN_PERCENTAGE)) + (1491 * 100))/514)
-#define W83782D_INIT_IN_MIN_5 \
-	((W83782D_INIT_IN_MIN_5_TMP > 0) ? W83782D_INIT_IN_MIN_5_TMP : 0)
-#define W83782D_INIT_IN_MAX_5 \
-	(((-1200 * (100 - W83781D_INIT_IN_PERCENTAGE)) + (1491 * 100))/514)
-#define W83782D_INIT_IN_MIN_6_TMP \
-	((( -500 * (100 + W83781D_INIT_IN_PERCENTAGE)) +  (771 * 100))/314)
-#define W83782D_INIT_IN_MIN_6 \
-	((W83782D_INIT_IN_MIN_6_TMP > 0) ? W83782D_INIT_IN_MIN_6_TMP : 0)
-#define W83782D_INIT_IN_MAX_6 \
-	((( -500 * (100 - W83781D_INIT_IN_PERCENTAGE)) +  (771 * 100))/314)
-
-#define W83781D_INIT_FAN_MIN_1		3000
-#define W83781D_INIT_FAN_MIN_2		3000
-#define W83781D_INIT_FAN_MIN_3		3000
-
-/* temp = value / 100 */
-#define W83781D_INIT_TEMP_OVER		6000
-#define W83781D_INIT_TEMP_HYST		12700	/* must be 127 for ALARM to work */
-#define W83781D_INIT_TEMP2_OVER		6000
-#define W83781D_INIT_TEMP2_HYST		5000
-#define W83781D_INIT_TEMP3_OVER		6000
-#define W83781D_INIT_TEMP3_HYST		5000
-
 /* There are some complications in a module like this. First off, W83781D chips
    may be both present on the SMBus and the ISA bus, and we have to handle
    those cases separately at some places. Second, there might be several
@@ -309,11 +244,11 @@
 	u8 fan[3];		/* Register value */
 	u8 fan_min[3];		/* Register value */
 	u8 temp;
-	u8 temp_min;		/* Register value */
 	u8 temp_max;		/* Register value */
+	u8 temp_hyst;		/* Register value */
 	u16 temp_add[2];	/* Register value */
 	u16 temp_max_add[2];	/* Register value */
-	u16 temp_min_add[2];	/* Register value */
+	u16 temp_hyst_add[2];	/* Register value */
 	u8 fan_div[3];		/* Register encoding, shifted right */
 	u8 vid;			/* Register encoding, combined */
 	u32 alarms;		/* Register encoding, combined */
@@ -510,8 +445,8 @@
 	} \
 }
 show_temp_reg(temp);
-show_temp_reg(temp_min);
 show_temp_reg(temp_max);
+show_temp_reg(temp_hyst);
 
 #define store_temp_reg(REG, reg) \
 static ssize_t store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \
@@ -538,8 +473,8 @@
 	 \
 	return count; \
 }
-store_temp_reg(OVER, min);
-store_temp_reg(HYST, max);
+store_temp_reg(OVER, max);
+store_temp_reg(HYST, hyst);
 
 #define sysfs_temp_offset(offset) \
 static ssize_t \
@@ -562,8 +497,8 @@
 
 #define sysfs_temp_offsets(offset) \
 sysfs_temp_offset(offset); \
-sysfs_temp_reg_offset(min, offset); \
-sysfs_temp_reg_offset(max, offset);
+sysfs_temp_reg_offset(max, offset); \
+sysfs_temp_reg_offset(hyst, offset);
 
 sysfs_temp_offsets(1);
 sysfs_temp_offsets(2);
@@ -573,7 +508,7 @@
 do { \
 device_create_file(&client->dev, &dev_attr_temp_input##offset); \
 device_create_file(&client->dev, &dev_attr_temp_max##offset); \
-device_create_file(&client->dev, &dev_attr_temp_min##offset); \
+device_create_file(&client->dev, &dev_attr_temp_hyst##offset); \
 } while (0)
 
 static ssize_t
@@ -1264,7 +1199,7 @@
 			goto ERROR2;
 		}
 		/* If Winbond SMBus, check address at 0x48.
-		   Asus doesn't support */
+		   Asus doesn't support, except for as99127f rev.2 */
 		if ((!is_isa) && (((!(val1 & 0x80)) && (val2 == 0xa3)) ||
 				  ((val1 & 0x80) && (val2 == 0x5c)))) {
 			if (w83781d_read_value
@@ -1295,18 +1230,17 @@
 			goto ERROR2;
 		}
 
-		/* mask off lower bit, not reliable */
-		val1 =
-		    w83781d_read_value(new_client, W83781D_REG_WCHIPID) & 0xfe;
-		if (val1 == 0x10 && vendid == winbond)
+		val1 = w83781d_read_value(new_client, W83781D_REG_WCHIPID);
+		if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond)
 			kind = w83781d;
 		else if (val1 == 0x30 && vendid == winbond)
 			kind = w83782d;
-		else if (val1 == 0x40 && vendid == winbond && !is_isa)
+		else if (val1 == 0x40 && vendid == winbond && !is_isa
+				&& address == 0x2d)
 			kind = w83783s;
-		else if ((val1 == 0x20 || val1 == 0x90) && vendid == winbond)
+		else if ((val1 == 0x21 || val1 == 0x90) && vendid == winbond)
 			kind = w83627hf;
-		else if (val1 == 0x30 && vendid == asus && !is_isa)
+		else if (val1 == 0x31 && !is_isa && address >= 0x28)
 			kind = as99127f;
 		else if (val1 == 0x60 && vendid == winbond && is_isa)
 			kind = w83697hf;
@@ -1688,113 +1622,6 @@
 #endif				/* W83781D_RT */
 
 	if (init) {
-		w83781d_write_value(client, W83781D_REG_IN_MIN(0),
-				    IN_TO_REG(W83781D_INIT_IN_MIN_0));
-		w83781d_write_value(client, W83781D_REG_IN_MAX(0),
-				    IN_TO_REG(W83781D_INIT_IN_MAX_0));
-		if (type != w83783s && type != w83697hf) {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(1),
-					    IN_TO_REG(W83781D_INIT_IN_MIN_1));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(1),
-					    IN_TO_REG(W83781D_INIT_IN_MAX_1));
-		}
-
-		w83781d_write_value(client, W83781D_REG_IN_MIN(2),
-				    IN_TO_REG(W83781D_INIT_IN_MIN_2));
-		w83781d_write_value(client, W83781D_REG_IN_MAX(2),
-				    IN_TO_REG(W83781D_INIT_IN_MAX_2));
-		w83781d_write_value(client, W83781D_REG_IN_MIN(3),
-				    IN_TO_REG(W83781D_INIT_IN_MIN_3));
-		w83781d_write_value(client, W83781D_REG_IN_MAX(3),
-				    IN_TO_REG(W83781D_INIT_IN_MAX_3));
-		w83781d_write_value(client, W83781D_REG_IN_MIN(4),
-				    IN_TO_REG(W83781D_INIT_IN_MIN_4));
-		w83781d_write_value(client, W83781D_REG_IN_MAX(4),
-				    IN_TO_REG(W83781D_INIT_IN_MAX_4));
-		if (type == w83781d || type == as99127f) {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(5),
-					    IN_TO_REG(W83781D_INIT_IN_MIN_5));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(5),
-					    IN_TO_REG(W83781D_INIT_IN_MAX_5));
-		} else {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(5),
-					    IN_TO_REG(W83782D_INIT_IN_MIN_5));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(5),
-					    IN_TO_REG(W83782D_INIT_IN_MAX_5));
-		}
-		if (type == w83781d || type == as99127f) {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(6),
-					    IN_TO_REG(W83781D_INIT_IN_MIN_6));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(6),
-					    IN_TO_REG(W83781D_INIT_IN_MAX_6));
-		} else {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(6),
-					    IN_TO_REG(W83782D_INIT_IN_MIN_6));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(6),
-					    IN_TO_REG(W83782D_INIT_IN_MAX_6));
-		}
-		if ((type == w83782d) || (type == w83627hf) ||
-		    (type == w83697hf)) {
-			w83781d_write_value(client, W83781D_REG_IN_MIN(7),
-					    IN_TO_REG(W83781D_INIT_IN_MIN_7));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(7),
-					    IN_TO_REG(W83781D_INIT_IN_MAX_7));
-			w83781d_write_value(client, W83781D_REG_IN_MIN(8),
-					    IN_TO_REG(W83781D_INIT_IN_MIN_8));
-			w83781d_write_value(client, W83781D_REG_IN_MAX(8),
-					    IN_TO_REG(W83781D_INIT_IN_MAX_8));
-			w83781d_write_value(client, W83781D_REG_VBAT,
-					    (w83781d_read_value
-					     (client,
-					      W83781D_REG_VBAT) | 0x01));
-		}
-		w83781d_write_value(client, W83781D_REG_FAN_MIN(1),
-				    FAN_TO_REG(W83781D_INIT_FAN_MIN_1, 2));
-		w83781d_write_value(client, W83781D_REG_FAN_MIN(2),
-				    FAN_TO_REG(W83781D_INIT_FAN_MIN_2, 2));
-		if (type != w83697hf) {
-			w83781d_write_value(client, W83781D_REG_FAN_MIN(3),
-					    FAN_TO_REG(W83781D_INIT_FAN_MIN_3,
-						       2));
-		}
-
-		w83781d_write_value(client, W83781D_REG_TEMP_OVER(1),
-				    TEMP_TO_REG(W83781D_INIT_TEMP_OVER));
-		w83781d_write_value(client, W83781D_REG_TEMP_HYST(1),
-				    TEMP_TO_REG(W83781D_INIT_TEMP_HYST));
-
-		if (type == as99127f) {
-			w83781d_write_value(client, W83781D_REG_TEMP_OVER(2),
-					    AS99127_TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP2_OVER));
-			w83781d_write_value(client, W83781D_REG_TEMP_HYST(2),
-					    AS99127_TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP2_HYST));
-		} else {
-			w83781d_write_value(client, W83781D_REG_TEMP_OVER(2),
-					    TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP2_OVER));
-			w83781d_write_value(client, W83781D_REG_TEMP_HYST(2),
-					    TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP2_HYST));
-		}
-		w83781d_write_value(client, W83781D_REG_TEMP2_CONFIG, 0x00);
-
-		if (type == as99127f) {
-			w83781d_write_value(client, W83781D_REG_TEMP_OVER(3),
-					    AS99127_TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP3_OVER));
-			w83781d_write_value(client, W83781D_REG_TEMP_HYST(3),
-					    AS99127_TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP3_HYST));
-		} else if (type != w83783s && type != w83697hf) {
-			w83781d_write_value(client, W83781D_REG_TEMP_OVER(3),
-					    TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP3_OVER));
-			w83781d_write_value(client, W83781D_REG_TEMP_HYST(3),
-					    TEMP_ADD_TO_REG
-					    (W83781D_INIT_TEMP3_HYST));
-		}
 		if (type != w83783s && type != w83697hf) {
 			w83781d_write_value(client, W83781D_REG_TEMP3_CONFIG,
 					    0x00);
@@ -1865,15 +1692,15 @@
 		}
 
 		data->temp = w83781d_read_value(client, W83781D_REG_TEMP(1));
-		data->temp_min =
-		    w83781d_read_value(client, W83781D_REG_TEMP_OVER(1));
 		data->temp_max =
+		    w83781d_read_value(client, W83781D_REG_TEMP_OVER(1));
+		data->temp_hyst =
 		    w83781d_read_value(client, W83781D_REG_TEMP_HYST(1));
 		data->temp_add[0] =
 		    w83781d_read_value(client, W83781D_REG_TEMP(2));
 		data->temp_max_add[0] =
 		    w83781d_read_value(client, W83781D_REG_TEMP_OVER(2));
-		data->temp_min_add[0] =
+		data->temp_hyst_add[0] =
 		    w83781d_read_value(client, W83781D_REG_TEMP_HYST(2));
 		if (data->type != w83783s && data->type != w83697hf) {
 			data->temp_add[1] =
@@ -1881,7 +1708,7 @@
 			data->temp_max_add[1] =
 			    w83781d_read_value(client,
 					       W83781D_REG_TEMP_OVER(3));
-			data->temp_min_add[1] =
+			data->temp_hyst_add[1] =
 			    w83781d_read_value(client,
 					       W83781D_REG_TEMP_HYST(3));
 		}
diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/i2c/i2c-core.c	Thu Jan  8 23:00:23 2004
@@ -136,10 +136,10 @@
 
 	/* Add the adapter to the driver core.
 	 * If the parent pointer is not set up,
-	 * we add this adapter to the legacy bus.
+	 * we add this adapter to the host bus.
 	 */
 	if (adap->dev.parent == NULL)
-		adap->dev.parent = &legacy_bus;
+		adap->dev.parent = &platform_bus;
 	sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
 	adap->dev.driver = &i2c_adapter_driver;
 	adap->dev.release = &i2c_adapter_dev_release;
diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/i2c/i2c-dev.c	Thu Jan  8 23:00:24 2004
@@ -223,7 +223,7 @@
 
 		/* Put an arbritrary limit on the number of messages that can
 		 * be sent at once */
-		if (rdwr_arg.nmsgs > 42)
+		if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
 			return -EINVAL;
 		
 		rdwr_pa = (struct i2c_msg *)
@@ -447,7 +447,7 @@
 
 	/* register this i2c device with the driver core */
 	i2c_dev->adap = adap;
-	if (adap->dev.parent == &legacy_bus)
+	if (adap->dev.parent == &platform_bus)
 		i2c_dev->class_dev.dev = &adap->dev;
 	else
 		i2c_dev->class_dev.dev = adap->dev.parent;
diff -Nru a/drivers/ide/Kconfig b/drivers/ide/Kconfig
--- a/drivers/ide/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/Kconfig	Thu Jan  8 23:00:24 2004
@@ -745,6 +745,14 @@
 	  This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
 	  chipsets.
 
+config BLK_DEV_SGIIOC4
+	tristate "Silicon Graphics IOC4 chipset support"
+	depends on IA64_SGI_SN2
+	help
+	  This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
+	  chipset, which has one channel and can support two devices.
+	  Please say Y here if you have an Altix System from SGI.
+
 config BLK_DEV_SIIMAGE
 	tristate "Silicon Image chipset support"
 	help
diff -Nru a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c
--- a/drivers/ide/arm/icside.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/arm/icside.c	Thu Jan  8 23:00:24 2004
@@ -214,7 +214,7 @@
 #define NR_ENTRIES 256
 #define TABLE_SIZE (NR_ENTRIES * 8)
 
-static void ide_build_sglist(ide_drive_t *drive, struct request *rq)
+static void icside_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = drive->hwif;
 	struct icside_state *state = hwif->hwif_data;
@@ -543,7 +543,7 @@
 	BUG_ON(hwif->sg_dma_active);
 	BUG_ON(dma_channel_active(hwif->hw.dma));
 
-	ide_build_sglist(drive, rq);
+	icside_build_sglist(drive, rq);
 
 	/*
 	 * Ensure that we have the right interrupt routed.
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/ide-cd.c	Thu Jan  8 23:00:24 2004
@@ -3343,7 +3343,8 @@
 	drive->usage++;
 
 	if (!info->buffer)
-		info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
+		info->buffer = kmalloc(SECTOR_BUFFER_SIZE,
+					GFP_KERNEL|__GFP_REPEAT);
         if (!info->buffer || (rc = cdrom_open(&info->devinfo, inode, file)))
 		drive->usage--;
 	return rc;
diff -Nru a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
--- a/drivers/ide/ide-dma.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/ide-dma.c	Thu Jan  8 23:00:24 2004
@@ -200,8 +200,8 @@
  *	kernel provide the necessary cache management so that we can
  *	operate in a portable fashion
  */
- 
-static int ide_build_sglist (ide_drive_t *drive, struct request *rq)
+
+int ide_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = HWIF(drive);
 	struct scatterlist *sg = hwif->sg_table;
@@ -220,6 +220,8 @@
 	return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
 }
 
+EXPORT_SYMBOL_GPL(ide_build_sglist);
+
 /**
  *	ide_raw_build_sglist	-	map IDE scatter gather for DMA
  *	@drive: the drive to build the DMA table for
@@ -230,8 +232,8 @@
  *	of the  kernel provide the necessary cache management so that we can
  *	operate in a portable fashion
  */
- 
-static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
+
+int ide_raw_build_sglist(ide_drive_t *drive, struct request *rq)
 {
 	ide_hwif_t *hwif = HWIF(drive);
 	struct scatterlist *sg = hwif->sg_table;
@@ -270,6 +272,8 @@
 	return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
 }
 
+EXPORT_SYMBOL_GPL(ide_raw_build_sglist);
+
 /**
  *	ide_build_dmatable	-	build IDE DMA table
  *
@@ -925,11 +929,13 @@
  */
 int ide_release_dma (ide_hwif_t *hwif)
 {
+	if (hwif->mmio == 2)
+		return 1;
 	if (hwif->chipset == ide_etrax100)
 		return 1;
 
 	ide_release_dma_engine(hwif);
-	if (hwif->mmio)
+	if (hwif->mmio == 1)
 		return ide_release_mmio_dma(hwif);
 	return ide_release_iomio_dma(hwif);
 }
@@ -986,6 +992,21 @@
 	return 1;
 }
 
+int ide_mapped_mmio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
+{
+	printk(KERN_INFO "    %s: MMIO-DMA ", hwif->name);
+
+	hwif->dma_base = base;
+	if (hwif->cds->extra && hwif->channel == 0)
+		hwif->dma_extra = hwif->cds->extra;
+
+	if(hwif->mate)
+		hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
+	else
+		hwif->dma_master = base;
+	return 0;
+}
+
 int ide_iomio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
 {
 	printk(KERN_INFO "    %s: BM-DMA at 0x%04lx-0x%04lx",
@@ -1020,7 +1041,9 @@
  */
 int ide_dma_iobase (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
 {
-	if (hwif->mmio)
+	if (hwif->mmio == 2)
+		return ide_mapped_mmio_dma(hwif, base,ports);
+	if (hwif->mmio == 1)
 		return ide_mmio_dma(hwif, base, ports);
 	return ide_iomio_dma(hwif, base, ports);
 }
diff -Nru a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
--- a/drivers/ide/ide-io.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/ide-io.c	Thu Jan  8 23:00:24 2004
@@ -54,37 +54,6 @@
 #include <asm/io.h>
 #include <asm/bitops.h>
 
-#if (DISK_RECOVERY_TIME > 0)
-
-#error So the User Has To Fix the Compilation And Stop Hacking Port 0x43. Does anyone ever use this anyway ??
-
-/*
- * For really screwy hardware (hey, at least it *can* be used with Linux)
- * we can enforce a minimum delay time between successive operations.
- */
-static unsigned long read_timer (ide_hwif_t *hwif)
-{
-	unsigned long t, flags;
-	int i;
-	
-	/* FIXME this is completely unsafe! */
-	local_irq_save(flags);
-	t = jiffies * 11932;
-	outb_p(0, 0x43);
-	i = inb_p(0x40);
-	i |= inb_p(0x40) << 8;
-	local_irq_restore(flags);
-	return (t - i);
-}
-#endif /* DISK_RECOVERY_TIME */
-
-static inline void set_recovery_timer (ide_hwif_t *hwif)
-{
-#if (DISK_RECOVERY_TIME > 0)
-	hwif->last_time = read_timer(hwif);
-#endif /* DISK_RECOVERY_TIME */
-}
-
 /**
  *	ide_end_request		-	complete an IDE I/O
  *	@drive: IDE device for the I/O
@@ -653,10 +622,6 @@
 	if (block == 0 && drive->remap_0_to_1 == 1)
 		block = 1;  /* redirect MBR access to EZ-Drive partn table */
 
-#if (DISK_RECOVERY_TIME > 0)
-	while ((read_timer() - HWIF(drive)->last_time) < DISK_RECOVERY_TIME);
-#endif
-
 	if (blk_pm_suspend_request(rq) &&
 	    rq->pm->pm_step == ide_pm_state_start_suspend)
 		/* Mark drive blocked when starting the suspend sequence. */
@@ -1116,7 +1081,6 @@
 					startstop =
 					DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
 			}
-			set_recovery_timer(hwif);
 			drive->service_time = jiffies - drive->service_start;
 			spin_lock_irq(&ide_lock);
 			enable_irq(hwif->irq);
@@ -1313,7 +1277,6 @@
 	 * same irq as is currently being serviced here, and Linux
 	 * won't allow another of the same (on any CPU) until we return.
 	 */
-	set_recovery_timer(HWIF(drive));
 	drive->service_time = jiffies - drive->service_start;
 	if (startstop == ide_stopped) {
 		if (hwgroup->handler == NULL) {	/* paranoia */
diff -Nru a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
--- a/drivers/ide/ide-iops.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/ide-iops.c	Thu Jan  8 23:00:23 2004
@@ -647,6 +647,15 @@
 		timeout += jiffies;
 		while ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) {
 			if (time_after(jiffies, timeout)) {
+				/*
+				 * One last read after the timeout in case
+				 * heavy interrupt load made us not make any
+				 * progress during the timeout..
+				 */
+				stat = hwif->INB(IDE_STATUS_REG);
+				if (!(stat & BUSY_STAT))
+					break;
+
 				local_irq_restore(flags);
 				*startstop = DRIVER(drive)->error(drive, "status timeout", stat);
 				return 1;
diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
--- a/drivers/ide/ide-tape.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/ide-tape.c	Thu Jan  8 23:00:23 2004
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/ide-tape.c		Version 1.17b	Oct, 2002
+ * linux/drivers/ide/ide-tape.c		Version 1.19	Nov, 2003
  *
  * Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il>
  *
@@ -422,7 +422,7 @@
  *		sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
  */
 
-#define IDETAPE_VERSION "1.17b-ac1"
+#define IDETAPE_VERSION "1.19"
 
 #include <linux/config.h>
 #include <linux/module.h>
@@ -450,9 +450,6 @@
 #include <asm/unaligned.h>
 #include <asm/bitops.h>
 
-
-#define NO_LONGER_REQUIRED	(1)
-
 /*
  *	OnStream support
  */
@@ -652,9 +649,11 @@
 #define IDETAPE_PC_STACK		(10 + IDETAPE_MAX_PC_RETRIES)
 
 /*
- *	Some tape drives require a long irq timeout
+ * Some drives (for example, Seagate STT3401A Travan) require a very long
+ * timeout, because they don't return an interrupt or clear their busy bit
+ * until after the command completes (even retension commands).
  */
-#define IDETAPE_WAIT_CMD		(60*HZ)
+#define IDETAPE_WAIT_CMD		(900*HZ)
 
 /*
  *	The following parameter is used to select the point in the internal
@@ -1032,6 +1031,10 @@
 
 	/* the door is currently locked */
 	int door_locked;
+	/* the tape hardware is write protected */
+	char drv_write_prot;
+	/* the tape is write protected (hardware or opened as read-only) */
+	char write_prot;
 
 	/*
 	 * OnStream flags
@@ -1164,6 +1167,8 @@
 #define IDETAPE_DRQ_INTERRUPT		6	/* DRQ interrupt device */
 #define IDETAPE_READ_ERROR		7
 #define IDETAPE_PIPELINE_ACTIVE		8	/* pipeline active */
+/* 0 = no tape is loaded, so we don't rewind after ejecting */
+#define IDETAPE_MEDIUM_PRESENT		9
 
 /*
  *	Supported ATAPI tape drives packet commands
@@ -1211,10 +1216,14 @@
  *	requests to the tail of our block device request queue and wait
  *	for their completion.
  */
-#define idetape_request(rq) \
-	((rq)->flags & (REQ_IDETAPE_PC1 | REQ_IDETAPE_PC2 | \
-			REQ_IDETAPE_READ | REQ_IDETAPE_WRITE | \
-			REQ_IDETAPE_READ_BUFFER))
+
+enum {
+	REQ_IDETAPE_PC1		= (1 << 0), /* packet command (first stage) */
+	REQ_IDETAPE_PC2		= (1 << 1), /* packet command (second stage) */
+	REQ_IDETAPE_READ	= (1 << 2),
+	REQ_IDETAPE_WRITE	= (1 << 3),
+	REQ_IDETAPE_READ_BUFFER	= (1 << 4),
+};
 
 /*
  *	Error codes which are returned in rq->errors to the higher part
@@ -1665,6 +1674,20 @@
 		idetape_update_buffers(pc);
 	}
 
+	/*
+	 * If error was the result of a zero-length read or write command,
+	 * with sense key=5, asc=0x22, ascq=0, let it slide.  Some drives
+	 * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes.
+	 */
+	if ((pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD)
+	    && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) { /* length==0 */
+		if (result->sense_key == 5) {
+			/* don't report an error, everything's ok */
+			pc->error = 0;
+			/* don't retry read/write */
+			set_bit(PC_ABORT, &pc->flags);
+		}
+	}
 	if (pc->c[0] == IDETAPE_READ_CMD && result->filemark) {
 		pc->error = IDETAPE_ERROR_FILEMARK;
 		set_bit(PC_ABORT, &pc->flags);
@@ -1805,10 +1828,15 @@
 	}
 }
 
-static void idetape_abort_pipeline (ide_drive_t *drive, idetape_stage_t *last_stage)
+/*
+ * This will free all the pipeline stages starting from new_last_stage->next
+ * to the end of the list, and point tape->last_stage to new_last_stage.
+ */
+static void idetape_abort_pipeline(ide_drive_t *drive,
+				   idetape_stage_t *new_last_stage)
 {
 	idetape_tape_t *tape = drive->driver_data;
-	idetape_stage_t *stage = tape->next_stage;
+	idetape_stage_t *stage = new_last_stage->next;
 	idetape_stage_t *nstage;
 
 #if IDETAPE_DEBUG_LOG
@@ -1822,9 +1850,9 @@
 		--tape->nr_pending_stages;
 		stage = nstage;
 	}
-	tape->last_stage = last_stage;
-	if (last_stage)
-		last_stage->next = NULL;
+	if (new_last_stage)
+		new_last_stage->next = NULL;
+	tape->last_stage = new_last_stage;
 	tape->next_stage = NULL;
 }
 
@@ -1868,7 +1896,7 @@
 		tape->active_stage = NULL;
 		tape->active_data_request = NULL;
 		tape->nr_pending_stages--;
-		if (rq->flags & REQ_IDETAPE_WRITE) {
+		if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
 #if ONSTREAM_DEBUG
 			if (tape->debug_level >= 2) {
 				if (tape->onstream) {
@@ -1914,7 +1942,7 @@
 					}
 				}
 			}
-		} else if (rq->flags & REQ_IDETAPE_READ) {
+		} else if (rq->cmd[0] & REQ_IDETAPE_READ) {
 			if (error == IDETAPE_ERROR_EOD) {
 				set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 				idetape_abort_pipeline(drive, active_stage);
@@ -1972,6 +2000,13 @@
 	pc->callback = &idetape_request_sense_callback;
 }
 
+static void idetape_init_rq(struct request *rq, u8 cmd)
+{
+	memset(rq, 0, sizeof(*rq));
+	rq->flags = REQ_SPECIAL;
+	rq->cmd[0] = cmd;
+}
+
 /*
  *	idetape_queue_pc_head generates a new packet command request in front
  *	of the request queue, before the current request, so that it will be
@@ -1993,8 +2028,7 @@
  */
 static void idetape_queue_pc_head (ide_drive_t *drive, idetape_pc_t *pc,struct request *rq)
 {
-	memset(rq, 0, sizeof(*rq));
-	rq->flags = REQ_IDETAPE_PC1;
+	idetape_init_rq(rq, REQ_IDETAPE_PC1);
 	rq->buffer = (char *) pc;
 	(void) ide_do_drive_cmd(drive, rq, ide_preempt);
 }
@@ -2430,7 +2464,14 @@
 	if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
 		pc->c[1] = 8;	/* DBD = 1 - Don't return block descriptors */
 	pc->c[2] = page_code;
-	pc->c[3] = 255;		/* Don't limit the returned information */
+	/*
+	 * Changed pc->c[3] to 0 (255 will at best return unused info).
+	 *
+	 * For SCSI this byte is defined as subpage instead of high byte
+	 * of length and some IDE drives seem to interpret it this way
+	 * and return an error when 255 is used.
+	 */
+	pc->c[3] = 0;
 	pc->c[4] = 255;		/* (We will just discard data in that case) */
 	if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
 		pc->request_transfer = 12;
@@ -2544,8 +2585,9 @@
 	if (status.b.dsc) {
 		if (status.b.check) {
 			/* Error detected */
-			printk(KERN_ERR "ide-tape: %s: I/O error, ",tape->name);
-
+			if (pc->c[0] != IDETAPE_TEST_UNIT_READY_CMD)
+				printk(KERN_ERR "ide-tape: %s: I/O error, ",
+						tape->name);
 			/* Retry operation */
 			return idetape_retry_pc(drive);
 		}
@@ -2697,7 +2739,7 @@
 	if (tape->debug_level >= 5)
 		printk(KERN_INFO "ide-tape: rq_status: %d, "
 			"dev: %s, cmd: %ld, errors: %d\n", rq->rq_status,
-			 rq->rq_disk->disk_name, rq->flags, rq->errors);
+			 rq->rq_disk->disk_name, rq->cmd[0], rq->errors);
 #endif
 	if (tape->debug_level >= 2)
 		printk(KERN_INFO "ide-tape: sector: %ld, "
@@ -2705,11 +2747,11 @@
 			rq->sector, rq->nr_sectors, rq->current_nr_sectors);
 #endif /* IDETAPE_DEBUG_LOG */
 
-	if (!idetape_request(rq)) {
+	if ((rq->flags & REQ_SPECIAL) == 0) {
 		/*
 		 * We do not support buffer cache originated requests.
 		 */
-		printk(KERN_NOTICE "ide-tape: %s: Unsupported command in "
+		printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
 			"request queue (%ld)\n", drive->name, rq->flags);
 		ide_end_request(drive, 0, 0);
 		return ide_stopped;
@@ -2746,7 +2788,7 @@
 	 */
 	if (tape->onstream)
 		status.b.dsc = 1;
-	if (!drive->dsc_overlap && !(rq->flags & REQ_IDETAPE_PC2))
+	if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2))
 		set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
 
 	/*
@@ -2760,7 +2802,7 @@
 	if (tape->tape_still_time > 100 && tape->tape_still_time < 200)
 		tape->measure_insert_time = 1;
 	if (tape->req_buffer_fill &&
-	    (rq->flags & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
+	    (rq->cmd[0] & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
 		tape->req_buffer_fill = 0;
 		tape->writes_since_buffer_fill = 0;
 		tape->reads_since_buffer_fill = 0;
@@ -2774,12 +2816,12 @@
 		tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
 	calculate_speeds(drive);
 	if (tape->onstream && tape->max_frames &&
-	    (((rq->flags & REQ_IDETAPE_WRITE) &&
+	    (((rq->cmd[0] & REQ_IDETAPE_WRITE) &&
               ( tape->cur_frames == tape->max_frames ||
                 ( tape->speed_control && tape->cur_frames > 5 &&
                        (tape->insert_speed > tape->max_insert_speed ||
                         (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */) ) ) ) ) ||
-	     ((rq->flags & REQ_IDETAPE_READ) &&
+	     ((rq->cmd[0] & REQ_IDETAPE_READ) &&
 	      ( tape->cur_frames == 0 ||
 		( tape->speed_control && (tape->cur_frames < tape->max_frames - 5) &&
 			tape->insert_speed > tape->max_insert_speed ) ) && rq->nr_sectors) ) ) {
@@ -2787,7 +2829,7 @@
 		if (tape->debug_level >= 4)
 			printk(KERN_INFO "ide-tape: postponing request, "
 					"cmd %ld, cur %d, max %d\n",
-				rq->flags, tape->cur_frames, tape->max_frames);
+				rq->cmd[0], tape->cur_frames, tape->max_frames);
 #endif
 		if (tape->postpone_cnt++ < 500) {
 			status.b.dsc = 0;
@@ -2808,7 +2850,7 @@
 		} else if ((signed long) (jiffies - tape->dsc_timeout) > 0) {
 			printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
 				tape->name);
-			if (rq->flags & REQ_IDETAPE_PC2) {
+			if (rq->cmd[0] & REQ_IDETAPE_PC2) {
 				idetape_media_access_finished(drive);
 				return ide_stopped;
 			} else {
@@ -2819,7 +2861,7 @@
 		idetape_postpone_request(drive);
 		return ide_stopped;
 	}
-	if (rq->flags & REQ_IDETAPE_READ) {
+	if (rq->cmd[0] & REQ_IDETAPE_READ) {
 		tape->buffer_head++;
 #if USE_IOTRACE
 		IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
@@ -2836,7 +2878,7 @@
 		idetape_create_read_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_WRITE) {
+	if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
 		tape->buffer_head++;
 #if USE_IOTRACE
 		IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
@@ -2854,19 +2896,19 @@
 		idetape_create_write_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_READ_BUFFER) {
+	if (rq->cmd[0] & REQ_IDETAPE_READ_BUFFER) {
 		tape->postpone_cnt = 0;
 		pc = idetape_next_pc_storage(drive);
 		idetape_create_read_buffer_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_PC1) {
+	if (rq->cmd[0] & REQ_IDETAPE_PC1) {
 		pc = (idetape_pc_t *) rq->buffer;
-		rq->flags &= ~(REQ_IDETAPE_PC1);
-		rq->flags |= REQ_IDETAPE_PC2;
+		rq->cmd[0] &= ~(REQ_IDETAPE_PC1);
+		rq->cmd[0] |= REQ_IDETAPE_PC2;
 		goto out;
 	}
-	if (rq->flags & REQ_IDETAPE_PC2) {
+	if (rq->cmd[0] & REQ_IDETAPE_PC2) {
 		idetape_media_access_finished(drive);
 		return ide_stopped;
 	}
@@ -3163,7 +3205,7 @@
 	idetape_tape_t *tape = drive->driver_data;
 
 #if IDETAPE_DEBUG_BUGS
-	if (rq == NULL || !idetape_request(rq)) {
+	if (rq == NULL || (rq->flags & REQ_SPECIAL) == 0) {
 		printk (KERN_ERR "ide-tape: bug: Trying to sleep on non-valid request\n");
 		return;
 	}
@@ -3269,8 +3311,7 @@
 {
 	struct request rq;
 
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = REQ_IDETAPE_PC1;
+	idetape_init_rq(&rq, REQ_IDETAPE_PC1);
 	rq.buffer = (char *) pc;
 	return ide_do_drive_cmd(drive, &rq, ide_wait);
 }
@@ -3295,25 +3336,28 @@
 {
 	idetape_tape_t *tape = drive->driver_data;
 	idetape_pc_t pc;
+	int load_attempted = 0;
 
 	/*
 	 * Wait for the tape to become ready
 	 */
+	set_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
 	timeout += jiffies;
 	while (time_before(jiffies, timeout)) {
 		idetape_create_test_unit_ready_cmd(&pc);
 		if (!__idetape_queue_pc_tail(drive, &pc))
 			return 0;
-		if (tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2) {
+		if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
+		    || (tape->asc == 0x3A)) {	/* no media */
+			if (load_attempted)
+				return -ENOMEDIUM;
 			idetape_create_load_unload_cmd(drive, &pc, IDETAPE_LU_LOAD_MASK);
 			__idetape_queue_pc_tail(drive, &pc);
-			idetape_create_test_unit_ready_cmd(&pc);
-			if (!__idetape_queue_pc_tail(drive, &pc))
-				return 0;
-		}
-		if (!(tape->sense_key == 2 && tape->asc == 4 &&
-		      (tape->ascq == 1 || tape->ascq == 8)))
-			break;
+			load_attempted = 1;
+		/* not about to be ready */
+		} else if (!(tape->sense_key == 2 && tape->asc == 4 &&
+			     (tape->ascq == 1 || tape->ascq == 8)))
+			return -EIO;
 		current->state = TASK_INTERRUPTIBLE;
   		schedule_timeout(HZ / 10);
 	}
@@ -3369,25 +3413,10 @@
 		printk(KERN_INFO "ide-tape: Reached idetape_read_position\n");
 #endif /* IDETAPE_DEBUG_LOG */
 
-#ifdef NO_LONGER_REQUIRED
-	idetape_flush_tape_buffers(drive);
-#endif
 	idetape_create_read_position_cmd(&pc);
 	if (idetape_queue_pc_tail(drive, &pc))
 		return -1;
 	position = tape->first_frame_position;
-#ifdef NO_LONGER_REQUIRED
-	if (tape->onstream) {
-		if ((position != tape->last_frame_position - tape->blocks_in_buffer) &&
-		    (position != tape->last_frame_position + tape->blocks_in_buffer)) {
-			if (tape->blocks_in_buffer == 0) {
-				printk("ide-tape: %s: correcting read position %d, %d, %d\n", tape->name, position, tape->last_frame_position, tape->blocks_in_buffer);
-				position = tape->last_frame_position;
-				tape->first_frame_position = position;
-			}
-		}
-	}
-#endif
 	return position;
 }
 
@@ -3436,6 +3465,8 @@
 
 	if (tape->chrdev_direction != idetape_direction_read)
 		return 0;
+
+	/* Remove merge stage. */
 	cnt = tape->merge_stage_size / tape->tape_block_size;
 	if (test_and_clear_bit(IDETAPE_FILEMARK, &tape->flags))
 		++cnt;		/* Filemarks count as 1 sector */
@@ -3444,9 +3475,12 @@
 		__idetape_kfree_stage(tape->merge_stage);
 		tape->merge_stage = NULL;
 	}
+
+	/* Clear pipeline flags. */
 	clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 	tape->chrdev_direction = idetape_direction_none;
-	
+
+	/* Remove pipeline stages. */
 	if (tape->first_stage == NULL)
 		return 0;
 
@@ -3546,8 +3580,7 @@
 	}
 #endif /* IDETAPE_DEBUG_BUGS */	
 
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = cmd;
+	idetape_init_rq(&rq, cmd);
 	rq.special = (void *)bh;
 	rq.sector = tape->first_frame_position;
 	rq.nr_sectors = rq.current_nr_sectors = blocks;
@@ -3596,8 +3629,7 @@
 			printk(KERN_INFO "ide-tape: %s: read back logical block %d, data %x %x %x %x\n", tape->name, logical_blk_num, *p++, *p++, *p++, *p++);
 #endif
 		rq = &stage->rq;
-		memset(rq, 0, sizeof(*rq));
-		rq->flags = REQ_IDETAPE_WRITE;
+		idetape_init_rq(rq, REQ_IDETAPE_WRITE);
 		rq->sector = tape->first_frame_position;
 		rq->nr_sectors = rq->current_nr_sectors = tape->capabilities.ctl;
 		idetape_init_stage(drive, stage, OS_FRAME_TYPE_DATA, logical_blk_num++);
@@ -3871,8 +3903,7 @@
 		}
 	}
 	rq = &new_stage->rq;
-	memset(rq, 0, sizeof(*rq));
-	rq->flags = REQ_IDETAPE_WRITE;
+	idetape_init_rq(rq, REQ_IDETAPE_WRITE);
 	/* Doesn't actually matter - We always assume sequential access */
 	rq->sector = tape->first_frame_position;
 	rq->nr_sectors = rq->current_nr_sectors = blocks;
@@ -4059,19 +4090,22 @@
 		 *	Issue a read 0 command to ensure that DSC handshake
 		 *	is switched from completion mode to buffer available
 		 *	mode.
+		 *	No point in issuing this if DSC overlap isn't supported,
+		 *	some drives (Seagate STT3401A) will return an error.
 		 */
-		bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
-		if (bytes_read < 0) {
-			__idetape_kfree_stage(tape->merge_stage);
-			tape->merge_stage = NULL;
-			tape->chrdev_direction = idetape_direction_none;
-			return bytes_read;
+		if (drive->dsc_overlap) {
+			bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
+			if (bytes_read < 0) {
+				__idetape_kfree_stage(tape->merge_stage);
+				tape->merge_stage = NULL;
+				tape->chrdev_direction = idetape_direction_none;
+				return bytes_read;
+			}
 		}
 	}
 	if (tape->restart_speed_control_req)
 		idetape_restart_speed_control(drive);
-	memset(&rq, 0, sizeof(rq));
-	rq.flags = REQ_IDETAPE_READ;
+	idetape_init_rq(&rq, REQ_IDETAPE_READ);
 	rq.sector = tape->first_frame_position;
 	rq.nr_sectors = rq.current_nr_sectors = blocks;
 	if (!test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags) &&
@@ -4898,6 +4932,10 @@
 		return -ENXIO;
 	}
 
+	/* The drive is write protected. */
+	if (tape->write_prot)
+		return -EACCES;
+
 #if IDETAPE_DEBUG_LOG
 	if (tape->debug_level >= 3)
 		printk(KERN_INFO "ide-tape: Reached idetape_chrdev_write, "
@@ -4979,13 +5017,17 @@
 		 *	Issue a write 0 command to ensure that DSC handshake
 		 *	is switched from completion mode to buffer available
 		 *	mode.
+		 *	No point in issuing this if DSC overlap isn't supported,
+		 *	some drives (Seagate STT3401A) will return an error.
 		 */
-		retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
-		if (retval < 0) {
-			__idetape_kfree_stage(tape->merge_stage);
-			tape->merge_stage = NULL;
-			tape->chrdev_direction = idetape_direction_none;
-			return retval;
+		if (drive->dsc_overlap) {
+			retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
+			if (retval < 0) {
+				__idetape_kfree_stage(tape->merge_stage);
+				tape->merge_stage = NULL;
+				tape->chrdev_direction = idetape_direction_none;
+				return retval;
+			}
 		}
 #if ONSTREAM_DEBUG
 		if (tape->debug_level >= 2)
@@ -5141,7 +5183,7 @@
  *	Note:
  *
  *		MTBSF and MTBSFM are not supported when the tape doesn't
- *		supports spacing over filemarks in the reverse direction.
+ *		support spacing over filemarks in the reverse direction.
  *		In this case, MTFSFM is also usually not supported (it is
  *		supported in the rare case in which we crossed the filemark
  *		during our read-ahead pipelined operation mode).
@@ -5211,6 +5253,8 @@
 	}
 	switch (mt_op) {
 		case MTWEOF:
+			if (tape->write_prot)
+				return -EACCES;
 			idetape_discard_read_pipeline(drive, 1);
 			for (i = 0; i < mt_count; i++) {
 				retval = idetape_write_filemark(drive);
@@ -5231,9 +5275,21 @@
 			return (idetape_queue_pc_tail(drive, &pc));
 		case MTUNLOAD:
 		case MTOFFL:
+			/*
+			 * If door is locked, attempt to unlock before
+			 * attempting to eject.
+			 */
+			if (tape->door_locked) {
+				if (idetape_create_prevent_cmd(drive, &pc, 0))
+					if (!idetape_queue_pc_tail(drive, &pc))
+						tape->door_locked = DOOR_UNLOCKED;
+			}
 			idetape_discard_read_pipeline(drive, 0);
 			idetape_create_load_unload_cmd(drive, &pc,!IDETAPE_LU_LOAD_MASK);
-			return (idetape_queue_pc_tail(drive, &pc));
+			retval = idetape_queue_pc_tail(drive, &pc);
+			if (!retval)
+				clear_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
+			return retval;
 		case MTNOP:
 			idetape_discard_read_pipeline(drive, 0);
 			return (idetape_flush_tape_buffers(drive));
@@ -5409,6 +5465,8 @@
 					mtget.mt_gstat |= GMT_EOD(0xffffffff);
 				if (position <= OS_DATA_STARTFRAME1)
 					mtget.mt_gstat |= GMT_BOT(0xffffffff);
+			} else if (tape->drv_write_prot) {
+				mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);
 			}
 			if (copy_to_user((char *) arg,(char *) &mtget, sizeof(struct mtget)))
 				return -EFAULT;
@@ -5530,6 +5588,8 @@
 	return 1;
 }
 
+static void idetape_get_blocksize_from_block_descriptor(ide_drive_t *drive);
+
 /*
  *	Our character device open function.
  */
@@ -5539,7 +5599,8 @@
 	ide_drive_t *drive;
 	idetape_tape_t *tape;
 	idetape_pc_t pc;
-			
+	int retval;
+
 #if IDETAPE_DEBUG_LOG
 	printk(KERN_INFO "ide-tape: Reached idetape_chrdev_open\n");
 #endif /* IDETAPE_DEBUG_LOG */
@@ -5552,11 +5613,7 @@
 
 	if (test_and_set_bit(IDETAPE_BUSY, &tape->flags))
 		return -EBUSY;
-	if (!tape->onstream) {	
-		idetape_read_position(drive);
-		if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
-			(void) idetape_rewind_tape(drive);
-	} else {
+	if (tape->onstream) {
 		if (minor & 64) {
 			tape->tape_block_size = tape->stage_size = 32768 + 512;
 			tape->raw = 1;
@@ -5566,16 +5623,42 @@
 		}
                 idetape_onstream_mode_sense_tape_parameter_page(drive, tape->debug_level);
 	}
-	if (idetape_wait_ready(drive, 60 * HZ)) {
+	retval = idetape_wait_ready(drive, 60 * HZ);
+	if (retval) {
 		clear_bit(IDETAPE_BUSY, &tape->flags);
 		printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
-		return -EBUSY;
+		return retval;
 	}
-	if (tape->onstream)
-		idetape_read_position(drive);
+
+	idetape_read_position(drive);
+	if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
+		(void)idetape_rewind_tape(drive);
+
 	if (tape->chrdev_direction != idetape_direction_read)
 		clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
 
+	/* Read block size and write protect status from drive. */
+	idetape_get_blocksize_from_block_descriptor(drive);
+
+	/* Set write protect flag if device is opened as read-only. */
+	if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
+		tape->write_prot = 1;
+	else
+		tape->write_prot = tape->drv_write_prot;
+
+	/* Make sure drive isn't write protected if user wants to write. */
+	if (tape->write_prot) {
+		if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
+		    (filp->f_flags & O_ACCMODE) == O_RDWR) {
+			clear_bit(IDETAPE_BUSY, &tape->flags);
+			return -EROFS;
+		}
+	}
+
+	/*
+	 * Lock the tape drive door so user can't eject.
+	 * Analyze headers for OnStream drives.
+	 */
 	if (tape->chrdev_direction == idetape_direction_none) {
 		if (idetape_create_prevent_cmd(drive, &pc, 1)) {
 			if (!idetape_queue_pc_tail(drive, &pc)) {
@@ -5638,7 +5721,7 @@
 		__idetape_kfree_stage(tape->cache_stage);
 		tape->cache_stage = NULL;
 	}
-	if (minor < 128)
+	if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags))
 		(void) idetape_rewind_tape(drive);
 	if (tape->chrdev_direction == idetape_direction_none) {
 		if (tape->door_locked == DOOR_LOCKED) {
@@ -6059,6 +6142,8 @@
 	header = (idetape_mode_parameter_header_t *) pc.buffer;
 	block_descrp = (idetape_parameter_block_descriptor_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t));
 	tape->tape_block_size =( block_descrp->length[0]<<16) + (block_descrp->length[1]<<8) + block_descrp->length[2];
+	tape->drv_write_prot = (header->dsp & 0x80) >> 7;
+
 #if IDETAPE_DEBUG_INFO
 	printk(KERN_INFO "ide-tape: Adjusted block size - %d\n", tape->tape_block_size);
 #endif /* IDETAPE_DEBUG_INFO */
@@ -6139,6 +6224,9 @@
 		}
 	}
 #endif /* CONFIG_BLK_DEV_IDEPCI */
+	/* Seagate Travan drives do not support DSC overlap. */
+	if (strstr(drive->id->model, "Seagate STT3401"))
+		drive->dsc_overlap = 0;
 	tape->drive = drive;
 	tape->minor = minor;
 	tape->name[0] = 'h';
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
--- a/drivers/ide/ide.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/ide.c	Thu Jan  8 23:00:23 2004
@@ -1632,12 +1632,12 @@
 #endif /* CONFIG_IDE_TASK_IOCTL */
 
 		case HDIO_DRIVE_CMD:
-			if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			if (!capable(CAP_SYS_RAWIO))
 				return -EACCES;
 			return ide_cmd_ioctl(drive, cmd, arg);
 
 		case HDIO_DRIVE_TASK:
-			if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			if (!capable(CAP_SYS_RAWIO))
 				return -EACCES;
 			return ide_task_ioctl(drive, cmd, arg);
 
diff -Nru a/drivers/ide/pci/Makefile b/drivers/ide/pci/Makefile
--- a/drivers/ide/pci/Makefile	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/pci/Makefile	Thu Jan  8 23:00:23 2004
@@ -21,6 +21,7 @@
 obj-$(CONFIG_BLK_DEV_PIIX)		+= piix.o
 obj-$(CONFIG_BLK_DEV_RZ1000)		+= rz1000.o
 obj-$(CONFIG_BLK_DEV_SVWKS)		+= serverworks.o
+obj-$(CONFIG_BLK_DEV_SGIIOC4)		+= sgiioc4.o
 obj-$(CONFIG_BLK_DEV_SIIMAGE)		+= siimage.o
 obj-$(CONFIG_BLK_DEV_SIS5513)		+= sis5513.o
 obj-$(CONFIG_BLK_DEV_SL82C105)		+= sl82c105.o
diff -Nru a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c
--- a/drivers/ide/pci/cmd640.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ide/pci/cmd640.c	Thu Jan  8 23:00:24 2004
@@ -213,13 +213,13 @@
 
 static void put_cmd640_reg_pci1 (u16 reg, u8 val)
 {
-	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
+	outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
 	outb_p(val, (reg & 3) | 0xcfc);
 }
 
 static u8 get_cmd640_reg_pci1 (u16 reg)
 {
-	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
+	outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
 	return inb_p((reg & 3) | 0xcfc);
 }
 
diff -Nru a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c
--- a/drivers/ide/pci/piix.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/pci/piix.c	Thu Jan  8 23:00:23 2004
@@ -768,8 +768,8 @@
 		/* Only on the original revision: IDE DMA can hang */
 		if(rev == 0x00)
 			no_piix_dma = 1;
-		/* On all revisions PXB bus lock must be disabled for IDE */
-		else if(cfg & (1<<14))
+		/* On all revisions below 5 PXB bus lock must be disabled for IDE */
+		else if(cfg & (1<<14) && rev < 5)
 			no_piix_dma = 2;
 	}
 	if(no_piix_dma)
diff -Nru a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/ide/pci/sgiioc4.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,833 @@
+/*
+ * Copyright (c) 2003 Silicon Graphics, Inc.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA  94043, or:
+ *
+ * http://www.sgi.com
+ *
+ * For further information regarding this notice, see:
+ *
+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/hdreg.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+#include <linux/blkdev.h>
+#include <asm/io.h>
+
+#include <linux/ide.h>
+
+/* IOC4 Specific Definitions */
+#define IOC4_CMD_OFFSET		0x100
+#define IOC4_CTRL_OFFSET	0x120
+#define IOC4_DMA_OFFSET		0x140
+#define IOC4_INTR_OFFSET	0x0
+
+#define IOC4_TIMING		0x00
+#define IOC4_DMA_PTR_L		0x01
+#define IOC4_DMA_PTR_H		0x02
+#define IOC4_DMA_ADDR_L		0x03
+#define IOC4_DMA_ADDR_H		0x04
+#define IOC4_BC_DEV		0x05
+#define IOC4_BC_MEM		0x06
+#define	IOC4_DMA_CTRL		0x07
+#define	IOC4_DMA_END_ADDR	0x08
+
+/* Bits in the IOC4 Control/Status Register */
+#define	IOC4_S_DMA_START	0x01
+#define	IOC4_S_DMA_STOP		0x02
+#define	IOC4_S_DMA_DIR		0x04
+#define	IOC4_S_DMA_ACTIVE	0x08
+#define	IOC4_S_DMA_ERROR	0x10
+#define	IOC4_ATA_MEMERR		0x02
+
+/* Read/Write Directions */
+#define	IOC4_DMA_WRITE		0x04
+#define	IOC4_DMA_READ		0x00
+
+/* Interrupt Register Offsets */
+#define IOC4_INTR_REG		0x03
+#define	IOC4_INTR_SET		0x05
+#define	IOC4_INTR_CLEAR		0x07
+
+#define IOC4_IDE_CACHELINE_SIZE	128
+#define IOC4_CMD_CTL_BLK_SIZE	0x20
+#define IOC4_SUPPORTED_FIRMWARE_REV 46
+
+typedef struct {
+	u32 timing_reg0;
+	u32 timing_reg1;
+	u32 low_mem_ptr;
+	u32 high_mem_ptr;
+	u32 low_mem_addr;
+	u32 high_mem_addr;
+	u32 dev_byte_count;
+	u32 mem_byte_count;
+	u32 status;
+} ioc4_dma_regs_t;
+
+/* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */
+/* IOC4 has only 1 IDE channel */
+#define IOC4_PRD_BYTES       16
+#define IOC4_PRD_ENTRIES     (PAGE_SIZE /(4*IOC4_PRD_BYTES))
+
+
+static void
+sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port,
+			unsigned long ctrl_port, unsigned long irq_port)
+{
+	unsigned long reg = data_port;
+	int i;
+
+	/* Registers are word (32 bit) aligned */
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
+		hw->io_ports[i] = reg + i * 4;
+
+	if (ctrl_port)
+		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
+
+	if (irq_port)
+		hw->io_ports[IDE_IRQ_OFFSET] = irq_port;
+}
+
+static void
+sgiioc4_maskproc(ide_drive_t * drive, int mask)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2),
+		   IDE_CONTROL_REG);
+}
+
+
+static int
+sgiioc4_checkirq(ide_hwif_t * hwif)
+{
+	u8 intr_reg =
+	    hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4);
+
+	if (intr_reg & 0x03)
+		return 1;
+
+	return 0;
+}
+
+
+static int
+sgiioc4_clearirq(ide_drive_t * drive)
+{
+	u32 intr_reg;
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned long other_ir =
+	    hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2);
+
+	/* Code to check for PCI error conditions */
+	intr_reg = hwif->INL(other_ir);
+	if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */
+		/*
+		 * Using hwif->INB to read the IDE_STATUS_REG has a side effect
+		 * of clearing the interrupt.  The first read should clear it
+		 * if it is set.  The second read should return a "clear" status
+		 * if it got cleared.  If not, then spin for a bit trying to
+		 * clear it.
+		 */
+		u8 stat = hwif->INB(IDE_STATUS_REG);
+		int count = 0;
+		stat = hwif->INB(IDE_STATUS_REG);
+		while ((stat & 0x80) && (count++ < 100)) {
+			udelay(1);
+			stat = hwif->INB(IDE_STATUS_REG);
+		}
+
+		if (intr_reg & 0x02) {
+			/* Error when transferring DMA data on PCI bus */
+			u32 pci_err_addr_low, pci_err_addr_high,
+			    pci_stat_cmd_reg;
+
+			pci_err_addr_low =
+				hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET]);
+			pci_err_addr_high =
+				hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + 4);
+			pci_read_config_dword(hwif->pci_dev, PCI_COMMAND,
+					      &pci_stat_cmd_reg);
+			printk(KERN_ERR
+			       "%s(%s) : PCI Bus Error when doing DMA:"
+				   " status-cmd reg is 0x%x\n",
+			       __FUNCTION__, drive->name, pci_stat_cmd_reg);
+			printk(KERN_ERR
+			       "%s(%s) : PCI Error Address is 0x%x%x\n",
+			       __FUNCTION__, drive->name,
+			       pci_err_addr_high, pci_err_addr_low);
+			/* Clear the PCI Error indicator */
+			pci_write_config_dword(hwif->pci_dev, PCI_COMMAND,
+					       0x00000146);
+		}
+
+		/* Clear the Interrupt, Error bits on the IOC4 */
+		hwif->OUTL(0x03, other_ir);
+
+		intr_reg = hwif->INL(other_ir);
+	}
+
+	return intr_reg & 3;
+}
+
+static int
+sgiioc4_ide_dma_begin(ide_drive_t * drive)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned int reg = hwif->INL(hwif->dma_base + IOC4_DMA_CTRL * 4);
+	unsigned int temp_reg = reg | IOC4_S_DMA_START;
+
+	hwif->OUTL(temp_reg, hwif->dma_base + IOC4_DMA_CTRL * 4);
+
+	return 0;
+}
+
+static u32
+sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base)
+{
+	u32	ioc4_dma;
+	int	count;
+
+	count = 0;
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	while ((ioc4_dma & IOC4_S_DMA_STOP) && (count++ < 200)) {
+		udelay(1);
+		ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	}
+	return ioc4_dma;
+}
+
+/* Stops the IOC4 DMA Engine */
+static int
+sgiioc4_ide_dma_end(ide_drive_t * drive)
+{
+	u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0;
+	ide_hwif_t *hwif = HWIF(drive);
+	u64 dma_base = hwif->dma_base;
+	int dma_stat = 0;
+	unsigned long *ending_dma = (unsigned long *) hwif->dma_base2;
+
+	hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+
+	ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+	if (ioc4_dma & IOC4_S_DMA_STOP) {
+		printk(KERN_ERR
+		       "%s(%s): IOC4 DMA STOP bit is still 1 :"
+		       "ioc4_dma_reg 0x%x\n",
+		       __FUNCTION__, drive->name, ioc4_dma);
+		dma_stat = 1;
+	}
+
+	/*
+	 * The IOC4 will DMA 1's to the ending dma area to indicate that
+	 * previous data DMA is complete.  This is necessary because of relaxed
+	 * ordering between register reads and DMA writes on the Altix.
+	 */
+	while ((cnt++ < 200) && (!valid)) {
+		for (num = 0; num < 16; num++) {
+			if (ending_dma[num]) {
+				valid = 1;
+				break;
+			}
+		}
+		udelay(1);
+	}
+	if (!valid) {
+		printk(KERN_ERR "%s(%s) : DMA incomplete\n", __FUNCTION__,
+		       drive->name);
+		dma_stat = 1;
+	}
+
+	bc_dev = hwif->INL(dma_base + IOC4_BC_DEV * 4);
+	bc_mem = hwif->INL(dma_base + IOC4_BC_MEM * 4);
+
+	if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) {
+		if (bc_dev > bc_mem + 8) {
+			printk(KERN_ERR
+			       "%s(%s): WARNING!! byte_count_dev %d "
+			       "!= byte_count_mem %d\n",
+			       __FUNCTION__, drive->name, bc_dev, bc_mem);
+		}
+	}
+
+	drive->waiting_for_dma = 0;
+	ide_destroy_dmatable(drive);
+
+	return dma_stat;
+}
+
+static int
+sgiioc4_ide_dma_check(ide_drive_t * drive)
+{
+	if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) {
+		printk(KERN_INFO
+		       "Couldnot set %s in Multimode-2 DMA mode | "
+			   "Drive %s using PIO instead\n",
+		       drive->name, drive->name);
+		drive->using_dma = 0;
+	} else
+		drive->using_dma = 1;
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_on(ide_drive_t * drive)
+{
+	drive->using_dma = 1;
+
+	return HWIF(drive)->ide_dma_host_on(drive);
+}
+
+static int
+sgiioc4_ide_dma_off(ide_drive_t * drive)
+{
+	printk(KERN_INFO "%s: DMA disabled\n", drive->name);
+
+	return HWIF(drive)->ide_dma_off_quietly(drive);
+}
+
+static int
+sgiioc4_ide_dma_off_quietly(ide_drive_t * drive)
+{
+	drive->using_dma = 0;
+
+	return HWIF(drive)->ide_dma_host_off(drive);
+}
+
+/* returns 1 if dma irq issued, 0 otherwise */
+static int
+sgiioc4_ide_dma_test_irq(ide_drive_t * drive)
+{
+	return sgiioc4_checkirq(HWIF(drive));
+}
+
+static int
+sgiioc4_ide_dma_host_on(ide_drive_t * drive)
+{
+	if (drive->using_dma)
+		return 0;
+
+	return 1;
+}
+
+static int
+sgiioc4_ide_dma_host_off(ide_drive_t * drive)
+{
+	sgiioc4_clearirq(drive);
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_verbose(ide_drive_t * drive)
+{
+	if (drive->using_dma == 1)
+		printk(", UDMA(16)");
+	else
+		printk(", PIO");
+
+	return 1;
+}
+
+static int
+sgiioc4_ide_dma_lostirq(ide_drive_t * drive)
+{
+	HWIF(drive)->resetproc(drive);
+
+	return __ide_dma_lostirq(drive);
+}
+
+static void
+sgiioc4_resetproc(ide_drive_t * drive)
+{
+	sgiioc4_ide_dma_end(drive);
+	sgiioc4_clearirq(drive);
+}
+
+static u8
+sgiioc4_INB(unsigned long port)
+{
+	u8 reg = (u8) inb(port);
+
+	if ((port & 0xFFF) == 0x11C) {	/* Status register of IOC4 */
+		if (reg & 0x51) {	/* Not busy...check for interrupt */
+			unsigned long other_ir = port - 0x110;
+			unsigned int intr_reg = (u32) inl(other_ir);
+
+			/* Clear the Interrupt, Error bits on the IOC4 */
+			if (intr_reg & 0x03) {
+				outl(0x03, other_ir);
+				intr_reg = (u32) inl(other_ir);
+			}
+		}
+	}
+
+	return reg;
+}
+
+/* Creates a dma map for the scatter-gather list entries */
+static void __init
+ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
+{
+	int num_ports = sizeof (ioc4_dma_regs_t);
+
+	printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name,
+	       dma_base, dma_base + num_ports - 1);
+
+	if (!request_region(dma_base, num_ports, hwif->name)) {
+		printk(KERN_ERR
+		       "%s(%s) -- ERROR, Addresses 0x%p to 0x%p "
+		       "ALREADY in use\n",
+		       __FUNCTION__, hwif->name, (void *) dma_base,
+		       (void *) dma_base + num_ports - 1);
+		goto dma_alloc_failure;
+	}
+
+	hwif->dma_base = dma_base;
+	hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev,
+					  IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
+					  &hwif->dmatable_dma);
+
+	if (!hwif->dmatable_cpu)
+		goto dma_alloc_failure;
+
+	hwif->sg_table =
+	    kmalloc(sizeof (struct scatterlist) * IOC4_PRD_ENTRIES, GFP_KERNEL);
+
+	if (!hwif->sg_table)
+		goto dma_sgalloc_failure;
+
+	hwif->dma_base2 = (unsigned long)
+		pci_alloc_consistent(hwif->pci_dev,
+				     IOC4_IDE_CACHELINE_SIZE,
+				     (dma_addr_t *) &(hwif->dma_status));
+
+	if (!hwif->dma_base2)
+		goto dma_base2alloc_failure;
+
+	return;
+
+dma_base2alloc_failure:
+	kfree(hwif->sg_table);
+
+dma_sgalloc_failure:
+	pci_free_consistent(hwif->pci_dev,
+			    IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
+			    hwif->dmatable_cpu, hwif->dmatable_dma);
+	printk(KERN_INFO
+	       "%s() -- Error! Unable to allocate DMA Maps for drive %s\n",
+	       __FUNCTION__, hwif->name);
+	printk(KERN_INFO
+	       "Changing from DMA to PIO mode for Drive %s\n", hwif->name);
+
+dma_alloc_failure:
+	/* Disable DMA because we couldnot allocate any DMA maps */
+	hwif->autodma = 0;
+	hwif->atapi_dma = 0;
+}
+
+/* Initializes the IOC4 DMA Engine */
+static void
+sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive)
+{
+	u32 ioc4_dma;
+	ide_hwif_t *hwif = HWIF(drive);
+	u64 dma_base = hwif->dma_base;
+	u32 dma_addr, ending_dma_addr;
+
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+
+	if (ioc4_dma & IOC4_S_DMA_ACTIVE) {
+		printk(KERN_WARNING
+			"%s(%s):Warning!! DMA from previous transfer was still active\n",
+		       __FUNCTION__, drive->name);
+		hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+		ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+		if (ioc4_dma & IOC4_S_DMA_STOP)
+			printk(KERN_ERR
+			       "%s(%s) : IOC4 Dma STOP bit is still 1\n",
+			       __FUNCTION__, drive->name);
+	}
+
+	ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
+	if (ioc4_dma & IOC4_S_DMA_ERROR) {
+		printk(KERN_WARNING
+		       "%s(%s) : Warning!! - DMA Error during Previous"
+		       " transfer | status 0x%x\n",
+		       __FUNCTION__, drive->name, ioc4_dma);
+		hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
+		ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
+
+		if (ioc4_dma & IOC4_S_DMA_STOP)
+			printk(KERN_ERR
+			       "%s(%s) : IOC4 DMA STOP bit is still 1\n",
+			       __FUNCTION__, drive->name);
+	}
+
+	/* Address of the Scatter Gather List */
+	dma_addr = cpu_to_le32(hwif->dmatable_dma);
+	hwif->OUTL(dma_addr, dma_base + IOC4_DMA_PTR_L * 4);
+
+	/* Address of the Ending DMA */
+	memset((unsigned int *) hwif->dma_base2, 0, IOC4_IDE_CACHELINE_SIZE);
+	ending_dma_addr = cpu_to_le32(hwif->dma_status);
+	hwif->OUTL(ending_dma_addr, dma_base + IOC4_DMA_END_ADDR * 4);
+
+	hwif->OUTL(dma_direction, dma_base + IOC4_DMA_CTRL * 4);
+	drive->waiting_for_dma = 1;
+}
+
+/* IOC4 Scatter Gather list Format 					 */
+/* 128 Bit entries to support 64 bit addresses in the future		 */
+/* The Scatter Gather list Entry should be in the BIG-ENDIAN Format	 */
+/* --------------------------------------------------------------------- */
+/* | Upper 32 bits - Zero           |	 	Lower 32 bits- address | */
+/* --------------------------------------------------------------------- */
+/* | Upper 32 bits - Zero	    |EOL| 15 unused     | 16 Bit Length| */
+/* --------------------------------------------------------------------- */
+/* Creates the scatter gather list, DMA Table */
+static unsigned int
+sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
+{
+	ide_hwif_t *hwif = HWIF(drive);
+	unsigned int *table = hwif->dmatable_cpu;
+	unsigned int count = 0, i = 1;
+	struct scatterlist *sg;
+
+	if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE)
+		hwif->sg_nents = i = ide_raw_build_sglist(drive, rq);
+	else
+		hwif->sg_nents = i = ide_build_sglist(drive, rq);
+
+	if (!i)
+		return 0;	/* sglist of length Zero */
+
+	sg = hwif->sg_table;
+	while (i && sg_dma_len(sg)) {
+		dma_addr_t cur_addr;
+		int cur_len;
+		cur_addr = sg_dma_address(sg);
+		cur_len = sg_dma_len(sg);
+
+		while (cur_len) {
+			if (count++ >= IOC4_PRD_ENTRIES) {
+				printk(KERN_WARNING
+				       "%s: DMA table too small\n",
+				       drive->name);
+				goto use_pio_instead;
+			} else {
+				u32 xcount, bcount =
+				    0x10000 - (cur_addr & 0xffff);
+
+				if (bcount > cur_len)
+					bcount = cur_len;
+
+				/* put the addr, length in
+				 * the IOC4 dma-table format */
+				*table = 0x0;
+				table++;
+				*table = cpu_to_be32(cur_addr);
+				table++;
+				*table = 0x0;
+				table++;
+
+				xcount = bcount & 0xffff;
+				*table = cpu_to_be32(xcount);
+				table++;
+
+				cur_addr += bcount;
+				cur_len -= bcount;
+			}
+		}
+
+		sg++;
+		i--;
+	}
+
+	if (count) {
+		table--;
+		*table |= cpu_to_be32(0x80000000);
+		return count;
+	}
+
+use_pio_instead:
+	pci_unmap_sg(hwif->pci_dev, hwif->sg_table, hwif->sg_nents,
+		     hwif->sg_dma_direction);
+	hwif->sg_dma_active = 0;
+
+	return 0;		/* revert to PIO for this request */
+}
+
+static int
+sgiioc4_ide_dma_read(ide_drive_t * drive)
+{
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int count = 0;
+
+	if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_FROMDEVICE))) {
+		/* try PIO instead of DMA */
+		return 1;
+	}
+	/* Writes FROM the IOC4 TO Main Memory */
+	sgiioc4_configure_for_dma(IOC4_DMA_WRITE, drive);
+
+	return 0;
+}
+
+static int
+sgiioc4_ide_dma_write(ide_drive_t * drive)
+{
+	struct request *rq = HWGROUP(drive)->rq;
+	unsigned int count = 0;
+
+	if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_TODEVICE))) {
+		/* try PIO instead of DMA */
+		return 1;
+	}
+
+	sgiioc4_configure_for_dma(IOC4_DMA_READ, drive);
+	/* Writes TO the IOC4 FROM Main Memory */
+
+	return 0;
+}
+
+static void __init
+ide_init_sgiioc4(ide_hwif_t * hwif)
+{
+	hwif->mmio = 2;
+	hwif->autodma = 1;
+	hwif->atapi_dma = 1;
+	hwif->ultra_mask = 0x0;	/* Disable Ultra DMA */
+	hwif->mwdma_mask = 0x2;	/* Multimode-2 DMA  */
+	hwif->swdma_mask = 0x2;
+	hwif->identify = NULL;
+	hwif->tuneproc = NULL;	/* Sets timing for PIO mode */
+	hwif->speedproc = NULL;	/* Sets timing for DMA &/or PIO modes */
+	hwif->selectproc = NULL;/* Use the default routine to select drive */
+	hwif->reset_poll = NULL;/* No HBA specific reset_poll needed */
+	hwif->pre_reset = NULL;	/* No HBA specific pre_set needed */
+	hwif->resetproc = &sgiioc4_resetproc;/* Reset DMA engine,
+						clear interrupts */
+	hwif->intrproc = NULL;	/* Enable or Disable interrupt from drive */
+	hwif->maskproc = &sgiioc4_maskproc;	/* Mask on/off NIEN register */
+	hwif->quirkproc = NULL;
+	hwif->busproc = NULL;
+
+	hwif->ide_dma_read = &sgiioc4_ide_dma_read;
+	hwif->ide_dma_write = &sgiioc4_ide_dma_write;
+	hwif->ide_dma_begin = &sgiioc4_ide_dma_begin;
+	hwif->ide_dma_end = &sgiioc4_ide_dma_end;
+	hwif->ide_dma_check = &sgiioc4_ide_dma_check;
+	hwif->ide_dma_on = &sgiioc4_ide_dma_on;
+	hwif->ide_dma_off = &sgiioc4_ide_dma_off;
+	hwif->ide_dma_off_quietly = &sgiioc4_ide_dma_off_quietly;
+	hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq;
+	hwif->ide_dma_host_on = &sgiioc4_ide_dma_host_on;
+	hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
+	hwif->ide_dma_bad_drive = &__ide_dma_bad_drive;
+	hwif->ide_dma_good_drive = &__ide_dma_good_drive;
+	hwif->ide_dma_count = &__ide_dma_count;
+	hwif->ide_dma_verbose = &sgiioc4_ide_dma_verbose;
+	hwif->ide_dma_retune = &__ide_dma_retune;
+	hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
+	hwif->ide_dma_timeout = &__ide_dma_timeout;
+	hwif->INB = &sgiioc4_INB;
+}
+
+static int __init
+sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
+{
+	unsigned long base, ctl, dma_base, irqport;
+	ide_hwif_t *hwif;
+	int h;
+
+	for (h = 0; h < MAX_HWIFS; ++h) {
+		hwif = &ide_hwifs[h];
+		/* Find an empty HWIF */
+		if (hwif->chipset == ide_unknown)
+			break;
+	}
+
+	/*  Get the CmdBlk and CtrlBlk Base Registers */
+	base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
+	ctl = pci_resource_start(dev, 0) + IOC4_CTRL_OFFSET;
+	irqport = pci_resource_start(dev, 0) + IOC4_INTR_OFFSET;
+	dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
+
+	if (!request_region(base, IOC4_CMD_CTL_BLK_SIZE, hwif->name)) {
+		printk(KERN_ERR
+			"%s : %s -- ERROR, Port Addresses "
+			"0x%p to 0x%p ALREADY in use\n",
+		       __FUNCTION__, hwif->name, (void *) base,
+		       (void *) base + IOC4_CMD_CTL_BLK_SIZE);
+		return 1;
+	}
+
+	if (hwif->io_ports[IDE_DATA_OFFSET] != base) {
+		/* Initialize the IO registers */
+		sgiioc4_init_hwif_ports(&hwif->hw, base, ctl, irqport);
+		memcpy(hwif->io_ports, hwif->hw.io_ports,
+		       sizeof (hwif->io_ports));
+		hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
+	}
+
+	hwif->irq = dev->irq;
+	hwif->chipset = ide_pci;
+	hwif->pci_dev = dev;
+	hwif->channel = 0;	/* Single Channel chip */
+	hwif->cds = (struct ide_pci_device_s *) d;
+	hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */
+
+	/* Initializing chipset IRQ Registers */
+	hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4);
+
+	ide_init_sgiioc4(hwif);
+
+	if (dma_base)
+		ide_dma_sgiioc4(hwif, dma_base);
+	else
+		printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
+		       hwif->name, d->name);
+
+	probe_hwif_init(hwif);
+	return 0;
+}
+
+/* This ensures that we can build this for generic kernels without
+ * having all the SN2 code sync'd and merged.
+ */
+typedef enum pciio_endian_e {
+	PCIDMA_ENDIAN_BIG,
+	PCIDMA_ENDIAN_LITTLE
+} pciio_endian_t;
+pciio_endian_t __attribute__ ((weak)) snia_pciio_endian_set(struct pci_dev
+					    *pci_dev, pciio_endian_t device_end,
+					    pciio_endian_t desired_end);
+
+static unsigned int __init
+pci_init_sgiioc4(struct pci_dev *dev, ide_pci_device_t * d)
+{
+	unsigned int class_rev;
+
+	if (pci_enable_device(dev)) {
+		printk(KERN_ERR
+		       "Failed to enable device %s at slot %s\n",
+		       d->name, dev->slot_name);
+		return 1;
+	}
+	pci_set_master(dev);
+
+	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
+	class_rev &= 0xff;
+	printk(KERN_INFO "%s: IDE controller at PCI slot %s, revision %d\n",
+			d->name, dev->slot_name, class_rev);
+	if (class_rev < IOC4_SUPPORTED_FIRMWARE_REV) {
+		printk(KERN_ERR "Skipping %s IDE controller in slot %s: "
+			"firmware is obsolete - please upgrade to revision"
+			"46 or higher\n", d->name, dev->slot_name);
+		return 1;
+	}
+
+	/* Enable Byte Swapping in the PIC... */
+	if (snia_pciio_endian_set) {
+		snia_pciio_endian_set(dev, PCIDMA_ENDIAN_LITTLE,
+				      PCIDMA_ENDIAN_BIG);
+	} else {
+		printk(KERN_ERR
+		       "Failed to set endianness for device %s at slot %s\n",
+		       d->name, dev->slot_name);
+		return 1;
+	}
+
+	return sgiioc4_ide_setup_pci_device(dev, d);
+}
+
+static ide_pci_device_t sgiioc4_chipsets[] __devinitdata = {
+	{
+	 /* Channel 0 */
+	 .vendor = PCI_VENDOR_ID_SGI,
+	 .device = PCI_DEVICE_ID_SGI_IOC4,
+	 .name = "SGIIOC4",
+	 .init_hwif = ide_init_sgiioc4,
+	 .init_dma = ide_dma_sgiioc4,
+	 .channels = 1,
+	 .autodma = AUTODMA,
+	 /* SGI IOC4 doesn't have enablebits. */
+	 .bootable = ON_BOARD,
+	}
+};
+
+static int __devinit
+sgiioc4_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+{
+	ide_pci_device_t *d = &sgiioc4_chipsets[id->driver_data];
+	if (dev->device != d->device) {
+		printk(KERN_ERR "Error in %s(dev 0x%p | id 0x%p )\n",
+		       __FUNCTION__, (void *) dev, (void *) id);
+		BUG();
+	}
+
+	if (pci_init_sgiioc4(dev, d))
+		return 0;
+
+	MOD_INC_USE_COUNT;
+
+	return 0;
+}
+
+static struct pci_device_id sgiioc4_pci_tbl[] = {
+	{PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID,
+	 PCI_ANY_ID, 0x0b4000, 0xFFFFFF, 0},
+	{0}
+};
+
+static struct pci_driver driver = {
+	.name = "SGI-IOC4 IDE",
+	.id_table = sgiioc4_pci_tbl,
+	.probe = sgiioc4_init_one,
+};
+
+static int
+sgiioc4_ide_init(void)
+{
+	return ide_pci_register_driver(&driver);
+}
+
+static void
+sgiioc4_ide_exit(void)
+{
+	ide_pci_unregister_driver(&driver);
+}
+
+module_init(sgiioc4_ide_init);
+module_exit(sgiioc4_ide_exit);
+
+MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)");
+MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
--- a/drivers/ide/setup-pci.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ide/setup-pci.c	Thu Jan  8 23:00:23 2004
@@ -474,6 +474,11 @@
  *	state
  */
  
+#ifndef CONFIG_BLK_DEV_IDEDMA_PCI
+static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
+{
+}
+#else
 static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
 {
 	u16 pcicmd;
@@ -516,6 +521,7 @@
 		}
 	}
 }
+#endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/
 
 /**
  *	ide_setup_pci_controller	-	set up IDE PCI
diff -Nru a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig
--- a/drivers/ieee1394/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/Kconfig	Thu Jan  8 23:00:23 2004
@@ -1,7 +1,7 @@
 # -*- shell-script -*-
 
 menu "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
-	depends on PCI && EXPERIMENTAL
+	depends on EXPERIMENTAL
 
 config IEEE1394
 	tristate "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
@@ -15,7 +15,7 @@
 	  is the core support only, you will also need to select a driver for
 	  your IEEE 1394 adapter.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called ieee1394.
 
 comment "Subsystem Options"
@@ -56,13 +56,13 @@
 
 config IEEE1394_PCILYNX
 	tristate "Texas Instruments PCILynx support"
-	depends on IEEE1394 && I2C_ALGOBIT
+	depends on PCI && IEEE1394 && I2C_ALGOBIT
 	help
 	  Say Y here if you have an IEEE-1394 controller with the Texas
 	  Instruments PCILynx chip.  Note: this driver is written for revision
 	  2 of this chip and may not work with revision 0.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called pcilynx.
 
 # Non-maintained pcilynx options
@@ -72,7 +72,7 @@
 # fi
 config IEEE1394_OHCI1394
 	tristate "OHCI-1394 support"
-	depends on IEEE1394
+	depends on PCI && IEEE1394
 	help
 	  Enable this driver if you have an IEEE 1394 controller based on the
 	  OHCI-1394 specification. The current driver is only tested with OHCI
@@ -80,7 +80,7 @@
 	  use one of these chipsets.  It should work with any OHCI-1394
 	  compliant card, however.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called ohci1394.
 
 comment "Protocol Drivers"
@@ -122,7 +122,7 @@
 
 	  The user-space API for dv1394 is documented in dv1394.h.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called dv1394.
 
 config IEEE1394_RAWIO
@@ -134,7 +134,7 @@
 	  direct communication of user programs with the IEEE 1394 bus and
 	  thus with the attached peripherals.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called raw1394.
 
 config IEEE1394_CMP
@@ -144,7 +144,7 @@
 	  This option enables the Connection Management Procedures
 	  (IEC61883-1) driver, which implements input and output plugs.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called cmp.
 
 config IEEE1394_AMDTP
@@ -157,7 +157,7 @@
 
 	  The userspace interface is documented in amdtp.h.
 
-	  To compile this driver as a module, choose M here: the
+	  To compile this driver as a module, say M here: the
 	  module will be called amdtp.
 
 endmenu
diff -Nru a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c
--- a/drivers/ieee1394/dma.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/dma.c	Thu Jan  8 23:00:24 2004
@@ -187,7 +187,7 @@
 /* nopage() handler for mmap access */
 
 static struct page*
-dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int write_access)
+dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	unsigned long offset;
 	unsigned long kernel_virt_addr;
@@ -202,6 +202,8 @@
 	    (address > (unsigned long) area->vm_start + (PAGE_SIZE * dma->n_pages)) )
 		goto out;
 
+	if (type)
+		*type = VM_FAULT_MINOR;
 	offset = address - area->vm_start;
 	kernel_virt_addr = (unsigned long) dma->kvirt + offset;
 	ret = vmalloc_to_page((void*) kernel_virt_addr);
diff -Nru a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
--- a/drivers/ieee1394/eth1394.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/eth1394.c	Thu Jan  8 23:00:24 2004
@@ -89,7 +89,7 @@
 #define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__)
 
 static char version[] __devinitdata =
-	"$Rev: 1043 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1079 $ Ben Collins <bcollins@debian.org>";
 
 struct fragment_info {
 	struct list_head list;
@@ -220,7 +220,7 @@
 
 			priv->iso = hpsb_iso_recv_init(priv->host, 16 * 4096,
 						       16, priv->broadcast_channel,
-						       1, ether1394_iso);
+						       HPSB_ISO_DMA_PACKET_PER_BUFFER, 1, ether1394_iso);
 			if (priv->iso == NULL) {
 				ETH1394_PRINT(KERN_ERR, dev->name,
 					      "failed to change broadcast "
@@ -475,7 +475,7 @@
 	priv->broadcast_channel = host->csr.broadcast_channel & 0x3f;
 
 	priv->iso = hpsb_iso_recv_init(host, 16 * 4096, 16, priv->broadcast_channel,
-				       1, ether1394_iso);
+					HPSB_ISO_DMA_PACKET_PER_BUFFER, 1, ether1394_iso);
 	if (priv->iso == NULL) {
 		priv->bc_state = ETHER1394_BC_CLOSED;
 	}
@@ -1258,7 +1258,7 @@
 {
 	struct hpsb_packet *p;
 
-	p = alloc_hpsb_packet(0);
+	p = hpsb_alloc_packet(0);
 	if (p) {
 		p->host = host;
 		p->data = NULL;
@@ -1327,7 +1327,7 @@
 	if (packet->tcode != TCODE_STREAM_DATA)
 		hpsb_free_tlabel(packet);
 	packet->data = NULL;
-	free_hpsb_packet(packet);
+	hpsb_free_packet(packet);
 }
 
 static void ether1394_complete_cb(void *__ptask);
@@ -1349,7 +1349,7 @@
 					       ptask->dest_node,
 					       ptask->addr, ptask->skb->data,
 					       tx_len)) {
-		free_hpsb_packet(packet);
+		hpsb_free_packet(packet);
 		return -1;
 	}
 
@@ -1357,7 +1357,7 @@
 	hpsb_set_packet_complete_task(ptask->packet, ether1394_complete_cb,
 				      ptask);
 
-	if (!hpsb_send_packet(packet)) {
+	if (hpsb_send_packet(packet) < 0) {
 		ether1394_free_packet(packet);
 		return -1;
 	}
@@ -1599,7 +1599,7 @@
 		case ETHTOOL_GDRVINFO: {
 			struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
 			strcpy (info.driver, driver_name);
-			strcpy (info.version, "$Rev: 1043 $");
+			strcpy (info.version, "$Rev: 1079 $");
 			/* FIXME XXX provide sane businfo */
 			strcpy (info.bus_info, "ieee1394");
 			if (copy_to_user (useraddr, &info, sizeof (info)))
diff -Nru a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c
--- a/drivers/ieee1394/highlevel.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/highlevel.c	Thu Jan  8 23:00:24 2004
@@ -26,6 +26,7 @@
 #include "hosts.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"
+#include "nodemgr.h"
 
 
 struct hl_host_info {
@@ -227,10 +228,17 @@
 	return host;
 }
 
+static int highlevel_for_each_host_reg(struct hpsb_host *host, void *__data)
+{
+	struct hpsb_highlevel *hl = __data;
+
+	hl->add_host(host);
+
+	return 0;
+}
 
 void hpsb_register_highlevel(struct hpsb_highlevel *hl)
 {
-	struct list_head *lh;
 	unsigned long flags;
 
         INIT_LIST_HEAD(&hl->addr_list);
@@ -242,21 +250,25 @@
         list_add_tail(&hl->hl_list, &hl_drivers);
 	write_unlock_irqrestore(&hl_drivers_lock, flags);
 
-	if (hl->add_host) {
-		down(&hpsb_hosts_lock);
-		list_for_each (lh, &hpsb_hosts) {
-			struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
-			hl->add_host(host);
-		}
-		up(&hpsb_hosts_lock);
-	}
+	if (hl->add_host)
+		nodemgr_for_each_host(hl, highlevel_for_each_host_reg);
 
         return;
 }
 
+static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data)
+{
+	struct hpsb_highlevel *hl = __data;
+
+	hl->remove_host(host);
+	hpsb_destroy_hostinfo(hl, host);
+
+	return 0;
+}
+
 void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
 {
-        struct list_head *lh, *next;
+	struct list_head *lh, *next;
         struct hpsb_address_serve *as;
 	unsigned long flags;
 
@@ -272,16 +284,8 @@
         list_del(&hl->hl_list);
 	write_unlock_irqrestore(&hl_drivers_lock, flags);
 
-        if (hl->remove_host) {
-		down(&hpsb_hosts_lock);
-		list_for_each(lh, &hpsb_hosts) {
-			struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
-
-			hl->remove_host(host);
-			hpsb_destroy_hostinfo(hl, host);
-		}
-		up(&hpsb_hosts_lock);
-	}
+        if (hl->remove_host)
+		nodemgr_for_each_host(hl, highlevel_for_each_host_unreg);
 }
 
 int hpsb_register_addrspace(struct hpsb_highlevel *hl,
diff -Nru a/drivers/ieee1394/highlevel.h b/drivers/ieee1394/highlevel.h
--- a/drivers/ieee1394/highlevel.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/highlevel.h	Thu Jan  8 23:00:23 2004
@@ -92,8 +92,6 @@
 };
 
 
-void init_hpsb_highlevel(void);
-
 void highlevel_add_host(struct hpsb_host *host);
 void highlevel_remove_host(struct hpsb_host *host);
 void highlevel_host_reset(struct hpsb_host *host);
@@ -179,5 +177,8 @@
 
 /* Retrieve hpsb_host using a highlevel handle and a key */
 struct hpsb_host *hpsb_get_host_bykey(struct hpsb_highlevel *hl, unsigned long key);
+
+/* Initialize the highlevel system */
+void init_hpsb_highlevel(void);
 
 #endif /* IEEE1394_HIGHLEVEL_H */
diff -Nru a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c
--- a/drivers/ieee1394/hosts.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/hosts.c	Thu Jan  8 23:00:23 2004
@@ -16,14 +16,14 @@
 #include <linux/list.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/pci.h>
 
 #include "ieee1394_types.h"
 #include "hosts.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"
+#include "nodemgr.h"
 
-LIST_HEAD(hpsb_hosts);
-DECLARE_MUTEX(hpsb_hosts_lock);
 
 static int dummy_transmit_packet(struct hpsb_host *h, struct hpsb_packet *p)
 {
@@ -46,54 +46,14 @@
 	.isoctl =          dummy_isoctl
 };
 
-/**
- * hpsb_ref_host - increase reference count for host controller.
- * @host: the host controller
- *
- * Increase the reference count for the specified host controller.
- * When holding a reference to a host, the memory allocated for the
- * host struct will not be freed and the host is guaranteed to be in a
- * consistent state.  The driver may be unloaded or the controller may
- * be removed (PCMCIA), but the host struct will remain valid.
- */
-
-int hpsb_ref_host(struct hpsb_host *host)
+static int alloc_hostnum_cb(struct hpsb_host *host, void *__data)
 {
-        struct list_head *lh;
-        int retval = 0;
-
-	down(&hpsb_hosts_lock);
-        list_for_each(lh, &hpsb_hosts) {
-                if (host == list_entry(lh, struct hpsb_host, host_list)) {
-			if (try_module_get(host->driver->owner)) {
-				atomic_inc(&host->refcount);
-				retval = 1;
-			}
-			break;
-        	}
-        }
-	up(&hpsb_hosts_lock);
-
-        return retval;
-}
+	int *hostnum = __data;
 
-/**
- * hpsb_unref_host - decrease reference count for host controller.
- * @host: the host controller
- *
- * Decrease the reference count for the specified host controller.
- * When the reference count reaches zero, the memory allocated for the
- * &hpsb_host will be freed.
- */
-
-void hpsb_unref_host(struct hpsb_host *host)
-{
-	module_put(host->driver->owner);
+	if (host->id == *hostnum)
+		return 1;
 
-	down(&hpsb_hosts_lock);
-        if (atomic_dec_and_test(&host->refcount) && host->is_shutdown)
-		device_unregister(&host->device);
-	up(&hpsb_hosts_lock);
+	return 0;
 }
 
 /**
@@ -108,19 +68,16 @@
  * driver specific parts, enable the controller and make it available
  * to the general subsystem using hpsb_add_host().
  *
- * The &hpsb_host is allocated with an single initial reference
- * belonging to the driver.  Once the driver is done with the struct,
- * for example, when the driver is unloaded, it should release this
- * reference using hpsb_unref_host().
- *
  * Return Value: a pointer to the &hpsb_host if succesful, %NULL if
  * no memory was available.
  */
 
-struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra)
+struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
+				  struct device *dev)
 {
         struct hpsb_host *h;
 	int i;
+	int hostnum = 0;
 
         h = kmalloc(sizeof(struct hpsb_host) + extra, SLAB_KERNEL);
         if (!h) return NULL;
@@ -128,7 +85,6 @@
 
 	h->hostdata = h + 1;
         h->driver = drv;
-	atomic_set(&h->refcount, 1);
 
         INIT_LIST_HEAD(&h->pending_packets);
         spin_lock_init(&h->pending_pkt_lock);
@@ -146,53 +102,35 @@
         h->topology_map = h->csr.topology_map + 3;
         h->speed_map = (u8 *)(h->csr.speed_map + 2);
 
-	return h;
-}
-
-static int alloc_hostnum(void)
-{
-	int hostnum = 0;
-
 	while (1) {
-		struct list_head *lh;
-		int found = 0;
-
-		list_for_each(lh, &hpsb_hosts) {
-			struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
-
-			if (host->id == hostnum) {
-				found = 1;
-				break;
-			}
+		if (!nodemgr_for_each_host(&hostnum, alloc_hostnum_cb)) {
+			h->id = hostnum;
+			break;
 		}
 
-		if (!found)
-			return hostnum;
-
 		hostnum++;
 	}
 
-	return 0;
+	memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device));
+	h->device.parent = dev;
+	snprintf(h->device.bus_id, BUS_ID_SIZE, "fw-host%d", h->id);
+	device_register(&h->device);
+
+	return h;
 }
 
 void hpsb_add_host(struct hpsb_host *host)
 {
-	down(&hpsb_hosts_lock);
-	host->id = alloc_hostnum();
-        list_add_tail(&host->host_list, &hpsb_hosts);
-	up(&hpsb_hosts_lock);
-
         highlevel_add_host(host);
         host->driver->devctl(host, RESET_BUS, LONG_RESET);
 }
 
 void hpsb_remove_host(struct hpsb_host *host)
 {
-	down(&hpsb_hosts_lock);
         host->is_shutdown = 1;
         host->driver = &dummy_driver;
-	list_del(&host->host_list);
-	up(&hpsb_hosts_lock);
 
         highlevel_remove_host(host);
+
+	device_unregister(&host->device);
 }
diff -Nru a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h
--- a/drivers/ieee1394/hosts.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/hosts.h	Thu Jan  8 23:00:23 2004
@@ -29,8 +29,6 @@
 
         atomic_t generation;
 
-	atomic_t refcount;
-
         struct list_head pending_packets;
         spinlock_t pending_pkt_lock;
 	struct timer_list timeout;
@@ -165,7 +163,7 @@
          * packet->type == raw) and do byte-swapping as necessary or instruct
          * the hardware to do so.  It can return immediately after the packet
          * was queued for sending.  After sending, hpsb_sent_packet() has to be
-         * called.  Return 0 for failure.
+         * called.  Return 0 on success, negative errno on failure.
          * NOTE: The function must be callable in interrupt context.
          */
         int (*transmit_packet) (struct hpsb_host *host, 
@@ -195,22 +193,8 @@
 };
 
 
-extern struct list_head hpsb_hosts;
-extern struct semaphore hpsb_hosts_lock;
-
-
-/*
- * In order to prevent hosts from unloading, use hpsb_ref_host().  This prevents
- * the host from going away (e.g. makes module unloading of the driver
- * impossible), but still can not guarantee it (e.g. PC-Card being pulled by the
- * user).  hpsb_ref_host() returns false if host could not be locked.  If it is
- * successful, host is valid as a pointer until hpsb_unref_host() (not just
- * until after remove_host).
- */
-int hpsb_ref_host(struct hpsb_host *host);
-void hpsb_unref_host(struct hpsb_host *host);
-
-struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra);
+struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
+				  struct device *dev);
 void hpsb_add_host(struct hpsb_host *host);
 void hpsb_remove_host(struct hpsb_host *h);
 
diff -Nru a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c
--- a/drivers/ieee1394/ieee1394_core.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/ieee1394_core.c	Thu Jan  8 23:00:23 2004
@@ -109,7 +109,7 @@
 }
 
 /**
- * alloc_hpsb_packet - allocate new packet structure
+ * hpsb_alloc_packet - allocate new packet structure
  * @data_size: size of the data block to be allocated
  *
  * This function allocates, initializes and returns a new &struct hpsb_packet.
@@ -128,7 +128,7 @@
  * Return value: A pointer to a &struct hpsb_packet or NULL on allocation
  * failure.
  */
-struct hpsb_packet *alloc_hpsb_packet(size_t data_size)
+struct hpsb_packet *hpsb_alloc_packet(size_t data_size)
 {
         struct hpsb_packet *packet = NULL;
         void *data = NULL;
@@ -152,25 +152,23 @@
         }
 
         INIT_LIST_HEAD(&packet->list);
-        sema_init(&packet->state_change, 0);
 	packet->complete_routine = NULL;
 	packet->complete_data = NULL;
         packet->state = hpsb_unused;
         packet->generation = -1;
-        packet->data_be = 1;
 
         return packet;
 }
 
 
 /**
- * free_hpsb_packet - free packet and data associated with it
+ * hpsb_free_packet - free packet and data associated with it
  * @packet: packet to free (is NULL safe)
  *
  * This function will free packet->data, packet->header and finally the packet
  * itself.
  */
-void free_hpsb_packet(struct hpsb_packet *packet)
+void hpsb_free_packet(struct hpsb_packet *packet)
 {
         if (!packet) return;
 
@@ -420,14 +418,12 @@
 
         if (packet->no_waiter) {
                 /* must not have a tlabel allocated */
-                free_hpsb_packet(packet);
+                hpsb_free_packet(packet);
                 return;
         }
 
         if (ackcode != ACK_PENDING || !packet->expect_response) {
                 packet->state = hpsb_complete;
-                up(&packet->state_change);
-                up(&packet->state_change);
                 run_packet_complete(packet);
                 return;
         }
@@ -439,7 +435,6 @@
         list_add_tail(&packet->list, &host->pending_packets);
         spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
 
-        up(&packet->state_change);
 	mod_timer(&host->timeout, jiffies + host->timeout_interval);
 }
 
@@ -465,7 +460,7 @@
 		return -EINVAL;
 	}
 
-	packet = alloc_hpsb_packet(0);
+	packet = hpsb_alloc_packet(0);
 	if (!packet)
 		return -ENOMEM;
 
@@ -485,16 +480,8 @@
 
 	packet->generation = get_hpsb_generation(host);
 
-	if (!hpsb_send_packet(packet)) {
-		retval = -EINVAL;
-		goto fail;
-	}
-
-	down(&packet->state_change);
-	down(&packet->state_change);
-
-fail:
-	free_hpsb_packet(packet);
+	retval = hpsb_send_packet_and_wait(packet);
+	hpsb_free_packet(packet);
 
 	return retval;
 }
@@ -504,23 +491,24 @@
  * @packet: packet to send
  *
  * The packet is sent through the host specified in the packet->host field.
- * Before sending, the packet's transmit speed is automatically determined using
- * the local speed map when it is an async, non-broadcast packet.
+ * Before sending, the packet's transmit speed is automatically determined
+ * using the local speed map when it is an async, non-broadcast packet.
  *
  * Possibilities for failure are that host is either not initialized, in bus
  * reset, the packet's generation number doesn't match the current generation
  * number or the host reports a transmit error.
  *
- * Return value: False (0) on failure, true (1) otherwise.
+ * Return value: 0 on success, negative errno on failure.
  */
 int hpsb_send_packet(struct hpsb_packet *packet)
 {
         struct hpsb_host *host = packet->host;
 
-        if (host->is_shutdown || host->in_bus_reset
-            || (packet->generation != get_hpsb_generation(host))) {
-                return 0;
-        }
+        if (host->is_shutdown)
+		return -EINVAL;
+	if (host->in_bus_reset ||
+	    (packet->generation != get_hpsb_generation(host)))
+                return -EAGAIN;
 
         packet->state = hpsb_queued;
 
@@ -532,23 +520,13 @@
                 data = kmalloc(packet->header_size + packet->data_size, GFP_ATOMIC);
                 if (!data) {
                         HPSB_ERR("unable to allocate memory for concatenating header and data");
-                        return 0;
+                        return -ENOMEM;
                 }
 
                 memcpy(data, packet->header, packet->header_size);
 
                 if (packet->data_size)
-                {
-                        if (packet->data_be) {
-                                memcpy(((u8*)data)+packet->header_size, packet->data, packet->data_size);
-                        } else {
-                                int i;
-                                quadlet_t *my_data=(quadlet_t*) ((u8*) data + packet->data_size);
-                                for (i=0; i < packet->data_size/4; i++) {
-                                        my_data[i] = cpu_to_be32(packet->data[i]);
-                                }
-                        }
-                }
+			memcpy(((u8*)data)+packet->header_size, packet->data, packet->data_size);
 
                 dump_packet("send packet local:", packet->header,
                             packet->header_size);
@@ -558,7 +536,7 @@
 
                 kfree(data);
 
-                return 1;
+                return 0;
         }
 
         if (packet->type == hpsb_async && packet->node_id != ALL_NODES) {
@@ -584,10 +562,33 @@
         return host->driver->transmit_packet(host, packet);
 }
 
+/* We could just use complete() directly as the packet complete
+ * callback, but this is more typesafe, in the sense that we get a
+ * compiler error if the prototype for complete() changes. */
+
+static void complete_packet(void *data)
+{
+	complete((struct completion *) data);
+}
+
+int hpsb_send_packet_and_wait(struct hpsb_packet *packet)
+{
+	struct completion done;
+	int retval;
+
+	init_completion(&done);
+	hpsb_set_packet_complete_task(packet, complete_packet, &done);
+	retval = hpsb_send_packet(packet);
+	if (retval == 0)
+		wait_for_completion(&done);
+
+	return retval;
+}
+
 static void send_packet_nocare(struct hpsb_packet *packet)
 {
-        if (!hpsb_send_packet(packet)) {
-                free_hpsb_packet(packet);
+        if (hpsb_send_packet(packet) < 0) {
+                hpsb_free_packet(packet);
         }
 }
 
@@ -668,7 +669,6 @@
         }
 
         packet->state = hpsb_complete;
-        up(&packet->state_change);
 	run_packet_complete(packet);
 }
 
@@ -680,7 +680,7 @@
 
         dsize += (dsize % 4 ? 4 - (dsize % 4) : 0);
 
-        p = alloc_hpsb_packet(dsize);
+        p = hpsb_alloc_packet(dsize);
         if (p == NULL) {
                 /* FIXME - send data_error response */
                 return NULL;
@@ -820,6 +820,8 @@
                 if (rcode >= 0) {
                         fill_async_readblock_resp(packet, rcode, length);
                         send_packet_nocare(packet);
+                } else {
+                        hpsb_free_packet(packet);
                 }
                 break;
 
@@ -874,7 +876,7 @@
                 if (rcode >= 0) {
                         send_packet_nocare(packet);
                 } else {
-                        free_hpsb_packet(packet);
+                        hpsb_free_packet(packet);
                 }
                 break;
         }
@@ -949,7 +951,6 @@
                 list_del(&packet->list);
                 packet->state = hpsb_complete;
                 packet->ack_code = ACKX_ABORTED;
-                up(&packet->state_change);
 		run_packet_complete(packet);
         }
 }
@@ -987,7 +988,6 @@
                 list_del(&packet->list);
                 packet->state = hpsb_complete;
                 packet->ack_code = ACKX_TIMEOUT;
-                up(&packet->state_change);
 		run_packet_complete(packet);
         }
 }
@@ -1171,19 +1171,22 @@
 
 static int __init ieee1394_init(void)
 {
-	hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
-					      0, 0, NULL, NULL);
-
 	devfs_mk_dir("ieee1394");
-
 	if (register_chrdev(IEEE1394_MAJOR, "ieee1394", &ieee1394_chardev_ops)) {
 		HPSB_ERR("unable to register character device major %d!\n", IEEE1394_MAJOR);
-		devfs_remove("ieee1394");
 		return -ENODEV;
 	}
 
+	devfs_mk_dir("ieee1394");
+
+	hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
+					      0, 0, NULL, NULL);
+
+	bus_register(&ieee1394_bus_type);
+
 	init_hpsb_highlevel();
 	init_csr();
+
 	if (!disable_nodemgr)
 		init_ieee1394_nodemgr();
 	else
@@ -1198,6 +1201,9 @@
 		cleanup_ieee1394_nodemgr();
 
 	cleanup_csr();
+
+	bus_unregister(&ieee1394_bus_type);
+
 	kmem_cache_destroy(hpsb_packet_cache);
 
 	unregister_chrdev(IEEE1394_MAJOR, "ieee1394");
@@ -1213,16 +1219,15 @@
 EXPORT_SYMBOL(hpsb_alloc_host);
 EXPORT_SYMBOL(hpsb_add_host);
 EXPORT_SYMBOL(hpsb_remove_host);
-EXPORT_SYMBOL(hpsb_ref_host);
-EXPORT_SYMBOL(hpsb_unref_host);
 
 /** ieee1394_core.c **/
 EXPORT_SYMBOL(hpsb_speedto_str);
 EXPORT_SYMBOL(hpsb_set_packet_complete_task);
-EXPORT_SYMBOL(alloc_hpsb_packet);
-EXPORT_SYMBOL(free_hpsb_packet);
+EXPORT_SYMBOL(hpsb_alloc_packet);
+EXPORT_SYMBOL(hpsb_free_packet);
 EXPORT_SYMBOL(hpsb_send_phy_config);
 EXPORT_SYMBOL(hpsb_send_packet);
+EXPORT_SYMBOL(hpsb_send_packet_and_wait);
 EXPORT_SYMBOL(hpsb_reset_bus);
 EXPORT_SYMBOL(hpsb_bus_reset);
 EXPORT_SYMBOL(hpsb_selfid_received);
@@ -1282,6 +1287,7 @@
 EXPORT_SYMBOL(hpsb_register_protocol);
 EXPORT_SYMBOL(hpsb_unregister_protocol);
 EXPORT_SYMBOL(ieee1394_bus_type);
+EXPORT_SYMBOL(nodemgr_for_each_host);
 
 /** csr.c **/
 EXPORT_SYMBOL(hpsb_update_config_rom);
diff -Nru a/drivers/ieee1394/ieee1394_core.h b/drivers/ieee1394/ieee1394_core.h
--- a/drivers/ieee1394/ieee1394_core.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/ieee1394_core.h	Thu Jan  8 23:00:23 2004
@@ -40,11 +40,6 @@
         unsigned expect_response:1;
         unsigned no_waiter:1;
 
-        /* Data big endianness flag - may vary from request to request.  The
-         * header is always in machine byte order.
-         * Not really used currently.  */
-        unsigned data_be:1;
-
         /* Speed to transmit with: 0 = 100Mbps, 1 = 200Mbps, 2 = 400Mbps */
         unsigned speed_code:2;
 
@@ -64,9 +59,6 @@
         struct hpsb_host *host;
         unsigned int generation;
 
-        /* Very core internal, don't care. */
-        struct semaphore state_change;
-
 	/* Function (and possible data to pass to it) to call when this
 	 * packet is completed.  */
 	void (*complete_routine)(void *);
@@ -90,8 +82,8 @@
 void abort_timedouts(unsigned long __opaque);
 void abort_requests(struct hpsb_host *host);
 
-struct hpsb_packet *alloc_hpsb_packet(size_t data_size);
-void free_hpsb_packet(struct hpsb_packet *packet);
+struct hpsb_packet *hpsb_alloc_packet(size_t data_size);
+void hpsb_free_packet(struct hpsb_packet *packet);
 
 
 /*
@@ -108,14 +100,22 @@
 }
 
 /*
- * Send a PHY configuration packet.
+ * Send a PHY configuration packet, return 0 on success, negative
+ * errno on failure.
  */
 int hpsb_send_phy_config(struct hpsb_host *host, int rootid, int gapcnt);
 
 /*
- * Queue packet for transmitting, return 0 for failure.
+ * Queue packet for transmitting, return 0 on success, negative errno
+ * on failure.
  */
 int hpsb_send_packet(struct hpsb_packet *packet);
+
+/*
+ * Queue packet for transmitting, and block until the transaction
+ * completes. Return 0 on success, negative errno on failure.
+ */
+int hpsb_send_packet_and_wait(struct hpsb_packet *packet);
 
 /* Initiate bus reset on the given host.  Returns 1 if bus reset already in
  * progress, 0 otherwise. */
diff -Nru a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c
--- a/drivers/ieee1394/ieee1394_transactions.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/ieee1394_transactions.c	Thu Jan  8 23:00:23 2004
@@ -263,7 +263,7 @@
 	if (length == 0)
 		return NULL;
 
-	packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
+	packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
 	if (!packet)
 		return NULL;
 
@@ -271,7 +271,7 @@
 	packet->node_id = node;
 
 	if (hpsb_get_tlabel(packet)) {
-		free_hpsb_packet(packet);
+		hpsb_free_packet(packet);
 		return NULL;
 	}
 
@@ -291,7 +291,7 @@
 	if (length == 0)
 		return NULL;
 
-	packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
+	packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
 	if (!packet)
 		return NULL;
 
@@ -302,7 +302,7 @@
 	packet->node_id = node;
 
 	if (hpsb_get_tlabel(packet)) {
-		free_hpsb_packet(packet);
+		hpsb_free_packet(packet);
 		return NULL;
 	}
 
@@ -325,7 +325,7 @@
 	if (length == 0)
 		return NULL;
 
-	packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
+	packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
 	if (!packet)
 		return NULL;
 
@@ -335,7 +335,7 @@
 	packet->host = host;
     
 	if (hpsb_get_tlabel(packet)) {
-		free_hpsb_packet(packet);
+		hpsb_free_packet(packet);
 		return NULL;
 	}
 
@@ -353,13 +353,13 @@
 	struct hpsb_packet *p;
 	u32 length;
 
-	p = alloc_hpsb_packet(8);
+	p = hpsb_alloc_packet(8);
 	if (!p) return NULL;
 
 	p->host = host;
 	p->node_id = node;
 	if (hpsb_get_tlabel(p)) {
-		free_hpsb_packet(p);
+		hpsb_free_packet(p);
 		return NULL;
 	}
 
@@ -390,13 +390,13 @@
 	struct hpsb_packet *p;
 	u32 length;
 
-	p = alloc_hpsb_packet(16);
+	p = hpsb_alloc_packet(16);
 	if (!p) return NULL;
 
 	p->host = host;
 	p->node_id = node;
 	if (hpsb_get_tlabel(p)) {
-		free_hpsb_packet(p);
+		hpsb_free_packet(p);
 		return NULL;
 	}
 
@@ -429,7 +429,7 @@
 {
         struct hpsb_packet *p; 
 
-        p = alloc_hpsb_packet(0); 
+        p = hpsb_alloc_packet(0); 
         if (!p) return NULL; 
 
         p->host = host; 
@@ -444,7 +444,7 @@
 {
 	struct hpsb_packet *p;
 
-	p = alloc_hpsb_packet(length);
+	p = hpsb_alloc_packet(length);
 	if (!p) return NULL;
 
 	p->host = host;
@@ -478,13 +478,10 @@
         }
 
 	packet->generation = generation;
-        if (!hpsb_send_packet(packet)) {
-		retval = -EINVAL;
+        retval = hpsb_send_packet_and_wait(packet);
+	if (retval < 0)
 		goto hpsb_read_fail;
-	}
 
-        down(&packet->state_change);
-        down(&packet->state_change);
         retval = hpsb_packet_success(packet);
 
         if (retval == 0) {
@@ -497,7 +494,7 @@
 
 hpsb_read_fail:
         hpsb_free_tlabel(packet);
-        free_hpsb_packet(packet);
+        hpsb_free_packet(packet);
 
         return retval;
 }
@@ -520,18 +517,15 @@
 		return -ENOMEM;
 
 	packet->generation = generation;
-        if (!hpsb_send_packet(packet)) {
-		retval = -EINVAL;
+        retval = hpsb_send_packet_and_wait(packet);
+	if (retval < 0)
 		goto hpsb_write_fail;
-	}
 
-        down(&packet->state_change);
-        down(&packet->state_change);
         retval = hpsb_packet_success(packet);
 
 hpsb_write_fail:
         hpsb_free_tlabel(packet);
-        free_hpsb_packet(packet);
+        hpsb_free_packet(packet);
 
         return retval;
 }
@@ -550,12 +544,10 @@
                 return -ENOMEM;
 
 	packet->generation = generation;
-        if (!hpsb_send_packet(packet)) {
-		retval = -EINVAL;
+        retval = hpsb_send_packet_and_wait(packet);
+	if (retval < 0)
 		goto hpsb_lock_fail;
-	}
-        down(&packet->state_change);
-        down(&packet->state_change);
+
         retval = hpsb_packet_success(packet);
 
         if (retval == 0) {
@@ -564,7 +556,7 @@
 
 hpsb_lock_fail:
         hpsb_free_tlabel(packet);
-        free_hpsb_packet(packet);
+        hpsb_free_packet(packet);
 
         return retval;
 }
@@ -582,12 +574,10 @@
 		return -ENOMEM;
 
 	packet->generation = generation;
-	if (!hpsb_send_packet(packet)) {
-		retval = -EINVAL;
+	retval = hpsb_send_packet_and_wait(packet);
+	if (retval < 0)
 		goto hpsb_lock64_fail;
-	}
-	down(&packet->state_change);
-	down(&packet->state_change);
+
 	retval = hpsb_packet_success(packet);
 
 	if (retval == 0)
@@ -595,7 +585,7 @@
 
 hpsb_lock64_fail:
 	hpsb_free_tlabel(packet);
-	free_hpsb_packet(packet);
+	hpsb_free_packet(packet);
 
         return retval;
 }
@@ -626,10 +616,9 @@
 
 	packet->no_waiter = 1;
 
-	if (!hpsb_send_packet(packet)) {
-		free_hpsb_packet(packet);
-		retval = -EINVAL;
-	}
+	retval = hpsb_send_packet(packet);
+	if (retval < 0)
+		hpsb_free_packet(packet);
 
 	return retval;
 }
diff -Nru a/drivers/ieee1394/iso.c b/drivers/ieee1394/iso.c
--- a/drivers/ieee1394/iso.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/iso.c	Thu Jan  8 23:00:24 2004
@@ -40,6 +40,7 @@
 					     unsigned int data_buf_size,
 					     unsigned int buf_packets,
 					     int channel,
+					     int dma_mode,
 					     int irq_interval,
 					     void (*callback)(struct hpsb_iso*))
 {
@@ -58,8 +59,13 @@
 	if (buf_packets < 2)
 		buf_packets = 2;
 
-	if (irq_interval < 1 || irq_interval > buf_packets / 2)
-		irq_interval = buf_packets / 2;
+	if ((dma_mode < HPSB_ISO_DMA_DEFAULT) || (dma_mode > HPSB_ISO_DMA_PACKET_PER_BUFFER))
+		dma_mode=HPSB_ISO_DMA_DEFAULT;
+
+	if (irq_interval == 0)     /* really interrupt for each packet*/
+		irq_interval = 1;
+	else if ((irq_interval < 0) || (irq_interval > buf_packets / 4))
+ 		irq_interval = buf_packets / 4;
 
 	if (channel < -1 || channel >= 64)
 		return NULL;
@@ -83,6 +89,7 @@
 	init_waitqueue_head(&iso->waitq);
 	iso->channel = channel;
 	iso->irq_interval = irq_interval;
+	iso->dma_mode = dma_mode;
 	dma_region_init(&iso->data_buf);
 	iso->buf_size = round_up_to_page(data_buf_size);
 	iso->buf_packets = buf_packets;
@@ -136,7 +143,7 @@
 {
 	struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_XMIT,
 						    data_buf_size, buf_packets,
-						    channel, irq_interval, callback);
+						    channel, HPSB_ISO_DMA_DEFAULT, irq_interval, callback);
 	if (!iso)
 		return NULL;
 
@@ -158,12 +165,13 @@
 				    unsigned int data_buf_size,
 				    unsigned int buf_packets,
 				    int channel,
+				    int dma_mode,
 				    int irq_interval,
 				    void (*callback)(struct hpsb_iso*))
 {
 	struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_RECV,
 						    data_buf_size, buf_packets,
-						    channel, irq_interval, callback);
+						    channel, dma_mode, irq_interval, callback);
 	if (!iso)
 		return NULL;
 
diff -Nru a/drivers/ieee1394/iso.h b/drivers/ieee1394/iso.h
--- a/drivers/ieee1394/iso.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/iso.h	Thu Jan  8 23:00:24 2004
@@ -51,6 +51,14 @@
 
 enum hpsb_iso_type { HPSB_ISO_RECV = 0, HPSB_ISO_XMIT = 1 };
 
+/* The mode of the dma when receiving iso data. Must be supported by chip */
+enum raw1394_iso_dma_recv_mode {
+	HPSB_ISO_DMA_DEFAULT = -1,
+	HPSB_ISO_DMA_OLD_ABI = 0,
+	HPSB_ISO_DMA_BUFFERFILL = 1,
+	HPSB_ISO_DMA_PACKET_PER_BUFFER = 2
+};
+
 struct hpsb_iso {
 	enum hpsb_iso_type type;
 
@@ -68,6 +76,8 @@
 
 	int speed; /* IEEE1394_SPEED_100, 200, or 400 */
 	int channel; /* -1 if multichannel */
+	int dma_mode; /* dma receive mode */
+
 
 	/* greatest # of packets between interrupts - controls
 	   the maximum latency of the buffer */
@@ -139,6 +149,7 @@
 				    unsigned int data_buf_size,
 				    unsigned int buf_packets,
 				    int channel,
+				    int dma_mode,
 				    int irq_interval,
 				    void (*callback)(struct hpsb_iso*));
 
diff -Nru a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
--- a/drivers/ieee1394/nodemgr.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/nodemgr.c	Thu Jan  8 23:00:24 2004
@@ -516,8 +516,7 @@
 	.driver_data	= &nodemgr_driverdata_ne,
 };
 
-
-static struct device nodemgr_dev_template_host = {
+struct device nodemgr_dev_template_host = {
 	.bus		= &ieee1394_bus_type,
 	.release	= nodemgr_release_host,
 	.driver		= &nodemgr_driver_host,
@@ -1255,36 +1254,6 @@
 }
 
 
-/* Searches the list of ud's that match a ne as the parent. If the ud has
- * a driver associated with it, we call that driver's update function
- * with the ud as the argument. */
-static int nodemgr_driver_search_cb(struct device *dev, void *__data)
-{
-	struct node_entry *ne = __data;
-	struct unit_directory *ud;
-
-	if (dev->driver_data == &nodemgr_driverdata_ne ||
-	    dev->driver_data == &nodemgr_driverdata_host)
-		return 0;
-
-	ud = container_of(dev, struct unit_directory, device);
-
-	if (&ne->device != ud->device.parent)
-		return 0;
-
-	if (ud->device.driver) {
-		struct hpsb_protocol_driver *pdrv;
-
-		pdrv = container_of(ud->device.driver,
-				struct hpsb_protocol_driver, driver);
-
-		if (pdrv->update)
-			pdrv->update(ud);
-	}
-
-	return 0;
-}
-
 /*
  * This function updates nodes that were present on the bus before the
  * reset and still are after the reset.  The nodeid and the config rom
@@ -1480,9 +1449,24 @@
 		ne->needs_probe = 0;
 		return 1;
 	} else {
+		struct list_head *lh;
+
 		/* Update unit_dirs with attached drivers */
-		bus_for_each_dev(&ieee1394_bus_type, NULL, ne,
-				 nodemgr_driver_search_cb);
+		list_for_each(lh, &dev->children) {
+			struct unit_directory *ud;
+			
+			ud = container_of(list_to_dev(lh), struct unit_directory, device);
+
+			if (ud->device.driver) {
+				struct hpsb_protocol_driver *pdrv;
+
+				pdrv = container_of(ud->device.driver,
+						    struct hpsb_protocol_driver, driver);
+
+				if (pdrv->update)
+					pdrv->update(ud);
+			}
+		}
 	}
 	return 0;
 }
@@ -1664,7 +1648,6 @@
 	allow_signal(SIGTERM);
 
 	/* Setup our device-model entries */
-	device_register(&host->device);
 	nodemgr_create_host_dev_files(host);
 
 	/* Sit and wait for a signal to probe the nodes on the bus. This
@@ -1753,6 +1736,34 @@
 	return ne;
 }
 
+struct for_each_host_struct {
+	int (*cb)(struct hpsb_host *, void *);
+	void *data;
+};
+
+static int nodemgr_for_each_host_cb(struct device *dev, void *__data)
+{
+	struct for_each_host_struct *host_data = __data;
+	struct hpsb_host *host;
+
+	if (dev->driver_data != &nodemgr_driverdata_host)
+		return 0;
+
+	host = container_of(dev, struct hpsb_host, device);
+
+	return host_data->cb(host, host_data->data);
+}
+
+int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *))
+{
+	struct for_each_host_struct host_data;
+
+	host_data.cb = cb;
+	host_data.data = __data;
+
+	return bus_for_each_dev(&ieee1394_bus_type, NULL, &host_data, nodemgr_for_each_host_cb);
+}
+
 /* The following four convenience functions use a struct node_entry
  * for addressing a node on the bus.  They are intended for use by any
  * process context, not just the nodemgr thread, so we need to be a
@@ -1821,11 +1832,6 @@
 	init_completion(&hi->exited);
         sema_init(&hi->reset_sem, 0);
 
-	memcpy(&host->device, &nodemgr_dev_template_host,
-	       sizeof(host->device));
-	host->device.parent = &host->pdev->dev;
-	snprintf(host->device.bus_id, BUS_ID_SIZE, "fw-host%d", host->id);
-
 	sprintf(hi->daemon_name, "knodemgrd_%d", host->id);
 
 	hi->pid = kernel_thread(nodemgr_host_thread, hi, CLONE_KERNEL);
@@ -1879,7 +1885,6 @@
 
 void init_ieee1394_nodemgr(void)
 {
-	bus_register(&ieee1394_bus_type);
 	driver_register(&nodemgr_driver_host);
 	driver_register(&nodemgr_driver_ne);
 
@@ -1892,5 +1897,4 @@
 
 	driver_unregister(&nodemgr_driver_ne);
 	driver_unregister(&nodemgr_driver_host);
-	bus_unregister(&ieee1394_bus_type);
 }
diff -Nru a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h
--- a/drivers/ieee1394/nodemgr.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/nodemgr.h	Thu Jan  8 23:00:24 2004
@@ -219,7 +219,16 @@
 		   int extcode, quadlet_t *data, quadlet_t arg);
 
 
+/* Iterate the hosts, calling a given function with supplied data for each
+ * host. */
+int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *));
+
+
 void init_ieee1394_nodemgr(void);
 void cleanup_ieee1394_nodemgr(void);
+
+
+/* The template for a host device */
+extern struct device nodemgr_dev_template_host;
 
 #endif /* _IEEE1394_NODEMGR_H */
diff -Nru a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
--- a/drivers/ieee1394/ohci1394.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/ieee1394/ohci1394.c	Thu Jan  8 23:00:24 2004
@@ -134,7 +134,7 @@
 
 #ifdef OHCI1394_DEBUG
 #define DBGMSG(card, fmt, args...) \
-printk(KERN_INFO "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
+printk(KERN_INFO "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
 #else
 #define DBGMSG(card, fmt, args...)
 #endif
@@ -158,10 +158,10 @@
 
 /* print card specific information */
 #define PRINT(level, card, fmt, args...) \
-printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
+printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
 
 static char version[] __devinitdata =
-	"$Rev: 1045 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1087 $ Ben Collins <bcollins@debian.org>";
 
 /* Module Parameters */
 static int phys_dma = 1;
@@ -845,7 +845,7 @@
 		PRINT(KERN_ERR, ohci->id, 
 		      "Transmit packet size %Zd is too big",
 		      packet->data_size);
-		return 0;
+		return -EOVERFLOW;
 	}
 
 	/* Decide whether we have an iso, a request, or a response packet */
@@ -862,7 +862,7 @@
 			if (in_interrupt()) {
 				PRINT(KERN_ERR, ohci->id, 
 				      "legacy IT context cannot be initialized during interrupt");
-				return 0;
+				return -EINVAL;
 			}
 
 			if (alloc_dma_trm_ctx(ohci, &ohci->it_legacy_context,
@@ -870,7 +870,7 @@
 					      OHCI1394_IsoXmitContextBase) < 0) {
 				PRINT(KERN_ERR, ohci->id, 
 				      "error initializing legacy IT context");
-				return 0;
+				return -ENOMEM;
 			}
 
 			initialize_dma_trm_ctx(&ohci->it_legacy_context);
@@ -890,7 +890,7 @@
 
 	spin_unlock_irqrestore(&d->lock,flags);
 
-	return 1;
+	return 0;
 }
 
 static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
@@ -1113,8 +1113,8 @@
 	struct ohci1394_iso_tasklet task;
 	int task_active;
 
-	enum { BUFFER_FILL_MODE,
-	       PACKET_PER_BUFFER_MODE } dma_mode;
+	enum { BUFFER_FILL_MODE = 0,
+	       PACKET_PER_BUFFER_MODE = 1 } dma_mode;
 
 	/* memory and PCI mapping for the DMA descriptors */
 	struct dma_prog_region prog;
@@ -1175,7 +1175,8 @@
 	/* use buffer-fill mode, unless irq_interval is 1
 	   (note: multichannel requires buffer-fill) */
 
-	if (iso->irq_interval == 1 && iso->channel != -1) {
+	if (((iso->irq_interval == 1 && iso->dma_mode == HPSB_ISO_DMA_OLD_ABI) ||
+	     iso->dma_mode == HPSB_ISO_DMA_PACKET_PER_BUFFER) && iso->channel != -1) {
 		recv->dma_mode = PACKET_PER_BUFFER_MODE;
 	} else {
 		recv->dma_mode = BUFFER_FILL_MODE;
@@ -1194,8 +1195,11 @@
 		}
 
 		/* iso->irq_interval is in packets - translate that to blocks */
-		/* (err, sort of... 1 is always the safest value) */
-		recv->block_irq_interval = iso->irq_interval / recv->nblocks;
+		if (iso->irq_interval == 1)
+			recv->block_irq_interval = 1;			
+		else
+			recv->block_irq_interval = iso->irq_interval *
+							((recv->nblocks+1)/iso->buf_packets);
 		if (recv->block_irq_interval*4 > recv->nblocks)
 			recv->block_irq_interval = recv->nblocks/4;
 		if (recv->block_irq_interval < 1)
@@ -1205,6 +1209,10 @@
 		int max_packet_size;
 
 		recv->nblocks = iso->buf_packets;
+		recv->block_irq_interval = iso->irq_interval;
+		if (recv->block_irq_interval * 4 > iso->buf_packets)
+			recv->block_irq_interval = iso->buf_packets / 4;
+		if (recv->block_irq_interval < 1)
 		recv->block_irq_interval = 1;
 
 		/* choose a buffer stride */
@@ -3271,7 +3279,6 @@
 static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
 					const struct pci_device_id *ent)
 {
-	static unsigned int card_id_counter = 0;
 	static int version_printed = 0;
 
 	struct hpsb_host *host;
@@ -3282,15 +3289,14 @@
 		PRINT_G(KERN_INFO, "%s", version);
 
         if (pci_enable_device(dev))
-		FAIL(-ENXIO, "Failed to enable OHCI hardware %d",
-		        card_id_counter++);
+		FAIL(-ENXIO, "Failed to enable OHCI hardware");
         pci_set_master(dev);
 
-	host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci));
+	host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci), &dev->dev);
 	if (!host) FAIL(-ENOMEM, "Failed to allocate host structure");
 
 	ohci = host->hostdata;
-	ohci->id = card_id_counter++;
+	ohci->id = host->id;
 	ohci->dev = dev;
 	ohci->host = host;
 	ohci->init_state = OHCI_INIT_ALLOC_HOST;
@@ -3462,11 +3468,14 @@
 static void ohci1394_pci_remove(struct pci_dev *pdev)
 {
 	struct ti_ohci *ohci;
+	struct device *dev;
 
 	ohci = pci_get_drvdata(pdev);
 	if (!ohci)
 		return;
 
+	dev = get_device(&ohci->host->device);
+
 	switch (ohci->init_state) {
 	case OHCI_INIT_DONE:
 		hpsb_remove_host(ohci->host);
@@ -3489,7 +3498,7 @@
 
 		/* Disable IRM Contender */
 		set_phy_reg(ohci, 4, ~0xc0 & get_phy_reg(ohci, 4));
-		
+
 		/* Clear link control register */
 		reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);
 
@@ -3521,7 +3530,7 @@
 				    ohci->selfid_buf_cpu,
 				    ohci->selfid_buf_bus);
 		OHCI_DMA_FREE("consistent selfid_buf");
-		
+
 	case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER:
 		pci_free_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN,
 				    ohci->csr_config_rom_cpu,
@@ -3555,8 +3564,10 @@
 
 	case OHCI_INIT_ALLOC_HOST:
 		pci_set_drvdata(ohci->dev, NULL);
-		hpsb_unref_host(ohci->host);
 	}
+
+	if (dev)
+		put_device(dev);
 }
 
 
diff -Nru a/drivers/ieee1394/oui.db b/drivers/ieee1394/oui.db
--- a/drivers/ieee1394/oui.db	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/oui.db	Thu Jan  8 23:00:23 2004
@@ -1612,7 +1612,7 @@
 000658 Helmut Fischer GmbH & Co. KG
 000659 EAL (Apeldoorn) B.V.
 00065A Strix Systems
-00065B Dell Inc.
+00065B Dell Computer Corp.
 00065C Malachite Technologies, Inc.
 00065D Heidelberg Web Systems
 00065E Photuris, Inc.
@@ -3965,7 +3965,7 @@
 00B0C2 Cisco Systems, Inc.
 00B0C7 Tellabs Operations, Inc.
 00B0CE TECHNOLOGY RESCUE
-00B0D0 Dell Inc.
+00B0D0 Dell Computer Corp.
 00B0DB Nextcell, Inc.
 00B0DF Reliable Data Technology, Inc.
 00B0E7 British Federal Ltd.
@@ -4054,7 +4054,7 @@
 00C04C DEPARTMENT OF FOREIGN AFFAIRS
 00C04D MITEC, INC.
 00C04E COMTROL CORPORATION
-00C04F Dell Inc.
+00C04F DELL COMPUTER CORPORATION
 00C050 TOYO DENKI SEIZO K.K.
 00C051 ADVANCED INTEGRATION RESEARCH
 00C052 BURR-BROWN
diff -Nru a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c
--- a/drivers/ieee1394/pcilynx.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/pcilynx.c	Thu Jan  8 23:00:23 2004
@@ -521,10 +521,6 @@
                 break;
         }                
 
-        if (!packet->data_be) {
-                pcl.buffer[1].control |= PCL_BIGENDIAN;
-        }
-
         put_pcl(lynx, d->pcl, &pcl);
         run_pcl(lynx, d->pcl_start, d->channel);
 }
@@ -540,7 +536,7 @@
         if (packet->data_size >= 4096) {
                 PRINT(KERN_ERR, lynx->id, "transmit packet data too big (%Zd)",
                       packet->data_size);
-                return 0;
+                return -EOVERFLOW;
         }
 
         switch (packet->type) {
@@ -554,7 +550,7 @@
         default:
                 PRINT(KERN_ERR, lynx->id, "invalid packet type %d",
                       packet->type);
-                return 0;
+                return -EINVAL;
         }
 
         if (packet->tcode == TCODE_WRITEQ
@@ -570,7 +566,7 @@
 
         spin_unlock_irqrestore(&d->queue_lock, flags);
 
-        return 1;
+        return 0;
 }
 
 
@@ -1120,7 +1116,7 @@
         retval = copy_to_user(buffer, md->lynx->mem_dma_buffer, count);
         up(&md->lynx->mem_dma_mutex);
 
-        if (retval < 0) return retval;
+	if (retval) return -EFAULT;
         *offset += count;
         return count;
 }
@@ -1141,14 +1137,17 @@
         /* FIXME: dereferencing pointers to PCI mem doesn't work everywhere */
         switch (md->type) {
         case aux:
-                copy_from_user(md->lynx->aux_port+(*offset), buffer, count);
+		if (copy_from_user(md->lynx->aux_port+(*offset), buffer, count))
+			return -EFAULT;
                 break;
         case ram:
-                copy_from_user(md->lynx->local_ram+(*offset), buffer, count);
+		if (copy_from_user(md->lynx->local_ram+(*offset), buffer, count))
+			return -EFAULT;
                 break;
         case rom:
                 /* the ROM may be writeable */
-                copy_from_user(md->lynx->local_rom+(*offset), buffer, count);
+		if (copy_from_user(md->lynx->local_rom+(*offset), buffer, count))
+			return -EFAULT;
                 break;
         }
 
@@ -1443,12 +1442,15 @@
 static void remove_card(struct pci_dev *dev)
 {
         struct ti_lynx *lynx;
+	struct device *lynx_dev;
         int i;
 
         lynx = pci_get_drvdata(dev);
         if (!lynx) return;
         pci_set_drvdata(dev, NULL);
 
+	lynx_dev = get_device(&lynx->host->device);
+
         switch (lynx->state) {
         case is_host:
                 reg_write(lynx, PCI_INT_ENABLE, 0);
@@ -1498,7 +1500,9 @@
         }
 
 	tasklet_kill(&lynx->iso_rcv.tq);
-	hpsb_unref_host(lynx->host);
+
+	if (lynx_dev)
+		put_device(lynx_dev);
 }
 
 
@@ -1535,7 +1539,7 @@
 
         error = -ENOMEM;
 
-	host = hpsb_alloc_host(&lynx_driver, sizeof(struct ti_lynx));
+	host = hpsb_alloc_host(&lynx_driver, sizeof(struct ti_lynx), &dev->dev);
         if (!host) FAIL("failed to allocate control structure memory");
 
         lynx = host->hostdata;
diff -Nru a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c
--- a/drivers/ieee1394/raw1394.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/raw1394.c	Thu Jan  8 23:00:23 2004
@@ -128,7 +128,7 @@
         } else if (req->free_data) {
                 kfree(req->data);
         }
-        free_hpsb_packet(req->packet);
+        hpsb_free_packet(req->packet);
         kfree(req);
 }
 
@@ -558,7 +558,7 @@
                                 lh = lh->next;
                         }
                         hi = list_entry(lh, struct host_info, list);
-                        hpsb_ref_host(hi->host); // XXX Need to handle failure case
+			get_device(&hi->host->device); // XXX Need to handle failure case
                         list_add_tail(&fi->list, &hi->file_info_list);
                         fi->host = hi->host;
                         fi->state = connected;
@@ -782,7 +782,7 @@
 
 	packet->generation = req->req.generation;
 
-        if (!hpsb_send_packet(packet)) {
+        if (hpsb_send_packet(packet) < 0) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
                 req->req.length = 0;
                 hpsb_free_tlabel(packet);
@@ -823,7 +823,7 @@
 	/* Update the generation of the packet just before sending. */
 	packet->generation = req->req.generation;
 
-        if (!hpsb_send_packet(packet)) {
+        if (hpsb_send_packet(packet) < 0) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
                 queue_complete_req(req);
         }
@@ -846,7 +846,7 @@
                 return sizeof(struct raw1394_request);
         } 
 
-        packet = alloc_hpsb_packet(req->req.length-header_length);
+        packet = hpsb_alloc_packet(req->req.length-header_length);
         req->packet = packet;
         if (!packet) return -ENOMEM;
 
@@ -885,7 +885,7 @@
         /* Update the generation of the packet just before sending. */
         packet->generation = req->req.generation;
 
-        if (!hpsb_send_packet(packet)) {
+        if (hpsb_send_packet(packet) < 0) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
                 queue_complete_req(req);
         }
@@ -1797,6 +1797,106 @@
         return sizeof(struct raw1394_request);
 }
 
+/* Copy data from ARM buffer(s) to user buffer. */
+static int arm_get_buf(struct file_info *fi, struct pending_request *req)
+{
+	struct arm_addr  *arm_addr = NULL;
+	unsigned long flags;
+	unsigned long offset;
+
+	struct list_head *entry;
+
+	DBGMSG("arm_get_buf "
+	       "addr(Offset): %04X %08X length: %u",
+	       (u32) ((req->req.address >> 32) & 0xFFFF),
+	       (u32) (req->req.address & 0xFFFFFFFF),
+	       (u32) req->req.length);
+
+	spin_lock_irqsave(&host_info_lock, flags);
+	entry = fi->addr_list.next;
+	while (entry != &(fi->addr_list)) {
+		arm_addr = list_entry(entry, struct arm_addr, addr_list);
+		if ((arm_addr->start <= req->req.address) &&
+		    (arm_addr->end > req->req.address)) {
+			if (req->req.address + req->req.length <= arm_addr->end) {
+				offset = req->req.address - arm_addr->start;
+
+				DBGMSG("arm_get_buf copy_to_user( %08X, %08X, %u )",
+				       (u32) req->req.recvb,
+				       (u32) (arm_addr->addr_space_buffer+offset),
+				       (u32) req->req.length);
+
+				if (copy_to_user(int2ptr(req->req.recvb), arm_addr->addr_space_buffer+offset, req->req.length)) {
+					spin_unlock_irqrestore(&host_info_lock, flags);
+					return (-EFAULT);
+				}
+
+				spin_unlock_irqrestore(&host_info_lock, flags);
+				free_pending_request(req); /* we have to free the request, because we queue no response, and therefore nobody will free it */
+				return sizeof(struct raw1394_request);
+			} else {
+				DBGMSG("arm_get_buf request exceeded mapping");
+				spin_unlock_irqrestore(&host_info_lock, flags);
+				return (-EINVAL);
+			}
+		}
+		entry = entry->next;
+	}
+	spin_unlock_irqrestore(&host_info_lock, flags);
+	return (-EINVAL);
+}
+
+
+/* Copy data from user buffer to ARM buffer(s). */
+static int arm_set_buf(struct file_info *fi, struct pending_request *req)
+{
+	struct arm_addr  *arm_addr = NULL;
+	unsigned long flags;
+	unsigned long offset;
+
+	struct list_head *entry;
+
+	DBGMSG("arm_set_buf "
+	       "addr(Offset): %04X %08X length: %u",
+	       (u32) ((req->req.address >> 32) & 0xFFFF),
+	       (u32) (req->req.address & 0xFFFFFFFF),
+	       (u32) req->req.length);
+
+
+	spin_lock_irqsave(&host_info_lock, flags);
+	entry = fi->addr_list.next;
+	while (entry != &(fi->addr_list)) {
+		arm_addr = list_entry(entry, struct arm_addr, addr_list);
+		if ((arm_addr->start <= req->req.address) &&
+		    (arm_addr->end > req->req.address)) {
+			if (req->req.address + req->req.length <= arm_addr->end) {
+				offset = req->req.address - arm_addr->start;
+
+				DBGMSG("arm_set_buf copy_from_user( %08X, %08X, %u )",
+				       (u32) (arm_addr->addr_space_buffer+offset),
+				       (u32) req->req.sendb,
+				       (u32) req->req.length);
+
+				if (copy_from_user(arm_addr->addr_space_buffer+offset, int2ptr(req->req.sendb), req->req.length)) {
+					spin_unlock_irqrestore(&host_info_lock, flags);
+					return (-EFAULT);
+				}
+
+				spin_unlock_irqrestore(&host_info_lock, flags);
+				free_pending_request(req); /* we have to free the request, because we queue no response, and therefore nobody will free it */
+				return sizeof(struct raw1394_request);
+			} else {
+				DBGMSG("arm_set_buf request exceeded mapping");
+				spin_unlock_irqrestore(&host_info_lock, flags);
+				return (-EINVAL);
+			}
+		}
+		entry = entry->next;
+	}
+	spin_unlock_irqrestore(&host_info_lock, flags);
+	return (-EINVAL);
+}
+
 static int reset_notification(struct file_info *fi, struct pending_request *req)
 {
         DBGMSG("reset_notification called - switch %s ",
@@ -1829,9 +1929,8 @@
         spin_unlock_irq(&fi->reqlists_lock);
         packet->generation = req->req.generation;
         retval = hpsb_send_packet(packet);
-        DBGMSG("write_phypacket send_packet called => retval: %d ",
-                retval);
-        if (! retval) {
+        DBGMSG("write_phypacket send_packet called => retval: %d ", retval);
+        if (retval < 0) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
                 req->req.length = 0;
                 queue_complete_req(req);
@@ -1912,6 +2011,12 @@
         case RAW1394_REQ_ARM_UNREGISTER:
                 return arm_unregister(fi, req);
 
+        case RAW1394_REQ_ARM_SET_BUF:
+                return arm_set_buf(fi, req);
+
+        case RAW1394_REQ_ARM_GET_BUF:
+                return arm_get_buf(fi, req);
+
         case RAW1394_REQ_RESET_NOTIFY:
                 return reset_notification(fi, req);
 
@@ -2137,6 +2242,7 @@
 					    stat.config.data_buf_size,
 					    stat.config.buf_packets,
 					    stat.config.channel,
+ 					    stat.config.dma_mode,
 					    stat.config.irq_interval,
 					    rawiso_activity_cb);
 	if (!fi->iso_handle)
@@ -2489,7 +2595,7 @@
                 list_del(&fi->list);
                 spin_unlock_irq(&host_info_lock);
 
-                hpsb_unref_host(fi->host);
+		put_device(&fi->host->device);
         }
 
         kfree(fi);
diff -Nru a/drivers/ieee1394/raw1394.h b/drivers/ieee1394/raw1394.h
--- a/drivers/ieee1394/raw1394.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/raw1394.h	Thu Jan  8 23:00:23 2004
@@ -30,6 +30,8 @@
 
 #define RAW1394_REQ_ARM_REGISTER    300
 #define RAW1394_REQ_ARM_UNREGISTER  301
+#define RAW1394_REQ_ARM_SET_BUF     302
+#define RAW1394_REQ_ARM_GET_BUF     303
 
 #define RAW1394_REQ_RESET_NOTIFY    400
 
@@ -148,6 +150,9 @@
 
 	/* xmit only - iso transmission speed */
 	__u8 speed;
+
+	/* The mode of the dma when receiving iso data. Must be supported by chip */
+	__u8 dma_mode;
 
 	/* max. latency of buffer, in packets (-1 if you don't care) */
 	__s32 irq_interval;
diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
--- a/drivers/ieee1394/sbp2.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/sbp2.c	Thu Jan  8 23:00:23 2004
@@ -77,7 +77,7 @@
 #include "sbp2.h"
 
 static char version[] __devinitdata =
-	"$Rev: 1034 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1082 $ Ben Collins <bcollins@debian.org>";
 
 /*
  * Module load parameter definitions
@@ -361,38 +361,34 @@
 static void sbp2_free_packet(struct hpsb_packet *packet)
 {
 	hpsb_free_tlabel(packet);
-	free_hpsb_packet(packet);
+	hpsb_free_packet(packet);
 }
 
-/*
- * This function is called to retrieve a block write packet from our
- * packet pool. This function is used in place of calling
- * alloc_hpsb_packet (which costs us three kmallocs). Instead we just pull
- * out a free request packet and re-initialize values in it. I'm sure this
- * can still stand some more optimization.
+/* This is much like hpsb_node_write(), except it ignores the response
+ * subaction and returns immediately. Can be used from interrupts.
  */
-static struct hpsb_packet *
-sbp2util_allocate_write_packet(struct sbp2scsi_host_info *hi,
-			       struct node_entry *ne, u64 addr,
-			       size_t data_size,
-			       quadlet_t *data)
+int sbp2util_node_write_no_wait(struct node_entry *ne, u64 addr,
+				quadlet_t *buffer, size_t length)
 {
 	struct hpsb_packet *packet;
 
-	packet = hpsb_make_writepacket(hi->host, ne->nodeid,
-				       addr, data, data_size);
-
+	packet = hpsb_make_writepacket(ne->host, ne->nodeid,
+				       addr, buffer, length);
         if (!packet)
-                return NULL;
+                return -ENOMEM;
 
 	hpsb_set_packet_complete_task(packet, (void (*)(void*))sbp2_free_packet,
 				      packet);
 
 	hpsb_node_fill_packet(ne, packet);
 
-	return packet;
-}
+        if (hpsb_send_packet(packet) < 0) {
+		sbp2_free_packet(packet);
+		return -EIO;
+	}
 
+	return 0;
+}
 
 /*
  * This function is called to create a pool of command orbs used for
@@ -1734,35 +1730,26 @@
  */
 static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) 
 {
-	struct sbp2scsi_host_info *hi = scsi_id->hi;
-	struct hpsb_packet *packet;
 	quadlet_t data;
-	
+	u64 addr;
+	int retval;
+
 	SBP2_DEBUG("sbp2_agent_reset");
 
 	/*
 	 * Ok, let's write to the target's management agent register
 	 */
 	data = ntohl(SBP2_AGENT_RESET_DATA);
-	packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-						scsi_id->sbp2_command_block_agent_addr +
-						SBP2_AGENT_RESET_OFFSET,
-						4, &data);
-
-	if (!packet) {
-		SBP2_ERR("sbp2util_allocate_write_packet failed");
-		return(-ENOMEM);
-	}
+	addr = scsi_id->sbp2_command_block_agent_addr + SBP2_AGENT_RESET_OFFSET;
 
-	if (!hpsb_send_packet(packet)) {
-		SBP2_ERR("hpsb_send_packet failed");
-		sbp2_free_packet(packet); 
-		return(-EIO);
-	}
+	if (wait)
+		retval = hpsb_node_write(scsi_id->ne, addr, &data, 4);
+	else
+		retval = sbp2util_node_write_no_wait(scsi_id->ne, addr, &data, 4);
 
-	if (wait) {
-		down(&packet->state_change);
-		down(&packet->state_change);
+	if (retval < 0) {
+		SBP2_ERR("hpsb_node_write failed.\n");
+		return -EIO;
 	}
 
 	/*
@@ -2032,8 +2019,9 @@
 				 struct sbp2_command_info *command)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
-        struct hpsb_packet *packet;
 	struct sbp2_command_orb *command_orb = &command->command_orb;
+	struct node_entry *ne = scsi_id->ne;
+	u64 addr;
 
 	outstanding_orb_incr;
 	SBP2_ORB_DEBUG("sending command orb %p, total orbs = %x",
@@ -2049,40 +2037,30 @@
 	 * Check to see if there are any previous orbs to use
 	 */
 	if (scsi_id->last_orb == NULL) {
-	
+		quadlet_t data[2];
+
 		/*
 		 * Ok, let's write to the target's management agent register
 		 */
-		if (hpsb_node_entry_valid(scsi_id->ne)) {
-
-			packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-								scsi_id->sbp2_command_block_agent_addr +
-								SBP2_ORB_POINTER_OFFSET, 8, NULL);
-		
-			if (!packet) {
-				SBP2_ERR("sbp2util_allocate_write_packet failed");
-				return(-ENOMEM);
-			}
-		
-			packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id);
-			packet->data[1] = command->command_orb_dma;
-			sbp2util_cpu_to_be32_buffer(packet->data, 8);
-		
-			SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb);
+		addr = scsi_id->sbp2_command_block_agent_addr + SBP2_ORB_POINTER_OFFSET;
+		data[0] = ORB_SET_NODE_ID(hi->host->node_id);
+		data[1] = command->command_orb_dma;
+		sbp2util_cpu_to_be32_buffer(data, 8);
 
-			if (!hpsb_send_packet(packet)) {
-				SBP2_ERR("hpsb_send_packet failed");
-				sbp2_free_packet(packet); 
-				return(-EIO);
-			}
+		SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb);
 
-			SBP2_ORB_DEBUG("write command agent complete");
+		if (sbp2util_node_write_no_wait(ne, addr, data, 8) < 0) {
+			SBP2_ERR("sbp2util_node_write_no_wait failed.\n");
+			return -EIO;
 		}
 
+		SBP2_ORB_DEBUG("write command agent complete");
+
 		scsi_id->last_orb = command_orb;
 		scsi_id->last_orb_dma = command->command_orb_dma;
 
 	} else {
+		quadlet_t data;
 
 		/*
 		 * We have an orb already sent (maybe or maybe not
@@ -2102,25 +2080,14 @@
 		/*
 		 * Ring the doorbell
 		 */
-		if (hpsb_node_entry_valid(scsi_id->ne)) {
-			quadlet_t data = cpu_to_be32(command->command_orb_dma);
+		data = cpu_to_be32(command->command_orb_dma);
+		addr = scsi_id->sbp2_command_block_agent_addr + SBP2_DOORBELL_OFFSET;
 
-			packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-					scsi_id->sbp2_command_block_agent_addr +
-					SBP2_DOORBELL_OFFSET, 4, &data);
-	
-			if (!packet) {
-				SBP2_ERR("sbp2util_allocate_write_packet failed");
-				return(-ENOMEM);
-			}
+		SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb);
 
-			SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb);
-
-			if (!hpsb_send_packet(packet)) {
-				SBP2_ERR("hpsb_send_packet failed");
-				sbp2_free_packet(packet);
-				return(-EIO);
-			}
+		if (sbp2util_node_write_no_wait(ne, addr, &data, 4) < 0) {
+			SBP2_ERR("sbp2util_node_write_no_wait failed");
+			return(-EIO);
 		}
 
 		scsi_id->last_orb = command_orb;
diff -Nru a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c
--- a/drivers/ieee1394/video1394.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/ieee1394/video1394.c	Thu Jan  8 23:00:23 2004
@@ -21,6 +21,9 @@
 /* jds -- add private data to file to keep track of iso contexts associated
    with each open -- so release won't kill all iso transfers */
 
+/* Damien Douxchamps: Fix failure when the number of DMA pages per frame is
+   one */
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -398,32 +401,42 @@
 	ir_prg[0].branchAddress = cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
 					1 * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
 
-	/* the second descriptor will read PAGE_SIZE-4 bytes */
-	ir_prg[1].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
-		DMA_CTL_BRANCH | (PAGE_SIZE-4));
-	ir_prg[1].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma, (buf + 4) -
-					(unsigned long)d->dma.kvirt));
-	ir_prg[1].branchAddress = cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
-					2 * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
+	/* If there is *not* only one DMA page per frame (hence, d->nb_cmd==2) */
+	if (d->nb_cmd > 2) {
+		/* The second descriptor will read PAGE_SIZE-4 bytes */
+		ir_prg[1].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
+						DMA_CTL_BRANCH | (PAGE_SIZE-4));
+		ir_prg[1].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma, (buf + 4) -
+						(unsigned long)d->dma.kvirt));
+		ir_prg[1].branchAddress = cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
+						      2 * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
 	
-	for (i=2;i<d->nb_cmd-1;i++) {
+		for (i = 2; i < d->nb_cmd - 1; i++) {
+			ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
+							DMA_CTL_BRANCH | PAGE_SIZE);
+			ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+							(buf+(i-1)*PAGE_SIZE) -
+							(unsigned long)d->dma.kvirt));
+
+			ir_prg[i].branchAddress =
+				cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
+					    (i + 1) * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
+		}
+
+		/* The last descriptor will generate an interrupt */
 		ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
-			DMA_CTL_BRANCH | PAGE_SIZE);
+						DMA_CTL_IRQ | DMA_CTL_BRANCH | d->left_size);
 		ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
-					        (buf+(i-1)*PAGE_SIZE) -
+						(buf+(i-1)*PAGE_SIZE) -
 						(unsigned long)d->dma.kvirt));
-
-		ir_prg[i].branchAddress =
-			cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
-				(i + 1) * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
+	} else { 
+		/* Only one DMA page is used. Read d->left_size immediately and */
+		/* generate an interrupt as this is also the last page. */
+		ir_prg[1].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
+						DMA_CTL_IRQ | DMA_CTL_BRANCH | (d->left_size-4));
+		ir_prg[1].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
+						(buf + 4) - (unsigned long)d->dma.kvirt));
 	}
-
-	/* the last descriptor will generate an interrupt */
-	ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
-		DMA_CTL_IRQ | DMA_CTL_BRANCH | d->left_size);
-	ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
-					(buf+(i-1)*PAGE_SIZE) -
-					(unsigned long)d->dma.kvirt));
 }
 	
 static void initialize_dma_ir_ctx(struct dma_iso_ctx *d, int tag, int flags)
diff -Nru a/drivers/input/gameport/Kconfig b/drivers/input/gameport/Kconfig
--- a/drivers/input/gameport/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/input/gameport/Kconfig	Thu Jan  8 23:00:23 2004
@@ -19,6 +19,22 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called gameport.
 
+
+# Yes, SOUND_GAMEPORT looks a bit odd. Yes, it ends up being turned on
+# in every .config. Please don't touch it. It is here to handle an
+# unusual dependency between GAMEPORT and sound drivers.
+#
+# Some sound drivers call gameport functions. If GAMEPORT is
+# not selected, empty stubs are provided for the functions and all is
+# well.
+# If GAMEPORT is built in, everything is fine.
+# If GAMEPORT is a module, however, it would need to be loaded for the
+# sound driver to be able to link properly. Therefore, the sound
+# driver must be a module as well in that case. Since there's no way
+# to express that directly in Kconfig, we use SOUND_GAMEPORT to
+# express it. SOUND_GAMEPORT boils down to "if GAMEPORT is 'm',
+# anything that depends on SOUND_GAMEPORT must be 'm' as well. if
+# GAMEPORT is 'y' or 'n', it can be anything".
 config SOUND_GAMEPORT
 	tristate
 	default y if GAMEPORT!=m
diff -Nru a/drivers/input/input.c b/drivers/input/input.c
--- a/drivers/input/input.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/input.c	Thu Jan  8 23:00:24 2004
@@ -447,9 +447,10 @@
 	list_add_tail(&dev->node, &input_dev_list);
 
 	list_for_each_entry(handler, &input_handler_list, node)
-		if ((id = input_match_device(handler->id_table, dev)))
-			if ((handle = handler->connect(handler, dev, id)))
-				input_link_handle(handle);
+		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
+			if ((id = input_match_device(handler->id_table, dev)))
+				if ((handle = handler->connect(handler, dev, id)))
+					input_link_handle(handle);
 
 #ifdef CONFIG_HOTPLUG
 	input_call_hotplug("add", dev);
@@ -507,9 +508,10 @@
 	list_add_tail(&handler->node, &input_handler_list);
 	
 	list_for_each_entry(dev, &input_dev_list, node)
-		if ((id = input_match_device(handler->id_table, dev)))
-			if ((handle = handler->connect(handler, dev, id)))
-				input_link_handle(handle);
+		if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
+			if ((id = input_match_device(handler->id_table, dev)))
+				if ((handle = handler->connect(handler, dev, id)))
+					input_link_handle(handle);
 
 #ifdef CONFIG_PROC_FS
 	input_devices_state++;
diff -Nru a/drivers/input/joydev.c b/drivers/input/joydev.c
--- a/drivers/input/joydev.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/joydev.c	Thu Jan  8 23:00:24 2004
@@ -380,10 +380,6 @@
 	struct joydev *joydev;
 	int i, j, t, minor;
 
-	/* Avoid tablets */
-        if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit))
-		return NULL;
-
 	for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
 	if (minor == JOYDEV_MINORS) {
 		printk(KERN_ERR "joydev: no more free joydev devices\n");
@@ -464,6 +460,15 @@
 		joydev_free(joydev);
 }
 
+static struct input_device_id joydev_blacklist[] = {
+	{
+		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT,
+		.evbit = { BIT(EV_KEY) },
+		.keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
+	}, 	/* Avoid itouchpads, touchscreens and tablets */
+	{ }, 	/* Terminating entry */
+};
+
 static struct input_device_id joydev_ids[] = {
 	{
 		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
@@ -493,6 +498,7 @@
 	.minor =	JOYDEV_MINOR_BASE,
 	.name =		"joydev",
 	.id_table =	joydev_ids,
+	.blacklist = 	joydev_blacklist,
 };
 
 static int __init joydev_init(void)
diff -Nru a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
--- a/drivers/input/keyboard/atkbd.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/keyboard/atkbd.c	Thu Jan  8 23:00:24 2004
@@ -48,33 +48,30 @@
  */
 
 static unsigned char atkbd_set2_keycode[512] = {
-	  0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41, 85,
-	  0, 56, 42,182, 29, 16,  2, 89,  0,  0, 44, 31, 30, 17,  3, 90,
-	  0, 46, 45, 32, 18,  5,  4, 91, 90, 57, 47, 33, 20, 19,  6,  0,
-	 91, 49, 48, 35, 34, 21,  7,  0,  0,  0, 50, 36, 22,  8,  9,  0,
+
+	  0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
+	  0, 56, 42,182, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
+	  0, 46, 45, 32, 18,  5,  4,186,  0, 57, 47, 33, 20, 19,  6, 85,
+	  0, 49, 48, 35, 34, 21,  7, 89,  0,  0, 50, 36, 22,  8,  9, 90,
 	  0, 51, 37, 23, 24, 11, 10,  0,  0, 52, 53, 38, 39, 25, 12,  0,
-	122, 89, 40,120, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0,  0,
-	 85, 86, 90, 91, 92, 93, 14, 94, 95, 79,183, 75, 71,121,  0,123,
+	  0,181, 40,  0, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0,194,
+	  0, 86,193,192,184,  0, 14,185,  0, 79,182, 75, 71,124,  0,  0,
 	 82, 83, 80, 76, 77, 72,  1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
-	  0,  0,  0, 65, 99,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+
 	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
-	  0,  0, 92, 90, 85,  0,137,  0,  0,  0,  0, 91, 89,144,115,  0,
-	217,100,255,  0, 97,165,164,  0,156,  0,  0,140,115,  0,  0,125,
-	173,114,  0,113,152,163,151,126,128,166,  0,140,  0,147,  0,127,
-	159,167,115,160,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
-	157,  0,114,166,168,  0,  0,213,155,  0, 98,113,  0,163,  0,138,
-	226,  0,  0,  0,  0,  0,153,140,  0,255, 96,  0,  0,  0,143,  0,
-	133,  0,116,  0,143,  0,174,133,  0,107,  0,105,102,  0,  0,112,
-	110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119
+	217,100,255,  0, 97,165,  0,  0,156,  0,  0,  0,  0,  0,  0,125,
+	173,114,  0,113,  0,  0,  0,126,128,  0,  0,140,  0,  0,  0,127,
+	159,  0,115,  0,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
+	157,  0,  0,  0,  0,  0,  0,  0,155,  0, 98,  0,  0,163,  0,  0,
+	226,  0,  0,  0,  0,  0,  0,  0,  0,255, 96,  0,  0,  0,143,  0,
+	  0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,105,102,  0,  0,112,
+	110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
+
+	  0,  0,  0, 65, 99,
 };
 
 static unsigned char atkbd_set3_keycode[512] = {
+
 	  0,  0,  0,  0,  0,  0,  0, 59,  1,138,128,129,130, 15, 41, 60,
 	131, 29, 42, 86, 58, 16,  2, 61,133, 56, 44, 31, 30, 17,  3, 62,
 	134, 46, 45, 32, 18,  5,  4, 63,135, 57, 47, 33, 20, 19,  6, 64,
@@ -83,25 +80,21 @@
 	113,114, 40, 84, 26, 13, 87, 99, 97, 54, 28, 27, 43, 84, 88, 70,
 	108,105,119,103,111,107, 14,110,  0, 79,106, 75, 71,109,102,104,
 	 82, 83, 80, 76, 77, 72, 69, 98,  0, 96, 81,  0, 78, 73, 55, 85,
+
 	 89, 90, 91, 92, 74,185,184,182,  0,  0,  0,125,126,127,112,  0,
 	  0,139,150,163,165,115,152,150,166,140,160,154,113,114,167,168,
-	148,149,147,140,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255
+	148,149,147,140
 };
 
 static unsigned char atkbd_unxlate_table[128] = {
-	  0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
-	 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
-	 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
-	 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
-	 11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
-	114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
-	 71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
-	 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
+          0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
+         21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
+         35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
+         50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
+         11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
+        114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
+         71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
+         19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
 };
 
 #define ATKBD_CMD_SETLEDS	0x10ed
@@ -125,6 +118,9 @@
 #define ATKBD_RET_EMULX		0x80
 #define ATKBD_RET_EMUL1		0xe1
 #define ATKBD_RET_RELEASE	0xf0
+#define ATKBD_RET_HANGUEL	0xf1
+#define ATKBD_RET_HANJA		0xf2
+#define ATKBD_RET_ERR		0xff
 
 #define ATKBD_KEY_UNKNOWN	  0
 #define ATKBD_KEY_NULL		255
@@ -156,6 +152,17 @@
 	unsigned long time;
 };
 
+static void atkbd_report_key(struct input_dev *dev, struct pt_regs *regs, int code, int value)
+{
+	input_regs(dev, regs);
+	if (value == 3) {
+		input_report_key(dev, code, 1);
+		input_report_key(dev, code, 0);
+	} else
+		input_event(dev, EV_KEY, code, value);
+	input_sync(dev);
+}
+
 /*
  * atkbd_interrupt(). Here takes place processing of data received from
  * the keyboard into events.
@@ -184,47 +191,37 @@
 		atkbd->resend = 0;
 #endif
 
-	switch (code) {
-		case ATKBD_RET_ACK:
-			atkbd->ack = 1;
-			goto out;
-		case ATKBD_RET_NAK:
-			atkbd->ack = -1;
-			goto out;
-	}
-
-	if (atkbd->translated) do {
-
-		if (atkbd->emul != 1) {
-			if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
-				break;
-			if (code == ATKBD_RET_BAT) {
-				if (!atkbd->bat_xl)
-					break;
-				atkbd->bat_xl = 0;
-			}
-			if (code == (ATKBD_RET_BAT & 0x7f))
-				atkbd->bat_xl = 1;
+	if (!atkbd->ack)
+		switch (code) {
+			case ATKBD_RET_ACK:
+				atkbd->ack = 1;
+				goto out;
+			case ATKBD_RET_NAK:
+				atkbd->ack = -1;
+				goto out;
 		}
 
-		if (code < 0x80) {
-			code = atkbd_unxlate_table[code];
-			break;
-		}
-
-		if (atkbd->cmdcnt)
-			break;
-
-		code = atkbd_unxlate_table[code & 0x7f];
-		atkbd->release = 1;
-
-	} while (0);
-
 	if (atkbd->cmdcnt) {
 		atkbd->cmdbuf[--atkbd->cmdcnt] = code;
 		goto out;
 	}
 
+	if (atkbd->translated) {
+
+		if (atkbd->emul ||
+		    !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 ||
+		      code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA ||
+		      code == ATKBD_RET_ERR ||
+	             (code == ATKBD_RET_BAT && !atkbd->bat_xl))) {
+			atkbd->release = code >> 7;
+			code &= 0x7f;
+		}
+
+		if (!atkbd->emul &&
+		     (code & 0x7f) == (ATKBD_RET_BAT & 0x7f))
+			atkbd->bat_xl = !atkbd->release;
+	}
+
 	switch (code) {
 		case ATKBD_RET_BAT:
 			serio_rescan(atkbd->serio);
@@ -238,22 +235,33 @@
 		case ATKBD_RET_RELEASE:
 			atkbd->release = 1;
 			goto out;
+		case ATKBD_RET_HANGUEL:
+			atkbd_report_key(&atkbd->dev, regs, KEY_LANG1, 3);
+			goto out;
+		case ATKBD_RET_HANJA:
+			atkbd_report_key(&atkbd->dev, regs, KEY_LANG2, 3);
+			goto out;
+		case ATKBD_RET_ERR:
+			printk(KERN_WARNING "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
+			goto out;
 	}
 
+	if (atkbd->set != 3)
+		code = (code & 0x7f) | ((code & 0x80) << 1);
 	if (atkbd->emul) {
 		if (--atkbd->emul)
 			goto out;
-		code |= 0x100;
+		code |= (atkbd->set != 3) ? 0x80 : 0x100;
 	}
 
 	switch (atkbd->keycode[code]) {
 		case ATKBD_KEY_NULL:
 			break;
 		case ATKBD_KEY_UNKNOWN:
-			printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x, data %#x, on %s).\n",
+			printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n",
 				atkbd->release ? "released" : "pressed",
 				atkbd->translated ? "translated" : "raw", 
-				atkbd->set, code, data, serio->phys);
+				atkbd->set, code, serio->phys);
 			break;
 		default:
 			value = atkbd->release ? 0 :
@@ -273,9 +281,7 @@
 					break;
 			}
 
-			input_regs(&atkbd->dev, regs);
-			input_event(&atkbd->dev, EV_KEY, atkbd->keycode[code], value);
-			input_sync(&atkbd->dev);
+			atkbd_report_key(&atkbd->dev, regs, atkbd->keycode[code], value);
 	}
 
 	atkbd->release = 0;
@@ -369,10 +375,11 @@
 static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
 	struct atkbd *atkbd = dev->private;
-	struct { int p; u8 v; } period[] =	
-		{ {30, 0x00}, {25, 0x02}, {20, 0x04}, {15, 0x08}, {10, 0x0c}, {7, 0x10}, {5, 0x14}, {0, 0x14} };
-	struct { int d; u8 v; } delay[] =
-        	{ {1000, 0x60}, {750, 0x40}, {500, 0x20}, {250, 0x00}, {0, 0x00} };
+	const short period[32] =
+		{ 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
+		 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
+	const short delay[4] =
+		{ 250, 500, 750, 1000 };
 	char param[2];
 	int i, j;
 
@@ -406,11 +413,11 @@
 			if (atkbd_softrepeat) return 0;
 
 			i = j = 0;
-			while (period[i].p > dev->rep[REP_PERIOD]) i++;
-			while (delay[j].d > dev->rep[REP_DELAY]) j++;
-			dev->rep[REP_PERIOD] = period[i].p;
-			dev->rep[REP_DELAY] = delay[j].d;
-			param[0] = period[i].v | delay[j].v;
+			while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
+			while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
+			dev->rep[REP_PERIOD] = period[i];
+			dev->rep[REP_DELAY] = delay[j];
+			param[0] = i | (j << 5);
 			atkbd_command(atkbd, param, ATKBD_CMD_SETREP);
 
 			return 0;
@@ -623,6 +630,7 @@
 		atkbd->dev.rep[REP_PERIOD] = 33;
 	}
 
+	atkbd->ack = 1;
 	atkbd->serio = serio;
 
 	init_input_dev(&atkbd->dev);
@@ -665,16 +673,22 @@
 
 	sprintf(atkbd->phys, "%s/input0", serio->phys);
 
-	if (atkbd->set == 3)
-		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
-	else
+	if (atkbd->translated) {
+		for (i = 0; i < 128; i++) {
+			atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
+			atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
+		}
+	} else if (atkbd->set == 2) {
 		memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
+	} else {
+		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
+	}
 
 	atkbd->dev.name = atkbd->name;
 	atkbd->dev.phys = atkbd->phys;
 	atkbd->dev.id.bustype = BUS_I8042;
 	atkbd->dev.id.vendor = 0x0001;
-	atkbd->dev.id.product = atkbd->set;
+	atkbd->dev.id.product = atkbd->translated ? 1 : atkbd->set;
 	atkbd->dev.id.version = atkbd->id;
 
 	for (i = 0; i < 512; i++)
@@ -686,10 +700,62 @@
 	printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
 }
 
+/*
+ * atkbd_reconnect() tries to restore keyboard into a sane state and is
+ * most likely called on resume.
+ */
+
+static int atkbd_reconnect(struct serio *serio)
+{
+	struct atkbd *atkbd = serio->private;
+	struct serio_dev *dev = serio->dev;
+	int i;
+
+        if (!dev) {
+                printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
+                return -1;
+        }
+
+	if (atkbd->write) {
+		if (atkbd_probe(atkbd))
+			return -1;
+
+		atkbd->set = atkbd_set_3(atkbd);
+		atkbd_enable(atkbd);
+	} else {
+		atkbd->set = 2;
+		atkbd->id = 0xab00;
+	}
+
+	/*
+	 * Here we probably should check if the keyboard has the same set that
+         * it had before and bail out if it's different. But this will most likely
+         * cause new keyboard device be created... and for the user it will look
+         * like keyboard is lost
+	 */
+
+	if (atkbd->translated) {
+		for (i = 0; i < 128; i++) {
+			atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
+			atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
+		}
+	} else if (atkbd->set == 2) {
+		memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
+	} else {
+		memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
+	}
+
+	for (i = 0; i < 512; i++)
+		if (atkbd->keycode[i] && atkbd->keycode[i] < 255)
+			set_bit(atkbd->keycode[i], atkbd->dev.keybit);
+
+	return 0;
+}
 
 static struct serio_dev atkbd_dev = {
 	.interrupt =	atkbd_interrupt,
 	.connect =	atkbd_connect,
+	.reconnect = 	atkbd_reconnect,
 	.disconnect =	atkbd_disconnect,
 	.cleanup =	atkbd_cleanup,
 };
@@ -709,9 +775,17 @@
         if (ints[0] > 0) atkbd_reset = ints[1];
         return 1;
 }
+static int __init atkbd_setup_softrepeat(char *str)
+{
+        int ints[4];
+        str = get_options(str, ARRAY_SIZE(ints), ints);
+        if (ints[0] > 0) atkbd_softrepeat = ints[1];
+        return 1;
+}
 
 __setup("atkbd_set=", atkbd_setup_set);
 __setup("atkbd_reset", atkbd_setup_reset);
+__setup("atkbd_softrepeat=", atkbd_setup_softrepeat);
 #endif
 
 int __init atkbd_init(void)
diff -Nru a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
--- a/drivers/input/mouse/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/mouse/Kconfig	Thu Jan  8 23:00:24 2004
@@ -23,26 +23,17 @@
 	  mice with wheels and extra buttons, Microsoft, Logitech or Genius
 	  compatible.
 
+	  Synaptics TouchPad users might be interested in a specialized
+	  XFree86 driver at:
+		http://w1.894.telia.com/~u89404340/touchpad/index.html
+	  and a new verion of GPM at:
+		http://www.geocities.com/dt_or/gpm/gpm.html
+	  to take advantage of the advanced features of the touchpad.
+
 	  If unsure, say Y.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called psmouse.
-
-config MOUSE_PS2_SYNAPTICS
-	bool "Synaptics TouchPad"
-	default n
-	depends on INPUT && INPUT_MOUSE && MOUSE_PS2
-	---help---
-	  Say Y here if you have a Synaptics TouchPad connected to your system.
-	  This touchpad is found on many modern laptop computers.
-
-	  Note that you also need a user space driver to interpret the data
-	  generated by the kernel. A compatible driver for XFree86 is available
-	  from http://w1.894.telia.com/~u89404340/touchpad/index.html
-
-	  The gpm program is not yet able to interpret the data from this
-	  driver, so if you need to use the touchpad in the console, you have to
-	  say N for now.
 
 config MOUSE_SERIAL
 	tristate "Serial mouse"
diff -Nru a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c
--- a/drivers/input/mouse/logips2pp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/mouse/logips2pp.c	Thu Jan  8 23:00:24 2004
@@ -10,6 +10,7 @@
  */
 
 #include <linux/input.h>
+#include <linux/serio.h>
 #include "psmouse.h"
 #include "logips2pp.h"
 
@@ -142,7 +143,7 @@
  * touchpad.
  */
 
-int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
+static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
 {
 	int i;
 	static int logitech_4btn[] = { 12, 40, 41, 42, 43, 52, 73, 80, -1 };
@@ -226,3 +227,22 @@
 
 	return 0;
 }
+
+/*
+ * Logitech magic init.
+ */
+int ps2pp_detect(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+
+	param[0] = 0;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
+	param[1] = 0;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+
+	return param[1] != 0 ? ps2pp_detect_model(psmouse, param) : 0;
+}
+
diff -Nru a/drivers/input/mouse/logips2pp.h b/drivers/input/mouse/logips2pp.h
--- a/drivers/input/mouse/logips2pp.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/mouse/logips2pp.h	Thu Jan  8 23:00:24 2004
@@ -13,5 +13,5 @@
 struct psmouse;
 void ps2pp_process_packet(struct psmouse *psmouse);
 void ps2pp_set_800dpi(struct psmouse *psmouse);
-int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param);
+int ps2pp_detect(struct psmouse *psmouse);
 #endif
diff -Nru a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/input/mouse/psmouse-base.c	Thu Jan  8 23:00:23 2004
@@ -12,35 +12,44 @@
 
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/input.h>
 #include <linux/serio.h>
 #include <linux/init.h>
-#include <linux/pm.h>
 #include "psmouse.h"
 #include "synaptics.h"
 #include "logips2pp.h"
 
 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 MODULE_DESCRIPTION("PS/2 mouse driver");
-MODULE_PARM(psmouse_noext, "1i");
-MODULE_PARM_DESC(psmouse_noext, "Disable any protocol extensions. Useful for KVM switches.");
-MODULE_PARM(psmouse_resolution, "i");
-MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
-MODULE_PARM(psmouse_rate, "i");
-MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
-MODULE_PARM(psmouse_smartscroll, "i");
-MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
-MODULE_PARM(psmouse_resetafter, "i");
-MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
 MODULE_LICENSE("GPL");
 
 static int psmouse_noext;
+module_param(psmouse_noext, int, 0);
+MODULE_PARM_DESC(psmouse_noext, "[DEPRECATED] Disable any protocol extensions. Useful for KVM switches.");
+
+static char *psmouse_proto;
+static unsigned int psmouse_max_proto = -1U;
+module_param(psmouse_proto, charp, 0);
+MODULE_PARM_DESC(psmouse_proto, "Highest protocol extension to probe (bare, imps, exps). Useful for KVM switches.");
+
 int psmouse_resolution = 200;
+module_param(psmouse_resolution, uint, 0);
+MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
+
 unsigned int psmouse_rate = 100;
+module_param(psmouse_rate, uint, 0);
+MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
+
 int psmouse_smartscroll = 1;
+module_param(psmouse_smartscroll, bool, 0);
+MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
+
 unsigned int psmouse_resetafter;
+module_param(psmouse_resetafter, uint, 0);
+MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
 
 static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2"};
 
@@ -139,7 +148,8 @@
 		goto out;
 	}
 
-	if (psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
+	if (psmouse->state == PSMOUSE_ACTIVATED &&
+	    psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
 		printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
 		       psmouse->name, psmouse->phys, psmouse->pktcnt);
 		psmouse->pktcnt = 0;
@@ -257,46 +267,12 @@
 }
 
 /*
- * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
- * the mouse may have.
+ * Genius NetMouse magic init.
  */
-
-static int psmouse_extensions(struct psmouse *psmouse)
+static int genius_detect(struct psmouse *psmouse)
 {
 	unsigned char param[4];
 
-	param[0] = 0;
-	psmouse->vendor = "Generic";
-	psmouse->name = "Mouse";
-	psmouse->model = 0;
-
-	if (psmouse_noext)
-		return PSMOUSE_PS2;
-
-/*
- * Try Synaptics TouchPad magic ID
- */
-
-       param[0] = 0;
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-       psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-
-       if (param[1] == 0x47) {
-		psmouse->vendor = "Synaptics";
-		psmouse->name = "TouchPad";
-		if (!synaptics_init(psmouse))
-			return PSMOUSE_SYNAPTICS;
-		else
-			return PSMOUSE_PS2;
-       }
-
-/*
- * Try Genius NetMouse magic init.
- */
-
 	param[0] = 3;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
 	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
@@ -304,65 +280,99 @@
 	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
 	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
 
-	if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) {
-
-		set_bit(BTN_EXTRA, psmouse->dev.keybit);
-		set_bit(BTN_SIDE, psmouse->dev.keybit);
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
-
-		psmouse->vendor = "Genius";
-		psmouse->name = "Wheel Mouse";
-		return PSMOUSE_GENPS;
-	}
+	return param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55;
+}
 
 /*
- * Try Logitech magic ID.
+ * IntelliMouse magic init.
  */
+static int intellimouse_detect(struct psmouse *psmouse)
+{
+	unsigned char param[2];
 
-	param[0] = 0;
-	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
-	param[1] = 0;
-	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+	param[0] = 200;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	param[0] = 100;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	param[0] =  80;
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
 
-	if (param[1]) {
-		int type = ps2pp_detect_model(psmouse, param);
-		if (type)
-			return type;
-	}
+	return param[0] == 3;
+}
 
 /*
- * Try IntelliMouse magic init.
+ * Try IntelliMouse/Explorer magic init.
  */
+static int im_explorer_detect(struct psmouse *psmouse)
+{
+	unsigned char param[2];
 
 	param[0] = 200;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-	param[0] = 100;
+	param[0] = 200;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
 	param[0] =  80;
 	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
 	psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
-	
-	if (param[0] == 3) {
 
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
+	return param[0] == 4;
+}
 
 /*
- * Try IntelliMouse/Explorer magic init.
+ * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
+ * the mouse may have.
+ */
+
+static int psmouse_extensions(struct psmouse *psmouse)
+{
+	int synaptics_hardware = 0;
+
+	psmouse->vendor = "Generic";
+	psmouse->name = "Mouse";
+	psmouse->model = 0;
+
+/*
+ * Try Synaptics TouchPad
  */
+	if (psmouse_max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse)) {
+		synaptics_hardware = 1;
+		psmouse->vendor = "Synaptics";
+		psmouse->name = "TouchPad";
 
-		param[0] = 200;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		param[0] = 200;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		param[0] =  80;
-		psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-		psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
+		if (psmouse_max_proto > PSMOUSE_IMEX) {
+			if (synaptics_init(psmouse) == 0)
+				return PSMOUSE_SYNAPTICS;
+/*
+ * Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
+ * Unfortunately Logitech/Genius probes confuse some firmware versions so
+ * we'll have to skip them.
+ */
+			psmouse_max_proto = PSMOUSE_IMEX;
+		}
+	}
 
-		if (param[0] == 4) {
+	if (psmouse_max_proto > PSMOUSE_IMEX && genius_detect(psmouse)) {
+		set_bit(BTN_EXTRA, psmouse->dev.keybit);
+		set_bit(BTN_SIDE, psmouse->dev.keybit);
+		set_bit(REL_WHEEL, psmouse->dev.relbit);
 
+		psmouse->vendor = "Genius";
+		psmouse->name = "Wheel Mouse";
+		return PSMOUSE_GENPS;
+	}
+
+	if (psmouse_max_proto > PSMOUSE_IMEX) {
+		int type = ps2pp_detect(psmouse);
+		if (type)
+			return type;
+	}
+
+	if (psmouse_max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse)) {
+		set_bit(REL_WHEEL, psmouse->dev.relbit);
+
+		if (psmouse_max_proto >= PSMOUSE_IMEX &&
+					im_explorer_detect(psmouse)) {
 			set_bit(BTN_SIDE, psmouse->dev.keybit);
 			set_bit(BTN_EXTRA, psmouse->dev.keybit);
 
@@ -378,6 +388,15 @@
  * Okay, all failed, we have a standard mouse here. The number of the buttons
  * is still a question, though. We assume 3.
  */
+	if (synaptics_hardware) {
+/*
+ * We detected Synaptics hardware but it did not respond to IMPS/2 probes.
+ * We need to reset the touchpad because if there is a track point on the
+ * pass through port it could get disabled while probing for protocol
+ * extensions.
+ */
+		psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS);
+	}
 
 	return PSMOUSE_PS2;
 }
@@ -468,7 +487,7 @@
  * We set the mouse report rate, resolution and scaling.
  */
 
-	if (!psmouse_noext) {
+	if (psmouse_max_proto != PSMOUSE_PS2) {
 		psmouse_set_rate(psmouse);
 		psmouse_set_resolution(psmouse);
 		psmouse_command(psmouse,  NULL, PSMOUSE_CMD_SETSCALE11);
@@ -513,45 +532,30 @@
 	struct psmouse *psmouse = serio->private;
 
 	psmouse->state = PSMOUSE_IGNORE;
-	synaptics_disconnect(psmouse);
-	input_unregister_device(&psmouse->dev);
-	serio_close(serio);
-	kfree(psmouse);
-}
-
-/*
- * Reinitialize mouse hardware after software suspend.
- */
-
-static int psmouse_pm_callback(struct pm_dev *dev, pm_request_t request, void *data)
-{
-	struct psmouse *psmouse = dev->data;
-	struct serio_dev *ser_dev = psmouse->serio->dev;
-
-	synaptics_disconnect(psmouse);
 
-	/* We need to reopen the serio port to reinitialize the i8042 controller */
-	serio_close(psmouse->serio);
-	serio_open(psmouse->serio, ser_dev);
+	if (psmouse->ptport) {
+		if (psmouse->ptport->deactivate)
+			psmouse->ptport->deactivate(psmouse);
+		__serio_unregister_port(&psmouse->ptport->serio); /* we have serio_sem */
+		kfree(psmouse->ptport);
+		psmouse->ptport = NULL;
+	}
 
-	/* Probe and re-initialize the mouse */
-	psmouse_probe(psmouse);
-	psmouse_initialize(psmouse);
-	synaptics_pt_init(psmouse);
-	psmouse_activate(psmouse);
+	if (psmouse->disconnect)
+		psmouse->disconnect(psmouse);
 
-	return 0;
+	input_unregister_device(&psmouse->dev);
+	serio_close(serio);
+	kfree(psmouse);
 }
 
 /*
  * psmouse_connect() is a callback from the serio module when
  * an unhandled serio port is found.
  */
-
 static void psmouse_connect(struct serio *serio, struct serio_dev *dev)
 {
 	struct psmouse *psmouse;
-	struct pm_dev *pmdev;
 	
 	if ((serio->type & SERIO_TYPE) != SERIO_8042 &&
 	    (serio->type & SERIO_TYPE) != SERIO_PS_PSTHRU)
@@ -572,7 +576,6 @@
 	psmouse->dev.private = psmouse;
 
 	serio->private = psmouse;
-
 	if (serio_open(serio, dev)) {
 		kfree(psmouse);
 		return;
@@ -584,12 +587,6 @@
 		return;
 	}
 	
-	pmdev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, psmouse_pm_callback);
-	if (pmdev) {
-		psmouse->dev.pm_dev = pmdev;
-		pmdev->data = psmouse;
-	}
-
 	sprintf(psmouse->devname, "%s %s %s",
 		psmouse_protocols[psmouse->type], psmouse->vendor, psmouse->name);
 	sprintf(psmouse->phys, "%s/input0",
@@ -608,59 +605,87 @@
 
 	psmouse_initialize(psmouse);
 
-	synaptics_pt_init(psmouse);
+	if (psmouse->ptport) {
+		printk(KERN_INFO "serio: %s port at %s\n", psmouse->ptport->serio.name, psmouse->phys);
+		__serio_register_port(&psmouse->ptport->serio); /* we have serio_sem */
+		if (psmouse->ptport->activate)
+			psmouse->ptport->activate(psmouse);
+	}
+
+	psmouse_activate(psmouse);
+}
+
+
+static int psmouse_reconnect(struct serio *serio)
+{
+	struct psmouse *psmouse = serio->private;
+	struct serio_dev *dev = serio->dev;
+	int old_type = psmouse->type;
+
+	if (!dev) {
+		printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
+		return -1;
+	}
+
+	psmouse->state = PSMOUSE_NEW_DEVICE;
+	psmouse->type = psmouse->acking = psmouse->cmdcnt = psmouse->pktcnt = 0;
+	if (psmouse->reconnect) {
+	       if (psmouse->reconnect(psmouse))
+			return -1;
+	} else if (psmouse_probe(psmouse) != old_type)
+		return -1;
+
+	/* ok, the device type (and capabilities) match the old one,
+	 * we can continue using it, complete intialization
+	 */
+	psmouse->type = old_type;
+	psmouse_initialize(psmouse);
+
+	if (psmouse->ptport) {
+       		if (psmouse_reconnect(&psmouse->ptport->serio)) {
+			__serio_unregister_port(&psmouse->ptport->serio);
+			__serio_register_port(&psmouse->ptport->serio);
+			if (psmouse->ptport->activate)
+				psmouse->ptport->activate(psmouse);
+		}
+	}
 
 	psmouse_activate(psmouse);
+	return 0;
 }
 
+
 static struct serio_dev psmouse_dev = {
 	.interrupt =	psmouse_interrupt,
 	.connect =	psmouse_connect,
+	.reconnect =	psmouse_reconnect,
 	.disconnect =	psmouse_disconnect,
 	.cleanup =	psmouse_cleanup,
 };
 
-#ifndef MODULE
-static int __init psmouse_noext_setup(char *str)
-{
-	psmouse_noext = 1;
-	return 1;
-}
-
-static int __init psmouse_resolution_setup(char *str)
-{
-	get_option(&str, &psmouse_resolution);
-	return 1;
-}
-
-static int __init psmouse_smartscroll_setup(char *str)
+static inline void psmouse_parse_proto(void)
 {
-	get_option(&str, &psmouse_smartscroll);
-	return 1;
-}
-
-static int __init psmouse_resetafter_setup(char *str)
-{
-	get_option(&str, &psmouse_resetafter);
-	return 1;
-}
+	if (psmouse_noext) {
+		printk(KERN_WARNING "psmouse: 'psmouse_noext' option is deprecated, please use 'psmouse_proto'\n");
+		psmouse_max_proto = PSMOUSE_PS2;
+	}
 
-static int __init psmouse_rate_setup(char *str)
-{
-	get_option(&str, &psmouse_rate);
-	return 1;
+	/* even is psmouse_noext is present psmouse_proto overrides it */
+	if (psmouse_proto) {
+		if (!strcmp(psmouse_proto, "bare"))
+			psmouse_max_proto = PSMOUSE_PS2;
+		else if (!strcmp(psmouse_proto, "imps"))
+			psmouse_max_proto = PSMOUSE_IMPS;
+		else if (!strcmp(psmouse_proto, "exps"))
+			psmouse_max_proto = PSMOUSE_IMEX;
+		else
+			printk(KERN_ERR "psmouse: unknown protocol type '%s'\n", psmouse_proto);
+	}
 }
 
-__setup("psmouse_noext", psmouse_noext_setup);
-__setup("psmouse_resolution=", psmouse_resolution_setup);
-__setup("psmouse_smartscroll=", psmouse_smartscroll_setup);
-__setup("psmouse_resetafter=", psmouse_resetafter_setup);
-__setup("psmouse_rate=", psmouse_rate_setup);
-
-#endif
-
 int __init psmouse_init(void)
 {
+	psmouse_parse_proto();
 	serio_register_device(&psmouse_dev);
 	return 0;
 }
diff -Nru a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
--- a/drivers/input/mouse/psmouse.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/mouse/psmouse.h	Thu Jan  8 23:00:24 2004
@@ -22,10 +22,20 @@
 #define PSMOUSE_ACTIVATED	1
 #define PSMOUSE_IGNORE		2
 
+struct psmouse;
+
+struct psmouse_ptport {
+	struct serio serio;
+
+	void (*activate)(struct psmouse *parent);
+	void (*deactivate)(struct psmouse *parent);
+};
+
 struct psmouse {
 	void *private;
 	struct input_dev dev;
 	struct serio *serio;
+	struct psmouse_ptport *ptport;
 	char *vendor;
 	char *name;
 	unsigned char cmdbuf[8];
@@ -41,6 +51,9 @@
 	char error;
 	char devname[64];
 	char phys[32];
+
+	int (*reconnect)(struct psmouse *psmouse);
+	void (*disconnect)(struct psmouse *psmouse);
 };
 
 #define PSMOUSE_PS2		1
diff -Nru a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
--- a/drivers/input/mouse/synaptics.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/input/mouse/synaptics.c	Thu Jan  8 23:00:23 2004
@@ -2,7 +2,8 @@
  * Synaptics TouchPad PS/2 mouse driver
  *
  *   2003 Dmitry Torokhov <dtor@mail.ru>
- *     Added support for pass-through port
+ *     Added support for pass-through port. Special thanks to Peter Berg Larsen
+ *     for explaining various Synaptics quirks.
  *
  *   2003 Peter Osterlund <petero2@telia.com>
  *     Ported to 2.5 input device infrastructure.
@@ -194,9 +195,7 @@
 
 static int synaptics_query_hardware(struct psmouse *psmouse)
 {
-	struct synaptics_data *priv = psmouse->private;
 	int retries = 0;
-	int mode;
 
 	while ((retries++ < 3) && synaptics_reset(psmouse))
 		printk(KERN_ERR "synaptics reset failed\n");
@@ -208,7 +207,14 @@
 	if (synaptics_capability(psmouse))
 		return -1;
 
-	mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
+	return 0;
+}
+
+static int synaptics_set_mode(struct psmouse *psmouse, int mode)
+{
+	struct synaptics_data *priv = psmouse->private;
+
+	mode |= SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
 	if (SYN_ID_MAJOR(priv->identity) >= 4)
 		mode |= SYN_BIT_DISABLE_GESTURE;
 	if (SYN_CAP_EXTENDED(priv->capabilities))
@@ -265,49 +271,38 @@
 	}
 }
 
-int synaptics_pt_init(struct psmouse *psmouse)
+static void synaptics_pt_activate(struct psmouse *psmouse)
 {
-	struct synaptics_data *priv = psmouse->private;
-	struct serio *port;
-	struct psmouse *child;
+	struct psmouse *child = psmouse->ptport->serio.private;
 
-	if (psmouse->type != PSMOUSE_SYNAPTICS)
-		return -1;
-	if (!SYN_CAP_EXTENDED(priv->capabilities))
-		return -1;
-	if (!SYN_CAP_PASS_THROUGH(priv->capabilities))
-		return -1;
+	/* adjust the touchpad to child's choice of protocol */
+	if (child && child->type >= PSMOUSE_GENPS) {
+		if (synaptics_set_mode(psmouse, SYN_BIT_FOUR_BYTE_CLIENT))
+			printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
+	}
+}
+
+static void synaptics_pt_create(struct psmouse *psmouse)
+{
+	struct psmouse_ptport *port;
 
-	priv->ptport = port = kmalloc(sizeof(struct serio), GFP_KERNEL);
+	psmouse->ptport = port = kmalloc(sizeof(struct psmouse_ptport), GFP_KERNEL);
 	if (!port) {
-		printk(KERN_ERR "synaptics: not enough memory to allocate serio port\n");
-		return -1;
+		printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
+		return;
 	}
 
-	memset(port, 0, sizeof(struct serio));
-	port->type = SERIO_PS_PSTHRU;
-	port->name = "Synaptics pass-through";
-	port->phys = "synaptics-pt/serio0";
-	port->write = synaptics_pt_write;
-	port->open = synaptics_pt_open;
-	port->close = synaptics_pt_close;
-	port->driver = psmouse;
-
-	printk(KERN_INFO "serio: %s port at %s\n", port->name, psmouse->phys);
-	serio_register_slave_port(port);
+	memset(port, 0, sizeof(struct psmouse_ptport));
 
-	/* adjust the touchpad to child's choice of protocol */
-	child = port->private;
-	if (child && child->type >= PSMOUSE_GENPS) {
-		if (synaptics_mode_cmd(psmouse, (SYN_BIT_ABSOLUTE_MODE |
-					 	 SYN_BIT_HIGH_RATE |
-					 	 SYN_BIT_DISABLE_GESTURE |
-						 SYN_BIT_FOUR_BYTE_CLIENT |
-					 	 SYN_BIT_W_MODE)))
-			printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
-	}
+	port->serio.type = SERIO_PS_PSTHRU;
+	port->serio.name = "Synaptics pass-through";
+	port->serio.phys = "synaptics-pt/serio0";
+	port->serio.write = synaptics_pt_write;
+	port->serio.open = synaptics_pt_open;
+	port->serio.close = synaptics_pt_close;
+	port->serio.driver = psmouse;
 
-	return 0;
+	port->activate = synaptics_pt_activate;
 }
 
 /*****************************************************************************
@@ -371,27 +366,82 @@
 	clear_bit(REL_Y, dev->relbit);
 }
 
+static void synaptics_disconnect(struct psmouse *psmouse)
+{
+	synaptics_mode_cmd(psmouse, 0);
+	kfree(psmouse->private);
+}
+
+static int synaptics_reconnect(struct psmouse *psmouse)
+{
+	struct synaptics_data *priv = psmouse->private;
+	struct synaptics_data old_priv = *priv;
+
+	if (!synaptics_detect(psmouse))
+		return -1;
+
+	if (synaptics_query_hardware(psmouse)) {
+		printk(KERN_ERR "Unable to query Synaptics hardware.\n");
+		return -1;
+	}
+
+	if (old_priv.identity != priv->identity ||
+	    old_priv.model_id != priv->model_id ||
+	    old_priv.capabilities != priv->capabilities ||
+    	    old_priv.ext_cap != priv->ext_cap)
+    		return -1;
+
+	if (synaptics_set_mode(psmouse, 0)) {
+		printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+int synaptics_detect(struct psmouse *psmouse)
+{
+	unsigned char param[4];
+
+	param[0] = 0;
+
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
+	psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
+
+	return param[1] == 0x47;
+}
+
 int synaptics_init(struct psmouse *psmouse)
 {
 	struct synaptics_data *priv;
 
-#ifndef CONFIG_MOUSE_PS2_SYNAPTICS
-	return -1;
-#endif
-
 	psmouse->private = priv = kmalloc(sizeof(struct synaptics_data), GFP_KERNEL);
 	if (!priv)
 		return -1;
 	memset(priv, 0, sizeof(struct synaptics_data));
 
 	if (synaptics_query_hardware(psmouse)) {
-		printk(KERN_ERR "Unable to query/initialize Synaptics hardware.\n");
+		printk(KERN_ERR "Unable to query Synaptics hardware.\n");
+		goto init_fail;
+	}
+
+	if (synaptics_set_mode(psmouse, 0)) {
+		printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
 		goto init_fail;
 	}
 
+	if (SYN_CAP_EXTENDED(priv->capabilities) && SYN_CAP_PASS_THROUGH(priv->capabilities))
+       		synaptics_pt_create(psmouse);
+
 	print_ident(priv);
 	set_input_params(&psmouse->dev, priv);
 
+	psmouse->disconnect = synaptics_disconnect;
+	psmouse->reconnect = synaptics_reconnect;
+
 	return 0;
 
  init_fail:
@@ -399,36 +449,13 @@
 	return -1;
 }
 
-void synaptics_disconnect(struct psmouse *psmouse)
-{
-	struct synaptics_data *priv = psmouse->private;
-
-	if (psmouse->type == PSMOUSE_SYNAPTICS && priv) {
-		synaptics_mode_cmd(psmouse, 0);
-		if (priv->ptport) {
-			serio_unregister_slave_port(priv->ptport);
-			kfree(priv->ptport);
-		}
-		kfree(priv);
-	}
-}
-
 /*****************************************************************************
  *	Functions to interpret the absolute mode packets
  ****************************************************************************/
 
 static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw)
 {
-	hw->up    = 0;
-	hw->down  = 0;
-	hw->b0    = 0;
-	hw->b1    = 0;
-	hw->b2    = 0;
-	hw->b3    = 0;
-	hw->b4    = 0;
-	hw->b5    = 0;
-	hw->b6    = 0;
-	hw->b7    = 0;
+	memset(hw, 0, sizeof(struct synaptics_hw_state));
 
 	if (SYN_MODEL_NEWABS(priv->model_id)) {
 		hw->x = (((buf[3] & 0x10) << 8) |
@@ -570,64 +597,47 @@
 	input_sync(dev);
 }
 
+static int synaptics_validate_byte(struct psmouse *psmouse)
+{
+	static unsigned char newabs_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
+	static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
+	static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
+	static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
+	struct synaptics_data *priv = psmouse->private;
+	int idx = psmouse->pktcnt - 1;
+
+	if (SYN_MODEL_NEWABS(priv->model_id))
+		return (psmouse->packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
+	else
+		return (psmouse->packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
+}
+
 void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
 {
 	struct input_dev *dev = &psmouse->dev;
 	struct synaptics_data *priv = psmouse->private;
-	unsigned char data = psmouse->packet[psmouse->pktcnt - 1];
-	int newabs = SYN_MODEL_NEWABS(priv->model_id);
 
 	input_regs(dev, regs);
 
-	switch (psmouse->pktcnt) {
-	case 1:
-		if (newabs ? ((data & 0xC8) != 0x80) : ((data & 0xC0) != 0xC0)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 1st byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 2:
-		if (!newabs && ((data & 0x60) != 0x00)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 2nd byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 4:
-		if (newabs ? ((data & 0xC8) != 0xC0) : ((data & 0xC0) != 0x80)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 4th byte\n");
-			goto bad_sync;
-		}
-		break;
-	case 5:
-		if (!newabs && ((data & 0x60) != 0x00)) {
-			printk(KERN_WARNING "Synaptics driver lost sync at 5th byte\n");
-			goto bad_sync;
-		}
-		break;
-	default:
-		if (psmouse->pktcnt < 6)
-			break;		    /* Wait for full packet */
-
+	if (psmouse->pktcnt >= 6) { /* Full packet received */
 		if (priv->out_of_sync) {
 			priv->out_of_sync = 0;
 			printk(KERN_NOTICE "Synaptics driver resynced.\n");
 		}
 
-		if (priv->ptport && synaptics_is_pt_packet(psmouse->packet))
-			synaptics_pass_pt_packet(priv->ptport, psmouse->packet);
+		if (psmouse->ptport && psmouse->ptport->serio.dev && synaptics_is_pt_packet(psmouse->packet))
+			synaptics_pass_pt_packet(&psmouse->ptport->serio, psmouse->packet);
 		else
 			synaptics_process_packet(psmouse);
-
 		psmouse->pktcnt = 0;
-		break;
-	}
-	return;
 
- bad_sync:
-	priv->out_of_sync++;
-	psmouse->pktcnt = 0;
-	if (psmouse_resetafter > 0 && priv->out_of_sync	== psmouse_resetafter) {
-		psmouse->state = PSMOUSE_IGNORE;
-		serio_rescan(psmouse->serio);
+	} else if (psmouse->pktcnt && !synaptics_validate_byte(psmouse)) {
+		printk(KERN_WARNING "Synaptics driver lost sync at byte %d\n", psmouse->pktcnt);
+		psmouse->pktcnt = 0;
+		if (++priv->out_of_sync == psmouse_resetafter) {
+			psmouse->state = PSMOUSE_IGNORE;
+			printk(KERN_NOTICE "synaptics: issuing reconnect request\n");
+			serio_reconnect(psmouse->serio);
+		}
 	}
 }
diff -Nru a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
--- a/drivers/input/mouse/synaptics.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/input/mouse/synaptics.h	Thu Jan  8 23:00:24 2004
@@ -9,11 +9,9 @@
 #ifndef _SYNAPTICS_H
 #define _SYNAPTICS_H
 
-
 extern void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs);
+extern int synaptics_detect(struct psmouse *psmouse);
 extern int synaptics_init(struct psmouse *psmouse);
-extern int synaptics_pt_init(struct psmouse *psmouse);
-extern void synaptics_disconnect(struct psmouse *psmouse);
 
 /* synaptics queries */
 #define SYN_QUE_IDENTIFY		0x00
@@ -105,8 +103,6 @@
 	/* Data for normal processing */
 	unsigned int out_of_sync;		/* # of packets out of sync */
 	int old_w;				/* Previous w value */
-	
-	struct serio *ptport;			/* pass-through port */
 };
 
 #endif /* _SYNAPTICS_H */
diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
--- a/drivers/input/serio/i8042.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/input/serio/i8042.c	Thu Jan  8 23:00:23 2004
@@ -12,11 +12,14 @@
 
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/config.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
+#include <linux/sysdev.h>
+#include <linux/pm.h>
 #include <linux/serio.h>
 
 #include <asm/io.h>
@@ -25,19 +28,23 @@
 MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver");
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(i8042_noaux, "1i");
-MODULE_PARM(i8042_nomux, "1i");
-MODULE_PARM(i8042_unlock, "1i");
-MODULE_PARM(i8042_reset, "1i");
-MODULE_PARM(i8042_direct, "1i");
-MODULE_PARM(i8042_dumbkbd, "1i");
-
-static int i8042_reset;
-static int i8042_noaux;
-static int i8042_nomux;
-static int i8042_unlock;
-static int i8042_direct;
-static int i8042_dumbkbd;
+static unsigned int i8042_noaux;
+module_param(i8042_noaux, bool, 0);
+
+static unsigned int i8042_nomux;
+module_param(i8042_nomux, bool, 0);
+
+static unsigned int i8042_unlock;
+module_param(i8042_unlock, bool, 0);
+
+static unsigned int i8042_reset;
+module_param(i8042_reset, bool, 0);
+
+static unsigned int i8042_direct;
+module_param(i8042_direct, bool, 0);
+
+static unsigned int i8042_dumbkbd;
+module_param(i8042_dumbkbd, bool, 0);
 
 #undef DEBUG
 #include "i8042.h"
@@ -59,6 +66,9 @@
 static unsigned char i8042_initial_ctr;
 static unsigned char i8042_ctr;
 static unsigned char i8042_mux_open;
+static unsigned char i8042_mux_present;
+static unsigned char i8042_sysdev_initialized;
+static struct pm_dev *i8042_pm_dev;
 struct timer_list i8042_timer;
 
 /*
@@ -214,16 +224,41 @@
 }
 
 /*
- * i8042_open() is called when a port is open by the higher layer.
- * It allocates the interrupt and enables it in the chip.
+ * i8042_activate_port() enables port on a chip.
  */
 
-static int i8042_open(struct serio *port)
+static int i8042_activate_port(struct serio *port)
 {
 	struct i8042_values *values = port->driver;
 
 	i8042_flush();
 
+	/*
+	 * Enable port again here because it is disabled if we are
+	 * resuming (normally it is enabled already).
+	 */
+	i8042_ctr &= ~values->disable;
+
+	i8042_ctr |= values->irqen;
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		i8042_ctr &= ~values->irqen;
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/*
+ * i8042_open() is called when a port is open by the higher layer.
+ * It allocates the interrupt and calls i8042_enable_port.
+ */
+
+static int i8042_open(struct serio *port)
+{
+	struct i8042_values *values = port->driver;
+
 	if (values->mux != -1)
 		if (i8042_mux_open++)
 			return 0;
@@ -231,21 +266,26 @@
 	if (request_irq(values->irq, i8042_interrupt,
 			SA_SHIRQ, "i8042", i8042_request_irq_cookie)) {
 		printk(KERN_ERR "i8042.c: Can't get irq %d for %s, unregistering the port.\n", values->irq, values->name);
-		values->exists = 0;
-		serio_unregister_port(port);
-		return -1;
+		goto irq_fail;
 	}
 
-	i8042_ctr |= values->irqen;
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-		printk(KERN_ERR "i8042.c: Can't write CTR while opening %s.\n", values->name);
-		return -1;
+	if (i8042_activate_port(port)) {
+		printk(KERN_ERR "i8042.c: Can't activate %s, unregistering the port\n", values->name);
+		goto activate_fail;
 	}
 
 	i8042_interrupt(0, NULL, NULL);
 
 	return 0;
+
+activate_fail:
+	free_irq(values->irq, i8042_request_irq_cookie);
+
+irq_fail:
+	values->exists = 0;
+	serio_unregister_port_delayed(port);
+
+	return -1;
 }
 
 /*
@@ -393,145 +433,78 @@
 }
 
 /*
- * i8042_controller init initializes the i8042 controller, and,
- * most importantly, sets it into non-xlated mode if that's
- * desired.
+ * i8042_enable_mux_mode checks whether the controller has an active
+ * multiplexor and puts the chip into Multiplexed (as opposed to
+ * Legacy) mode.
  */
-	
-static int __init i8042_controller_init(void)
+
+static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux_version)
 {
 
+	unsigned char param;
 /*
- * Test the i8042. We need to know if it thinks it's working correctly
- * before doing anything else.
+ * Get rid of bytes in the queue.
  */
 
 	i8042_flush();
 
-	if (i8042_reset) {
-
-		unsigned char param;
-
-		if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
-			printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
-			return -1;
-		}
-
-		if (param != I8042_RET_CTL_TEST) {
-			printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
-				 param, I8042_RET_CTL_TEST);
-			return -1;
-		}
-	}
-
 /*
- * Save the CTR for restoral on unload / reboot.
+ * Internal loopback test - send three bytes, they should come back from the
+ * mouse interface, the last should be version. Note that we negate mouseport
+ * command responses for the i8042_check_aux() routine.
  */
 
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
-		printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
+	param = 0xf0;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
 		return -1;
-	}
-
-	i8042_initial_ctr = i8042_ctr;
-
-/*
- * Disable the keyboard interface and interrupt. 
- */
-
-	i8042_ctr |= I8042_CTR_KBDDIS;
-	i8042_ctr &= ~I8042_CTR_KBDINT;
-
-/*
- * Handle keylock.
- */
-
-	if (~i8042_read_status() & I8042_STR_KEYLOCK) {
-		if (i8042_unlock)
-			i8042_ctr |= I8042_CTR_IGNKEYLOCK;
-		 else
-			printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
-	}
-
-/*
- * If the chip is configured into nontranslated mode by the BIOS, don't
- * bother enabling translating and be happy.
- */
-
-	if (~i8042_ctr & I8042_CTR_XLATE)
-		i8042_direct = 1;
-
-/*
- * Set nontranslated mode for the kbd interface if requested by an option.
- * After this the kbd interface becomes a simple serial in/out, like the aux
- * interface is. We don't do this by default, since it can confuse notebook
- * BIOSes.
- */
-
-	if (i8042_direct) {
-		i8042_ctr &= ~I8042_CTR_XLATE;
-		i8042_kbd_port.type = SERIO_8042;
-	}
-
-/*
- * Write CTR back.
- */
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-		printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
+	param = 0x56;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
 		return -1;
-	}
+	param = 0xa4;
+	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b)
+		return -1;
+
+	if (mux_version)
+		*mux_version = ~param;
 
 	return 0;
 }
 
+
 /*
- * Here we try to reset everything back to a state in which the BIOS will be
- * able to talk to the hardware when rebooting.
+ * i8042_enable_mux_ports enables 4 individual AUX ports after
+ * the controller has been switched into Multiplexed mode
  */
 
-void i8042_controller_cleanup(void)
+static int i8042_enable_mux_ports(struct i8042_values *values)
 {
+	unsigned char param;
 	int i;
-
-	i8042_flush();
-
 /*
- * Reset anything that is connected to the ports.
- */
-
-	if (i8042_kbd_values.exists)
-		serio_cleanup(&i8042_kbd_port);
-
-	if (i8042_aux_values.exists)
-		serio_cleanup(&i8042_aux_port);
-
-	for (i = 0; i < 4; i++)
-		if (i8042_mux_values[i].exists)
-			serio_cleanup(i8042_mux_port + i);
-
-/*
- * Reset the controller.
+ * Disable all muxed ports by disabling AUX.
  */
 
-	if (i8042_reset) {
-		unsigned char param;
+	i8042_ctr |= I8042_CTR_AUXDIS;
+	i8042_ctr &= ~I8042_CTR_AUXINT;
 
-		if (i8042_command(&param, I8042_CMD_CTL_TEST))
-			printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		printk(KERN_ERR "i8042.c: Failed to disable AUX port, can't use MUX.\n");
+		return -1;
 	}
 
 /*
- * Restore the original control register setting.
+ * Enable all muxed ports.
  */
 
-	i8042_ctr = i8042_initial_ctr;
-
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
-		printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
+	for (i = 0; i < 4; i++) {
+		i8042_command(&param, I8042_CMD_MUX_PFX + i);
+		i8042_command(&param, I8042_CMD_AUX_ENABLE);
+	}
 
+	return 0;
 }
 
+
 /*
  * i8042_check_mux() checks whether the controller supports the PS/2 Active
  * Multiplexing specification by Synaptics, Phoenix, Insyde and
@@ -540,66 +513,31 @@
 
 static int __init i8042_check_mux(struct i8042_values *values)
 {
-	unsigned char param;
 	static int i8042_check_mux_cookie;
-	int i;
+	unsigned char mux_version;
 
 /*
  * Check if AUX irq is available.
  */
-
 	if (request_irq(values->irq, i8042_interrupt, SA_SHIRQ,
 				"i8042", &i8042_check_mux_cookie))
                 return -1;
 	free_irq(values->irq, &i8042_check_mux_cookie);
 
-/*
- * Get rid of bytes in the queue.
- */
-
-	i8042_flush();
-
-/*
- * Internal loopback test - send three bytes, they should come back from the
- * mouse interface, the last should be version. Note that we negate mouseport
- * command responses for the i8042_check_aux() routine.
- */
-
-	param = 0xf0;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x0f)
-		return -1;
-	param = 0x56;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0xa9)
-		return -1;
-	param = 0xa4;
-	if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param == 0x5b)
+	if (i8042_enable_mux_mode(values, &mux_version))
 		return -1;
 
 	printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev %d.%d.\n",
-		(~param >> 4) & 0xf, ~param & 0xf);
-
-/*
- * Disable all muxed ports by disabling AUX.
- */
-
-	i8042_ctr |= I8042_CTR_AUXDIS;
-	i8042_ctr &= ~I8042_CTR_AUXINT;
+		(mux_version >> 4) & 0xf, mux_version & 0xf);
 
-	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
+	if (i8042_enable_mux_ports(values))
 		return -1;
 
-/*
- * Enable all muxed ports.
- */
-
-	for (i = 0; i < 4; i++) {
-		i8042_command(&param, I8042_CMD_MUX_PFX + i);
-		i8042_command(&param, I8042_CMD_AUX_ENABLE);
-	}
-
+	i8042_mux_present = 1;
 	return 0;
 }
 
+
 /*
  * i8042_check_aux() applies as much paranoia as it can at detecting
  * the presence of an AUX interface.
@@ -675,6 +613,7 @@
 	return 0;
 }
 
+
 /*
  * i8042_port_register() marks the device as existing,
  * registers it, and reports to the user.
@@ -691,63 +630,205 @@
 		return -1; 
 	}
 
-	serio_register_port(port);
-
 	printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n",
 	       values->name,
 	       (unsigned long) I8042_DATA_REG,
 	       (unsigned long) I8042_COMMAND_REG,
 	       values->irq);
 
+	serio_register_port(port);
+
 	return 0;
 }
 
+
 static void i8042_timer_func(unsigned long data)
 {
 	i8042_interrupt(0, NULL, NULL);
 	mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
 }
 
-#ifndef MODULE
-static int __init i8042_setup_reset(char *str)
-{
-	i8042_reset = 1;
-	return 1;
-}
-static int __init i8042_setup_noaux(char *str)
-{
-	i8042_noaux = 1;
-	i8042_nomux = 1;
-	return 1;
-}
-static int __init i8042_setup_nomux(char *str)
-{
-	i8042_nomux = 1;
-	return 1;
-}
-static int __init i8042_setup_unlock(char *str)
+
+/*
+ * i8042_controller init initializes the i8042 controller, and,
+ * most importantly, sets it into non-xlated mode if that's
+ * desired.
+ */
+
+static int i8042_controller_init(void)
 {
-	i8042_unlock = 1;
-	return 1;
+
+	if (i8042_noaux)
+		i8042_nomux = 1;
+/*
+ * Test the i8042. We need to know if it thinks it's working correctly
+ * before doing anything else.
+ */
+
+	i8042_flush();
+
+	if (i8042_reset) {
+
+		unsigned char param;
+
+		if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
+			printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
+			return -1;
+		}
+
+		if (param != I8042_RET_CTL_TEST) {
+			printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
+				 param, I8042_RET_CTL_TEST);
+			return -1;
+		}
+	}
+
+/*
+ * Save the CTR for restoral on unload / reboot.
+ */
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
+		printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
+		return -1;
+	}
+
+	i8042_initial_ctr = i8042_ctr;
+
+/*
+ * Disable the keyboard interface and interrupt.
+ */
+
+	i8042_ctr |= I8042_CTR_KBDDIS;
+	i8042_ctr &= ~I8042_CTR_KBDINT;
+
+/*
+ * Handle keylock.
+ */
+
+	if (~i8042_read_status() & I8042_STR_KEYLOCK) {
+		if (i8042_unlock)
+			i8042_ctr |= I8042_CTR_IGNKEYLOCK;
+		 else
+			printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
+	}
+
+/*
+ * If the chip is configured into nontranslated mode by the BIOS, don't
+ * bother enabling translating and be happy.
+ */
+
+	if (~i8042_ctr & I8042_CTR_XLATE)
+		i8042_direct = 1;
+
+/*
+ * Set nontranslated mode for the kbd interface if requested by an option.
+ * After this the kbd interface becomes a simple serial in/out, like the aux
+ * interface is. We don't do this by default, since it can confuse notebook
+ * BIOSes.
+ */
+
+	if (i8042_direct) {
+		i8042_ctr &= ~I8042_CTR_XLATE;
+		i8042_kbd_port.type = SERIO_8042;
+	}
+
+/*
+ * Write CTR back.
+ */
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
+		printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
+		return -1;
+	}
+
+	return 0;
 }
-static int __init i8042_setup_direct(char *str)
+
+
+/*
+ * Here we try to reset everything back to a state in which the BIOS will be
+ * able to talk to the hardware when rebooting.
+ */
+
+void i8042_controller_cleanup(void)
 {
-	i8042_direct = 1;
-	return 1;
+	int i;
+
+	i8042_flush();
+
+/*
+ * Reset anything that is connected to the ports.
+ */
+
+	if (i8042_kbd_values.exists)
+		serio_cleanup(&i8042_kbd_port);
+
+	if (i8042_aux_values.exists)
+		serio_cleanup(&i8042_aux_port);
+
+	for (i = 0; i < 4; i++)
+		if (i8042_mux_values[i].exists)
+			serio_cleanup(i8042_mux_port + i);
+
+/*
+ * Reset the controller.
+ */
+
+	if (i8042_reset) {
+		unsigned char param;
+
+		if (i8042_command(&param, I8042_CMD_CTL_TEST))
+			printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
+	}
+
+/*
+ * Restore the original control register setting.
+ */
+
+	i8042_ctr = i8042_initial_ctr;
+
+	if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
+		printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
+
 }
-static int __init i8042_setup_dumbkbd(char *str)
+
+
+/*
+ * Here we try to reset everything back to a state in which suspended
+ */
+
+static int i8042_controller_resume(void)
 {
-	i8042_dumbkbd = 1;
-	return 1;
+	int i;
+
+	if (i8042_controller_init()) {
+		printk(KERN_ERR "i8042: resume failed\n");
+		return -1;
+	}
+
+	if (i8042_mux_present)
+		if (i8042_enable_mux_mode(&i8042_aux_values, NULL) ||
+		    i8042_enable_mux_ports(&i8042_aux_values)) {
+			printk(KERN_WARNING "i8042: failed to resume active multiplexor, mouse won't wotk.\n");
+		}
+
+/*
+ * Reconnect anything that was connected to the ports.
+ */
+
+	if (i8042_kbd_values.exists && i8042_activate_port(&i8042_kbd_port) == 0)
+		serio_reconnect(&i8042_kbd_port);
+
+	if (i8042_aux_values.exists && i8042_activate_port(&i8042_aux_port) == 0)
+		serio_reconnect(&i8042_aux_port);
+
+	for (i = 0; i < 4; i++)
+		if (i8042_mux_values[i].exists && i8042_activate_port(i8042_mux_port + i) == 0)
+			serio_reconnect(i8042_mux_port + i);
+
+	return 0;
 }
 
-__setup("i8042_reset", i8042_setup_reset);
-__setup("i8042_noaux", i8042_setup_noaux);
-__setup("i8042_nomux", i8042_setup_nomux);
-__setup("i8042_unlock", i8042_setup_unlock);
-__setup("i8042_direct", i8042_setup_direct);
-__setup("i8042_dumbkbd", i8042_setup_dumbkbd);
-#endif
 
 /*
  * We need to reset the 8042 back to original mode on system shutdown,
@@ -769,6 +850,35 @@
         0
 };
 
+/*
+ * Resume handler for the new PM scheme (driver model)
+ */
+static int i8042_resume(struct sys_device *dev)
+{
+	return i8042_controller_resume();
+}
+
+static struct sysdev_class kbc_sysclass = {
+       set_kset_name("i8042"),
+       .resume = i8042_resume,
+};
+
+static struct sys_device device_i8042 = {
+       .id     = 0,
+       .cls    = &kbc_sysclass,
+};
+
+/*
+ * Resume handler for the old PM scheme (APM)
+ */
+static int i8042_pm_callback(struct pm_dev *dev, pm_request_t request, void *dummy)
+{
+	if (request == PM_RESUME)
+		return i8042_controller_resume();
+
+	return 0;
+}
+
 static void __init i8042_init_mux_values(struct i8042_values *values, struct serio *port, int index)
 {
 	memcpy(port, &i8042_aux_port, sizeof(struct serio));
@@ -817,6 +927,15 @@
 	i8042_timer.function = i8042_timer_func;
 	mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
 
+        if (sysdev_class_register(&kbc_sysclass) == 0) {
+                if (sys_device_register(&device_i8042) == 0)
+			i8042_sysdev_initialized = 1;
+		else
+			sysdev_class_unregister(&kbc_sysclass);
+        }
+
+	i8042_pm_dev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, i8042_pm_callback);
+
 	register_reboot_notifier(&i8042_notifier);
 
 	return 0;
@@ -827,6 +946,14 @@
 	int i;
 
 	unregister_reboot_notifier(&i8042_notifier);
+
+	if (i8042_pm_dev)
+		pm_unregister(i8042_pm_dev);
+
+	if (i8042_sysdev_initialized) {
+		sys_device_unregister(&device_i8042);
+		sysdev_class_unregister(&kbc_sysclass);
+	}
 
 	del_timer(&i8042_timer);
 
diff -Nru a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
--- a/drivers/input/serio/serio.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/input/serio/serio.c	Thu Jan  8 23:00:23 2004
@@ -49,14 +49,17 @@
 
 EXPORT_SYMBOL(serio_interrupt);
 EXPORT_SYMBOL(serio_register_port);
-EXPORT_SYMBOL(serio_register_slave_port);
+EXPORT_SYMBOL(serio_register_port_delayed);
+EXPORT_SYMBOL(__serio_register_port);
 EXPORT_SYMBOL(serio_unregister_port);
-EXPORT_SYMBOL(serio_unregister_slave_port);
+EXPORT_SYMBOL(serio_unregister_port_delayed);
+EXPORT_SYMBOL(__serio_unregister_port);
 EXPORT_SYMBOL(serio_register_device);
 EXPORT_SYMBOL(serio_unregister_device);
 EXPORT_SYMBOL(serio_open);
 EXPORT_SYMBOL(serio_close);
 EXPORT_SYMBOL(serio_rescan);
+EXPORT_SYMBOL(serio_reconnect);
 
 struct serio_event {
 	int type;
@@ -82,11 +85,23 @@
 	}
 }
 
-#define SERIO_RESCAN	1
+#define SERIO_RESCAN		1
+#define SERIO_RECONNECT		2
+#define SERIO_REGISTER_PORT	3
+#define SERIO_UNREGISTER_PORT	4
 
 static DECLARE_WAIT_QUEUE_HEAD(serio_wait);
 static DECLARE_COMPLETION(serio_exited);
 
+static void serio_invalidate_pending_events(struct serio *serio)
+{
+	struct serio_event *event;
+
+	list_for_each_entry(event, &serio_event_list, node)
+		if (event->serio == serio)
+			event->serio = NULL;
+}
+
 void serio_handle_events(void)
 {
 	struct list_head *node, *next;
@@ -95,17 +110,35 @@
 	list_for_each_safe(node, next, &serio_event_list) {
 		event = container_of(node, struct serio_event, node);	
 
+		down(&serio_sem);
+		if (event->serio == NULL)
+			goto event_done;
+
 		switch (event->type) {
+			case SERIO_REGISTER_PORT :
+				__serio_register_port(event->serio);
+				break;
+
+			case SERIO_UNREGISTER_PORT :
+				__serio_unregister_port(event->serio);
+				break;
+
+			case SERIO_RECONNECT :
+				if (event->serio->dev && event->serio->dev->reconnect)
+					if (event->serio->dev->reconnect(event->serio) == 0)
+						break;
+				/* reconnect failed - fall through to rescan */
+
 			case SERIO_RESCAN :
-				down(&serio_sem);
 				if (event->serio->dev && event->serio->dev->disconnect)
 					event->serio->dev->disconnect(event->serio);
 				serio_find_dev(event->serio);
-				up(&serio_sem);
 				break;
 			default:
 				break;
 		}
+event_done:
+		up(&serio_sem);
 		list_del_init(node);
 		kfree(event);
 	}
@@ -130,18 +163,27 @@
 	complete_and_exit(&serio_exited, 0);
 }
 
-void serio_rescan(struct serio *serio)
+static void serio_queue_event(struct serio *serio, int event_type)
 {
 	struct serio_event *event;
 
-	if (!(event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC)))
-		return;
+	if ((event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC))) {
+		event->type = event_type;
+		event->serio = serio;
 
-	event->type = SERIO_RESCAN;
-	event->serio = serio;
+		list_add_tail(&event->node, &serio_event_list);
+		wake_up(&serio_wait);
+	}
+}
 
-	list_add_tail(&event->node, &serio_event_list);
-	wake_up(&serio_wait);
+void serio_rescan(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_RESCAN);
+}
+
+void serio_reconnect(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_RECONNECT);
 }
 
 irqreturn_t serio_interrupt(struct serio *serio,
@@ -163,17 +205,26 @@
 void serio_register_port(struct serio *serio)
 {
 	down(&serio_sem);
-	list_add_tail(&serio->node, &serio_list);
-	serio_find_dev(serio);
+	__serio_register_port(serio);
 	up(&serio_sem);
 }
 
 /*
- * Same as serio_register_port but does not try to acquire serio_sem.
- * Should be used when registering a serio from other input device's
+ * Submits register request to kseriod for subsequent execution.
+ * Can be used when it is not obvious whether the serio_sem is
+ * taken or not and when delayed execution is feasible.
+ */
+void serio_register_port_delayed(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_REGISTER_PORT);
+}
+
+/*
+ * Should only be called directly if serio_sem has already been taken,
+ * for example when unregistering a serio from other input device's
  * connect() function.
  */
-void serio_register_slave_port(struct serio *serio)
+void __serio_register_port(struct serio *serio)
 {
 	list_add_tail(&serio->node, &serio_list);
 	serio_find_dev(serio);
@@ -182,19 +233,28 @@
 void serio_unregister_port(struct serio *serio)
 {
 	down(&serio_sem);
-	list_del_init(&serio->node);
-	if (serio->dev && serio->dev->disconnect)
-		serio->dev->disconnect(serio);
+	__serio_unregister_port(serio);
 	up(&serio_sem);
 }
 
 /*
- * Same as serio_unregister_port but does not try to acquire serio_sem.
- * Should be used when unregistering a serio from other input device's
+ * Submits unregister request to kseriod for subsequent execution.
+ * Can be used when it is not obvious whether the serio_sem is
+ * taken or not and when delayed execution is feasible.
+ */
+void serio_unregister_port_delayed(struct serio *serio)
+{
+	serio_queue_event(serio, SERIO_UNREGISTER_PORT);
+}
+
+/*
+ * Should only be called directly if serio_sem has already been taken,
+ * for example when unregistering a serio from other input device's
  * disconnect() function.
  */
-void serio_unregister_slave_port(struct serio *serio)
+void __serio_unregister_port(struct serio *serio)
 {
+	serio_invalidate_pending_events(serio);
 	list_del_init(&serio->node);
 	if (serio->dev && serio->dev->disconnect)
 		serio->dev->disconnect(serio);
diff -Nru a/drivers/isdn/eicon/Kconfig b/drivers/isdn/eicon/Kconfig
--- a/drivers/isdn/eicon/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/isdn/eicon/Kconfig	Thu Jan  8 23:00:24 2004
@@ -13,7 +13,7 @@
 choice
 	prompt "Eicon active card support"
 	optional
-	depends on ISDN_DRV_EICON && ISDN
+	depends on ISDN_DRV_EICON && ISDN && m
 
 config ISDN_DRV_EICON_DIVAS
 	tristate "Eicon driver"
diff -Nru a/drivers/isdn/eicon/eicon_mod.c b/drivers/isdn/eicon/eicon_mod.c
--- a/drivers/isdn/eicon/eicon_mod.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/isdn/eicon/eicon_mod.c	Thu Jan  8 23:00:23 2004
@@ -29,6 +29,7 @@
 #include <linux/init.h>
 #ifdef CONFIG_MCA
 #include <linux/mca.h>
+#include <linux/mca-legacy.h>
 #endif /* CONFIG_MCA */
 
 #include "eicon.h"
diff -Nru a/drivers/isdn/i4l/isdn_ppp_ccp.c b/drivers/isdn/i4l/isdn_ppp_ccp.c
--- a/drivers/isdn/i4l/isdn_ppp_ccp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/isdn/i4l/isdn_ppp_ccp.c	Thu Jan  8 23:00:23 2004
@@ -557,7 +557,7 @@
 }
 
 static LIST_HEAD(ipc_head);
-static spinlock_t ipc_head_lock;
+static spinlock_t ipc_head_lock = SPIN_LOCK_UNLOCKED;
 
 int
 ippp_ccp_set_compressor(struct ippp_ccp *ccp, int unit,
diff -Nru a/drivers/md/Kconfig b/drivers/md/Kconfig
--- a/drivers/md/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/md/Kconfig	Thu Jan  8 23:00:23 2004
@@ -138,6 +138,7 @@
 config DM_IOCTL_V4
 	bool "ioctl interface version 4"
 	depends on BLK_DEV_DM
+	default y
 	---help---
 	  Recent tools use a new version of the ioctl interface, only
           select this option if you intend using such tools.
diff -Nru a/drivers/md/dm-ioctl-v1.c b/drivers/md/dm-ioctl-v1.c
--- a/drivers/md/dm-ioctl-v1.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/dm-ioctl-v1.c	Thu Jan  8 23:00:24 2004
@@ -566,7 +566,7 @@
 	if (r)
 		return r;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
@@ -894,7 +894,7 @@
 	struct mapped_device *md;
 	struct dm_table *t;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
diff -Nru a/drivers/md/dm-ioctl-v4.c b/drivers/md/dm-ioctl-v4.c
--- a/drivers/md/dm-ioctl-v4.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/md/dm-ioctl-v4.c	Thu Jan  8 23:00:23 2004
@@ -872,7 +872,7 @@
 	struct hash_cell *hc;
 	struct dm_table *t;
 
-	r = dm_table_create(&t, get_mode(param));
+	r = dm_table_create(&t, get_mode(param), param->target_count);
 	if (r)
 		return r;
 
diff -Nru a/drivers/md/dm-table.c b/drivers/md/dm-table.c
--- a/drivers/md/dm-table.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/dm-table.c	Thu Jan  8 23:00:24 2004
@@ -12,6 +12,7 @@
 #include <linux/namei.h>
 #include <linux/ctype.h>
 #include <linux/slab.h>
+#include <linux/interrupt.h>
 #include <asm/atomic.h>
 
 #define MAX_DEPTH 16
@@ -202,7 +203,7 @@
 	return 0;
 }
 
-int dm_table_create(struct dm_table **result, int mode)
+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets)
 {
 	struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO);
 
@@ -213,8 +214,12 @@
 	INIT_LIST_HEAD(&t->devices);
 	atomic_set(&t->holders, 1);
 
-	/* allocate a single nodes worth of targets to begin with */
-	if (alloc_targets(t, KEYS_PER_NODE)) {
+	if (!num_targets)
+		num_targets = KEYS_PER_NODE;
+
+	num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
+
+	if (alloc_targets(t, num_targets)) {
 		kfree(t);
 		t = NULL;
 		return -ENOMEM;
@@ -626,6 +631,16 @@
 	return 0;
 }
 
+static void set_default_limits(struct io_restrictions *rs)
+{
+	rs->max_sectors = MAX_SECTORS;
+	rs->max_phys_segments = MAX_PHYS_SEGMENTS;
+	rs->max_hw_segments = MAX_HW_SEGMENTS;
+	rs->hardsect_size = 1 << SECTOR_SHIFT;
+	rs->max_segment_size = MAX_SEGMENT_SIZE;
+	rs->seg_boundary_mask = -1;
+}
+
 int dm_table_add_target(struct dm_table *t, const char *type,
 			sector_t start, sector_t len, char *params)
 {
@@ -638,6 +653,7 @@
 
 	tgt = t->targets + t->num_targets;
 	memset(tgt, 0, sizeof(*tgt));
+	set_default_limits(&tgt->limits);
 
 	tgt->type = dm_get_target_type(type);
 	if (!tgt->type) {
@@ -731,22 +747,28 @@
 	return r;
 }
 
-static spinlock_t _event_lock = SPIN_LOCK_UNLOCKED;
+static DECLARE_MUTEX(_event_lock);
 void dm_table_event_callback(struct dm_table *t,
 			     void (*fn)(void *), void *context)
 {
-	spin_lock_irq(&_event_lock);
+	down(&_event_lock);
 	t->event_fn = fn;
 	t->event_context = context;
-	spin_unlock_irq(&_event_lock);
+	up(&_event_lock);
 }
 
 void dm_table_event(struct dm_table *t)
 {
-	spin_lock(&_event_lock);
+	/*
+	 * You can no longer call dm_table_event() from interrupt
+	 * context, use a bottom half instead.
+	 */
+	BUG_ON(in_interrupt());
+
+	down(&_event_lock);
 	if (t->event_fn)
 		t->event_fn(t->event_context);
-	spin_unlock(&_event_lock);
+	up(&_event_lock);
 }
 
 sector_t dm_table_get_size(struct dm_table *t)
diff -Nru a/drivers/md/dm.c b/drivers/md/dm.c
--- a/drivers/md/dm.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/dm.c	Thu Jan  8 23:00:24 2004
@@ -666,6 +666,20 @@
 	up_write(&md->lock);
 }
 
+static void __set_size(struct gendisk *disk, sector_t size)
+{
+	struct block_device *bdev;
+
+	set_capacity(disk, size);
+	bdev = bdget_disk(disk, 0);
+	if (bdev) {
+		down(&bdev->bd_inode->i_sem);
+		i_size_write(bdev->bd_inode, size << SECTOR_SHIFT);
+		up(&bdev->bd_inode->i_sem);
+		bdput(bdev);
+	}
+}
+
 static int __bind(struct mapped_device *md, struct dm_table *t)
 {
 	request_queue_t *q = md->queue;
@@ -673,7 +687,7 @@
 	md->map = t;
 
 	size = dm_table_get_size(t);
-	set_capacity(md->disk, size);
+	__set_size(md->disk, size);
 	if (size == 0)
 		return 0;
 
@@ -692,7 +706,6 @@
 	dm_table_event_callback(md->map, NULL, NULL);
 	dm_table_put(md->map);
 	md->map = NULL;
-	set_capacity(md->disk, 0);
 }
 
 /*
diff -Nru a/drivers/md/dm.h b/drivers/md/dm.h
--- a/drivers/md/dm.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/dm.h	Thu Jan  8 23:00:24 2004
@@ -95,7 +95,7 @@
  * Functions for manipulating a table.  Tables are also reference
  * counted.
  *---------------------------------------------------------------*/
-int dm_table_create(struct dm_table **result, int mode);
+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets);
 
 void dm_table_get(struct dm_table *t);
 void dm_table_put(struct dm_table *t);
diff -Nru a/drivers/md/linear.c b/drivers/md/linear.c
--- a/drivers/md/linear.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/md/linear.c	Thu Jan  8 23:00:23 2004
@@ -113,8 +113,17 @@
 		}
 
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		disk->size = rdev->size;
 		mddev->array_size += rdev->size;
 
diff -Nru a/drivers/md/multipath.c b/drivers/md/multipath.c
--- a/drivers/md/multipath.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/multipath.c	Thu Jan  8 23:00:24 2004
@@ -273,6 +273,17 @@
 			p->rdev = rdev;
 			blk_queue_stack_limits(mddev->queue,
 					       rdev->bdev->bd_disk->queue);
+
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 * (Note: it is very unlikely that a device with
+		 * merge_bvec_fn will be involved in multipath.)
+		 */
+			if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+			    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+				mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 			conf->working_disks++;
 			rdev->raid_disk = path;
 			rdev->in_sync = 1;
@@ -410,8 +421,16 @@
 
 		disk = conf->multipaths + disk_idx;
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, not that we ever expect a device with
+		 * a merge_bvec_fn to be involved in multipath */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		if (!rdev->faulty) 
 			conf->working_disks++;
 	}
diff -Nru a/drivers/md/raid0.c b/drivers/md/raid0.c
--- a/drivers/md/raid0.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/raid0.c	Thu Jan  8 23:00:24 2004
@@ -112,8 +112,18 @@
 			goto abort;
 		}
 		zone->dev[j] = rdev1;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev1->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+
+		if (rdev1->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		if (!smallest || (rdev1->size <smallest->size))
 			smallest = rdev1;
 		cnt++;
@@ -300,6 +310,22 @@
 		 */
 		conf->hash_spacing++;
 	}
+
+	/* calculate the max read-ahead size.
+	 * For read-ahead of large files to be effective, we need to
+	 * readahead at least a whole stripe. i.e. number of devices
+	 * multiplied by chunk size.
+	 * If an individual device has an ra_pages greater than the
+	 * chunk size, then we will not drive that device as hard as it
+	 * wants.  We consider this a configuration error: a larger
+	 * chunksize should be used in that case.
+	 */
+	{
+		int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
 
 	blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
 	return 0;
diff -Nru a/drivers/md/raid1.c b/drivers/md/raid1.c
--- a/drivers/md/raid1.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/md/raid1.c	Thu Jan  8 23:00:24 2004
@@ -56,7 +56,8 @@
 	kfree(r1_bio);
 }
 
-#define RESYNC_BLOCK_SIZE (64*1024)
+//#define RESYNC_BLOCK_SIZE (64*1024)
+#define RESYNC_BLOCK_SIZE PAGE_SIZE
 #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9)
 #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
 #define RESYNC_WINDOW (2048*1024)
@@ -677,8 +678,17 @@
 	for (mirror=0; mirror < mddev->raid_disks; mirror++)
 		if ( !(p=conf->mirrors+mirror)->rdev) {
 			p->rdev = rdev;
+
 			blk_queue_stack_limits(mddev->queue,
 					       rdev->bdev->bd_disk->queue);
+			/* as we don't honour merge_bvec_fn, we must never risk
+			 * violating it, so limit ->max_sector to one PAGE, as
+			 * a one page request is never in violation.
+			 */
+			if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+			    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+				mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 			p->head_position = 0;
 			rdev->raid_disk = mirror;
 			found = 1;
@@ -1077,8 +1087,17 @@
 		disk = conf->mirrors + disk_idx;
 
 		disk->rdev = rdev;
+
 		blk_queue_stack_limits(mddev->queue,
 				       rdev->bdev->bd_disk->queue);
+		/* as we don't honour merge_bvec_fn, we must never risk
+		 * violating it, so limit ->max_sector to one PAGE, as
+		 * a one page request is never in violation.
+		 */
+		if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
+		    mddev->queue->max_sectors > (PAGE_SIZE>>9))
+			mddev->queue->max_sectors = (PAGE_SIZE>>9);
+
 		disk->head_position = 0;
 		if (!rdev->faulty && rdev->in_sync)
 			conf->working_disks++;
diff -Nru a/drivers/md/raid5.c b/drivers/md/raid5.c
--- a/drivers/md/raid5.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/md/raid5.c	Thu Jan  8 23:00:23 2004
@@ -1587,6 +1587,16 @@
 
 	print_raid5_conf(conf);
 
+	/* read-ahead size must cover a whole stripe, which is
+	 * (n-1) * chunksize where 'n' is the number of raid devices
+	 */
+	{
+		int stripe = (mddev->raid_disks-1) * mddev->chunk_size
+			/ PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
 	/* Ok, everything is just fine now */
 	mddev->array_size =  mddev->size * (mddev->raid_disks - 1);
 	return 0;
diff -Nru a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
--- a/drivers/media/common/saa7146_core.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/common/saa7146_core.c	Thu Jan  8 23:00:24 2004
@@ -45,10 +45,65 @@
 #endif
 
 /****************************************************************************
+ * gpio and debi helper functions
+ ****************************************************************************/
+
+/* write "data" to the gpio-pin "pin" */
+void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
+{
+	u32 value = 0;
+
+	/* sanity check */
+	if(pin > 3)
+		return;
+
+	/* read old register contents */
+	value = saa7146_read(dev, GPIO_CTRL );
+	
+	value &= ~(0xff << (8*pin));
+	value |= (data << (8*pin));
+
+	saa7146_write(dev, GPIO_CTRL, value);
+}
+
+/* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev)
+{
+	int start;
+
+	/* wait for registers to be programmed */
+	start = jiffies;
+	while (1) {
+                if (saa7146_read(dev, MC2) & 2)
+                        break;
+		if (jiffies-start > HZ/20) {
+			DEB_S(("timed out while waiting for registers getting programmed\n"));
+			return -ETIMEDOUT;
+		}
+	}
+
+	/* wait for transfer to complete */
+	start = jiffies;
+	while (1) {
+		if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
+			break;
+		saa7146_read(dev, MC2);
+		if (jiffies-start > HZ/4) {
+			DEB_S(("timed out while waiting for transfer completion\n"));
+			return -ETIMEDOUT;
+		}
+	}
+
+	return 0;
+}
+
+/****************************************************************************
  * general helper functions
  ****************************************************************************/
 
-/* this is videobuf_vmalloc_to_sg() from video-buf.c */
+/* this is videobuf_vmalloc_to_sg() from video-buf.c 
+   make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
+   may be triggered on highmem machines */
 static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
 {
 	struct scatterlist *sglist;
@@ -84,7 +139,7 @@
 {
 	struct scatterlist *slist = NULL;
 	int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
-	char *mem = vmalloc(length);
+	char *mem = vmalloc_32(length);
 	int slen = 0;
 
 	if (NULL == mem) {
@@ -103,7 +158,9 @@
 	}
 	
 	slen = pci_map_sg(pci,slist,pages,PCI_DMA_FROMDEVICE);
-	saa7146_pgtable_build_single(pci, pt, slist, slen);
+	if (0 != saa7146_pgtable_build_single(pci, pt, slist, slen)) {
+		return NULL;
+	}
 
 	/* fixme: here's a memory leak: slist never gets freed by any other
 	   function ...*/
@@ -139,7 +196,7 @@
 	return 0;
 }
 
-void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
 	struct scatterlist *list, int sglen  )
 {
 	u32   *ptr, fill;
@@ -148,6 +205,11 @@
 
 	BUG_ON( 0 == sglen);
 
+	if (list->offset > PAGE_SIZE) {
+		DEB_D(("offset > PAGE_SIZE. this should not happen."));
+		return -EINVAL;
+	}
+	
 	/* if we have a user buffer, the first page may not be
 	   aligned to a page boundary. */
 	pt->offset = list->offset;
@@ -177,6 +239,7 @@
 		printk("ptr1 %d: 0x%08x\n",i,ptr[i]);
 	}
 */
+	return 0;
 }
 
 /********************************************************************************/
@@ -322,7 +385,7 @@
 	saa7146_write(dev, MC1, MASK_31);
 */
 
-	/* disable alle irqs */
+	/* disable all irqs */
 	saa7146_write(dev, IER, 0);
 
 	/* shut down all dma transfers */
@@ -381,8 +444,8 @@
 	dev->module = THIS_MODULE;
 	init_waitqueue_head(&dev->i2c_wq);
 
-	/* set some default values */
-	saa7146_write(dev, BCS_CTRL, 0x80400040);
+	/* set some sane pci arbitrition values */
+	saa7146_write(dev, PCI_BT_V1, 0x1c00101f); 
 
 	if( 0 != ext->probe) {
 		if( 0 != ext->probe(dev) ) {
@@ -508,6 +571,7 @@
 EXPORT_SYMBOL_GPL(saa7146_pgtable_free);
 EXPORT_SYMBOL_GPL(saa7146_pgtable_build_single);
 EXPORT_SYMBOL_GPL(saa7146_vmalloc_build_pgtable);
+EXPORT_SYMBOL_GPL(saa7146_wait_for_debi_done);
 
 EXPORT_SYMBOL_GPL(saa7146_setgpio);
 
diff -Nru a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c
--- a/drivers/media/common/saa7146_fops.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/common/saa7146_fops.c	Thu Jan  8 23:00:24 2004
@@ -86,7 +86,7 @@
 		return;
 	}
 
-	DEB_EE(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
+	DEB_INT(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
 
 #if DEBUG_SPINLOCKS
 	BUG_ON(!spin_is_locked(&dev->slock));
@@ -98,10 +98,10 @@
 		if (!list_empty(&q->queue))
 			next = list_entry(q->queue.next,struct saa7146_buf, vb.queue);
 		q->curr = buf;
-		DEB_D(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
+		DEB_INT(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
 		buf->activate(dev,buf,next);
 	} else {
-		DEB_D(("no next buffer. stopping.\n"));
+		DEB_INT(("no next buffer. stopping.\n"));
 		if( 0 != vbi ) {
 			/* turn off video-dma3 */
 			saa7146_write(dev,MC1, MASK_20);
@@ -229,10 +229,10 @@
 
 	if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
 		DEB_S(("initializing vbi...\n"));
-		saa7146_vbi_uops.open(dev,fh);
+		saa7146_vbi_uops.open(dev,file);
 	} else {
 		DEB_S(("initializing video...\n"));
-		saa7146_video_uops.open(dev,fh);
+		saa7146_video_uops.open(dev,file);
 	}
 
 	result = 0;
@@ -255,9 +255,9 @@
 		return -ERESTARTSYS;
 
 	if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
-		saa7146_vbi_uops.release(dev,fh,file);
+		saa7146_vbi_uops.release(dev,file);
 	} else {
-		saa7146_video_uops.release(dev,fh,file);
+		saa7146_video_uops.release(dev,file);
 	}
 
 	module_put(dev->ext->module);
@@ -372,7 +372,7 @@
 {
 	u32 isr = status;
 	
-	DEB_EE(("dev:%p, isr:0x%08x\n",dev,(u32)status));
+	DEB_INT(("dev:%p, isr:0x%08x\n",dev,(u32)status));
 
 	if (0 != (isr & (MASK_27))) {
 		DEB_INT(("irq: RPS0 (0x%08x).\n",isr));
@@ -410,6 +410,12 @@
 
 	DEB_EE(("dev:%p\n",dev));
 	
+	/* set default values for video parts of the saa7146 */
+	saa7146_write(dev, BCS_CTRL, 0x80400040);
+
+	/* enable video-port pins */
+	saa7146_write(dev, MC1, (MASK_10 | MASK_26));
+
 	/* save per-device extension data (one extension can
 	   handle different devices that might need different
 	   configuration data) */
diff -Nru a/drivers/media/common/saa7146_hlp.c b/drivers/media/common/saa7146_hlp.c
--- a/drivers/media/common/saa7146_hlp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/common/saa7146_hlp.c	Thu Jan  8 23:00:24 2004
@@ -660,24 +660,6 @@
 	vv->current_hps_sync = sync;
 } 
 
-/* write "data" to the gpio-pin "pin" */
-void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
-{
-	u32 value = 0;
-
-	/* sanity check */
-	if(pin > 3)
-		return;
-
-	/* read old register contents */
-	value = saa7146_read(dev, GPIO_CTRL );
-	
-	value &= ~(0xff << (8*pin));
-	value |= (data << (8*pin));
-
-	saa7146_write(dev, GPIO_CTRL, value);
-}
-
 /* reprogram hps, enable(1) / disable(0) video */
 void saa7146_set_overlay(struct saa7146_dev *dev, struct saa7146_fh *fh, int v)
 {
@@ -710,13 +692,15 @@
 	/* calculate starting address */
 	where  = (which-1)*0x18;
 
+/*
 	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
 		saa7146_write(dev, where, 	vdma->base_even);
 		saa7146_write(dev, where+0x04, 	vdma->base_odd);
 	} else {
+*/
 		saa7146_write(dev, where, 	vdma->base_odd);
 		saa7146_write(dev, where+0x04, 	vdma->base_even);
-	}
+//	}
 	saa7146_write(dev, where+0x08, 	vdma->prot_addr);
 	saa7146_write(dev, where+0x0c, 	vdma->pitch);
 	saa7146_write(dev, where+0x10, 	vdma->base_page);
@@ -971,12 +955,13 @@
 	unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
 	unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
 
+/*
 	if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
 		unsigned long tmp = e_wait;
 		e_wait = o_wait;
 		o_wait = tmp;
 	}
-
+*/
 	/* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
 	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
 	WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
diff -Nru a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
--- a/drivers/media/common/saa7146_i2c.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/common/saa7146_i2c.c	Thu Jan  8 23:00:24 2004
@@ -186,7 +186,7 @@
 {
 	u32 status = 0, mc2 = 0;
 	int trial = 0;
-	int timeout;
+	unsigned long timeout;
 
 	/* write out i2c-command */
 	DEB_I2C(("before: 0x%08x (status: 0x%08x), %d\n",*dword,saa7146_read(dev, I2C_STATUS), dev->i2c_op));
@@ -218,7 +218,7 @@
 			if( 0 != mc2 ) {
 				break;
 			}
-			if (jiffies > timeout) {
+			if (time_after(jiffies,timeout)) {
 				printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n");
 				return -EIO;
 			}
@@ -233,7 +233,7 @@
 			status = saa7146_i2c_status(dev);
 			if ((status & 0x3) != 1)
 				break;
-			if (jiffies > timeout) {
+			if (time_after(jiffies,timeout)) {
 				/* this is normal when probing the bus
 				 * (no answer from nonexisistant device...)
 				 */
@@ -301,7 +301,8 @@
 		goto out;
 	}
 
-        if (count > 3) short_delay = 1;
+	if ( count > 3 || 0 != (SAA7146_I2C_SHORT_DELAY & dev->ext->flags) )
+		short_delay = 1;
   
 	do {
 		/* reset the i2c-device if necessary */
@@ -403,19 +404,29 @@
 {
 	DEB_EE(("bitrate: 0x%08x\n",bitrate));
 	
+	/* enable i2c-port pins */
+	saa7146_write(dev, MC1, (MASK_08 | MASK_24));
+
 	dev->i2c_bitrate = bitrate;
 	saa7146_i2c_reset(dev);
 
 	if( NULL != i2c_adapter ) {
 		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
 		strcpy(i2c_adapter->name, dev->name);	
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+		i2c_adapter->data = dev;
+#else
 		i2c_set_adapdata(i2c_adapter,dev);
-		i2c_adapter->class	   = I2C_ADAP_CLASS_TV_ANALOG;
+#endif
 		i2c_adapter->algo	   = &saa7146_algo;
 		i2c_adapter->algo_data     = NULL;
 		i2c_adapter->id 	   = I2C_ALGO_SAA7146;
 		i2c_adapter->timeout = SAA7146_I2C_TIMEOUT;
 		i2c_adapter->retries = SAA7146_I2C_RETRIES;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#else
+		i2c_adapter->class = I2C_ADAP_CLASS_TV_ANALOG;
+#endif
 	}
 	
 	return 0;
diff -Nru a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c
--- a/drivers/media/common/saa7146_vbi.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/common/saa7146_vbi.c	Thu Jan  8 23:00:23 2004
@@ -41,7 +41,11 @@
 	/* wait for vbi_a or vbi_b*/
 	if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
 		DEB_D(("...using port b\n"));
+		WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_E_FID_B);
+		WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_O_FID_B);
+/*
 		WRITE_RPS1(CMD_PAUSE | MASK_09);
+*/
 	} else {
 		DEB_D(("...using port a\n"));
 		WRITE_RPS1(CMD_PAUSE | MASK_10);
@@ -137,10 +141,10 @@
 	unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
 
 /*
-	vdma3.base_even	= (u32)dev->ov_fb.base+2048*70;
-	vdma3.base_odd	= (u32)dev->ov_fb.base;
-	vdma3.prot_addr	= (u32)dev->ov_fb.base+2048*164;
-	vdma3.pitch	= 2048;
+	vdma3.base_even	= 0xc8000000+2560*70;
+	vdma3.base_odd	= 0xc8000000;
+	vdma3.prot_addr	= 0xc8000000+2560*164;
+	vdma3.pitch	= 2560;
 	vdma3.base_page	= 0;
 	vdma3.num_line_byte = (64<<16)|((vbi_pixel_to_capture)<<0); // set above!
 */
@@ -244,7 +248,9 @@
 		err = videobuf_iolock(dev->pci,&buf->vb,NULL);
 		if (err)
 			goto oops;
-		saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
+		err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
+		if (0 != err)
+			return err;
 	}
 	buf->vb.state = STATE_PREPARED;
 	buf->activate = buffer_activate;
@@ -303,7 +309,7 @@
 
 /* ------------------------------------------------------------------ */
 
-static void vbi_stop(struct saa7146_fh *fh)
+static void vbi_stop(struct saa7146_fh *fh, struct file *file)
 {
 	struct saa7146_dev *dev = fh->dev;
 	struct saa7146_vv *vv = dev->vv_data;
@@ -321,23 +327,29 @@
 	/* shut down dma 3 transfers */
 	saa7146_write(dev, MC1, MASK_20);
 
+	if (vv->vbi_q.curr) {
+		saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
+	}
+
+	videobuf_queue_cancel(file,&fh->vbi_q);
+
 	vv->vbi_streaming = NULL;
 
 	del_timer(&vv->vbi_q.timeout);
 	del_timer(&fh->vbi_read_timeout);
 
-	DEB_VBI(("out\n"));
 	spin_unlock_irqrestore(&dev->slock, flags);
 }
 
 static void vbi_read_timeout(unsigned long data)
 {
-	struct saa7146_fh *fh = (struct saa7146_fh *)data;
+	struct file *file = (struct file*)data;
+	struct saa7146_fh *fh = file->private_data;
 	struct saa7146_dev *dev = fh->dev;
 	
 	DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
 
-	vbi_stop(fh);
+	vbi_stop(fh, file);
 }
 
 static void vbi_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
@@ -354,10 +366,21 @@
 	init_waitqueue_head(&vv->vbi_wq);
 }
 
-static void vbi_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+static void vbi_open(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
+	
+	u32 arbtr_ctrl	= saa7146_read(dev, PCI_BT_V1);
+	int ret = 0;
+	
 	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
+	/* adjust arbitrition control for video dma 3 */
+	arbtr_ctrl &= ~0x1f0000;
+	arbtr_ctrl |=  0x1d0000;
+	saa7146_write(dev, PCI_BT_V1, arbtr_ctrl);
+	saa7146_write(dev, MC2, (MASK_04|MASK_20));		
+	
 	memset(&fh->vbi_fmt,0,sizeof(fh->vbi_fmt));
 
 	fh->vbi_fmt.sampling_rate	= 27000000;
@@ -380,21 +403,32 @@
 
 	init_timer(&fh->vbi_read_timeout);
 	fh->vbi_read_timeout.function = vbi_read_timeout;
-	fh->vbi_read_timeout.data = (unsigned long)fh;
+	fh->vbi_read_timeout.data = (unsigned long)file;
 
-	/* fixme: enable this again, if the dvb-c w/ analog module work properly */
-/*
-	vbi_workaround(dev);
-*/
+	/* initialize the brs */
+	if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
+		saa7146_write(dev, BRS_CTRL, MASK_30|MASK_29 | (7 << 19));
+	} else {
+		saa7146_write(dev, BRS_CTRL, 0x00000001);
+
+		if (0 != (ret = vbi_workaround(dev))) {
+			DEB_VBI(("vbi workaround failed!\n"));
+			/* return ret;*/
+		}
+	}
+
+	/* upload brs register */
+	saa7146_write(dev, MC2, (MASK_08|MASK_24));		
 }
 
-static void vbi_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+static void vbi_close(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_vv *vv = dev->vv_data;
 	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
 	if( fh == vv->vbi_streaming ) {
-		vbi_stop(fh);
+		vbi_stop(fh, file);
 	}
 }
 
diff -Nru a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
--- a/drivers/media/common/saa7146_video.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/common/saa7146_video.c	Thu Jan  8 23:00:24 2004
@@ -116,7 +116,7 @@
 		DEB_D(("no fb fmt set.\n"));
 		return -EINVAL;
 	}
-	if (win->w.width < 64 || win->w.height <  64) {
+	if (win->w.width < 48 || win->w.height <  32) {
 		DEB_D(("min width/height. (%d,%d)\n",win->w.width,win->w.height));
 		return -EINVAL;
 	}
@@ -661,7 +661,7 @@
 */				
 	} else {
 		struct saa7146_pgtable *pt = &buf->pt[0];
-		saa7146_pgtable_build_single(pci, pt, list, length);
+		return saa7146_pgtable_build_single(pci, pt, list, length);
 	}
 
 	return 0;
@@ -704,7 +704,7 @@
 	return 0;
 }
 
-static int video_end(struct saa7146_fh *fh)
+static int video_end(struct saa7146_fh *fh, struct file *file)
 {
 	struct saa7146_dev *dev = fh->dev;
 	struct saa7146_vv *vv = dev->vv_data;
@@ -735,82 +735,9 @@
 	saa7146_write(dev, MC1, 0x00700000);
 
 	vv->streaming = NULL;
-	spin_unlock_irqrestore(&dev->slock, flags);
-	
-	return 0;
-}
-
-/* capturing to framebuffer */
-
-int overlay_reqbufs(struct saa7146_dev *dev, struct v4l2_requestbuffers *req)
-{
-/*	struct saa7146_fh *fh = file->private_data;
-
-	if (req->count > VIDEO_MAX_FRAME)
-		req->count = VIDEO_MAX_FRAME;
-
-	*size = fh->video_fmt.sizeimage;
-
-*/
-	return 0;
-}
-int overlay_querybuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
-{
-	return 0;
-}
-int overlay_qbuf(struct saa7146_dev *dev, struct v4l2_buffer *b)
-{
-/*	if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
-		DEB_D(("index %d out of bounds.\n",b->index));
-		goto -EINVAL;
-	}
-	
-	buf = q->bufs[b->index];
-	if (NULL == buf) {
-		printk("videobuf_qbuf: NULL == buf\n");
-		goto done;
-	}
-	if (0 == buf->baddr) {
-		printk("videobuf_qbuf: 0 == buf->baddr\n");
-		goto done;
-	}
-	if (buf->state == STATE_QUEUED ||
-	    buf->state == STATE_ACTIVE) {
-		printk("videobuf_qbuf: already queued or activated.\n");
-		goto done;
-	}
 
-	field = videobuf_next_field(q);
-	retval = q->ops->buf_prepare(file,buf,field);
-	if (0 != retval) {
-		printk("videobuf_qbuf: buf_prepare() failed.\n");
-		goto done;
-	}
-	
-	list_add_tail(&buf->stream,&q->stream);
-	if (q->streaming) {
-		spin_lock_irqsave(q->irqlock,flags);
-		q->ops->buf_queue(file,buf);
-		spin_unlock_irqrestore(q->irqlock,flags);
-	}
-	retval = 0;
+	spin_unlock_irqrestore(&dev->slock, flags);
 	
- done:
-	up(&q->lock);
-	return retval;
-*/
-	return 0;
-}
-int overlay_dqbuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
-{
-	return 0;
-}
-int overlay_streamon(struct saa7146_dev *dev)
-{
-	return 0;
-}
-int overlay_streamoff(struct saa7146_dev *dev)
-{
 	return 0;
 }
 
@@ -818,7 +745,7 @@
 /*
  * This function is _not_ called directly, but from
  * video_generic_ioctl (and maybe others).  userspace
- * copying is done already, arg is a kernel fhinter.
+ * copying is done already, arg is a kernel pointer.
  */
 
 int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
@@ -1141,38 +1068,24 @@
 	case VIDIOC_REQBUFS: {
 		struct v4l2_requestbuffers *req = arg;
 		DEB_D(("VIDIOC_REQBUFS, type:%d\n",req->type));
-/*
-		if( req->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_reqbufs(dev,req);
-		} 
-*/
 		return videobuf_reqbufs(file,q,req);
 	}
 	case VIDIOC_QUERYBUF: {
 		struct v4l2_buffer *buf = arg;
 		DEB_D(("VIDIOC_QUERYBUF, type:%d, offset:%d\n",buf->type,buf->m.offset));
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_querybuf(dev,buf);
-		} 
- */		return videobuf_querybuf(q,buf);
+		return videobuf_querybuf(q,buf);
 	}
 	case VIDIOC_QBUF: {
 		struct v4l2_buffer *buf = arg;
 		int ret = 0;
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_qbuf(dev,buf);
-		} 
- */		ret = videobuf_qbuf(file,q,buf);
+		ret = videobuf_qbuf(file,q,buf);
 		DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,buf->index));
 		return ret;
 	}
 	case VIDIOC_DQBUF: {
 		struct v4l2_buffer *buf = arg;
 		int ret = 0;
-/* 		if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_dqbuf(dev,buf);
-		} 
- */		ret = videobuf_dqbuf(file,q,buf);
+		ret = videobuf_dqbuf(file,q,buf);
 		DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,buf->index));
 		return ret;
 	}
@@ -1180,29 +1093,18 @@
 		int *type = arg;
 		DEB_D(("VIDIOC_STREAMON, type:%d\n",*type));
 
-		if( 0 != ops->capture_begin ) {
-			if( 0 != (err = ops->capture_begin(fh))) {
+		if( 0 != (err = video_begin(fh))) {
 				return err;
 			}
-		}
-/* 		if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			err = overlay_streamon(dev);
-		} else { */
 		err = videobuf_streamon(file,q);
-/* 		} */
 		return err;
 	}
 	case VIDIOC_STREAMOFF: {
 		int *type = arg;
 
 		DEB_D(("VIDIOC_STREAMOFF, type:%d\n",*type));
-		if( 0 != ops->capture_end ) {
-			ops->capture_end(fh);
-		}
-/* 		if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-			return overlay_streamoff(dev);
-		} 
- */		err = videobuf_streamoff(file,q);
+		err = videobuf_streamoff(file,q);
+		video_end(fh, file);
 		return err;
 	}
 	case VIDIOCGMBUF:
@@ -1267,8 +1169,8 @@
 	DEB_CAP(("vbuf:%p\n",vb));
 
 	/* sanity checks */
-	if (fh->video_fmt.width  < 64 ||
-	    fh->video_fmt.height < 64 ||
+	if (fh->video_fmt.width  < 48 ||
+	    fh->video_fmt.height < 32 ||
 	    fh->video_fmt.width  > vv->standard->h_max_out ||
 	    fh->video_fmt.height > vv->standard->v_max_out) {
 		DEB_D(("w (%d) / h (%d) out of bounds.\n",fh->video_fmt.width,fh->video_fmt.height));
@@ -1407,8 +1309,9 @@
 }
 
 
-static void video_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+static void video_open(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_format *sfmt;
 
 	fh->video_fmt.width = 384;
@@ -1429,8 +1332,9 @@
 }
 
 
-static void video_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+static void video_close(struct saa7146_dev *dev, struct file *file)
 {
+	struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 	struct saa7146_vv *vv = dev->vv_data;
 	unsigned long flags;
 	
@@ -1443,10 +1347,8 @@
 	}
 	
 	if( fh == vv->streaming ) {
-		video_end(fh);		
+		video_end(fh, file);		
 	}
-
-	videobuf_queue_cancel(file,&fh->video_q);
 }
 
 
@@ -1489,7 +1391,7 @@
 		return -EAGAIN;
 	}
 	ret = videobuf_read_one(file,&fh->video_q , data, count, ppos);
-	video_end(fh);
+	video_end(fh, file);
 
 	/* restart overlay if it was active before */
 	if( 0 != restart_overlay ) {
@@ -1505,6 +1407,4 @@
 	.release = video_close,
 	.irq_done = video_irq_done,
 	.read = video_read,
-	.capture_begin = video_begin,
-	.capture_end = video_end,
 };
diff -Nru a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig
--- a/drivers/media/dvb/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/Kconfig	Thu Jan  8 23:00:23 2004
@@ -45,5 +45,9 @@
 	depends on DVB_CORE && PCI
 source "drivers/media/dvb/b2c2/Kconfig"
 
+comment "Supported BT878 Adapters"
+	depends on DVB_CORE && PCI
+source "drivers/media/dvb/bt8xx/Kconfig"
+
 endmenu
 
diff -Nru a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile
--- a/drivers/media/dvb/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/Makefile	Thu Jan  8 23:00:24 2004
@@ -2,5 +2,5 @@
 # Makefile for the kernel multimedia device drivers.
 #
 
-obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/
+obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/
 
diff -Nru a/drivers/media/dvb/b2c2/skystar2.c b/drivers/media/dvb/b2c2/skystar2.c
--- a/drivers/media/dvb/b2c2/skystar2.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/b2c2/skystar2.c	Thu Jan  8 23:00:24 2004
@@ -2,7 +2,19 @@
  * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
  *              based on the FlexCopII by B2C2,Inc.
  *
- * Copyright (C) 2003  V.C. , skystar@moldova.cc
+ * Copyright (C) 2003  Vadim Catana, skystar@moldova.cc
+ *
+ * FIX: DISEQC Tone Burst in flexcop_diseqc_ioctl()
+ * FIX: FULL soft DiSEqC for skystar2 (FlexCopII rev 130) VP310 equipped 
+ *     Vincenzo Di Massa, hawk.it at tiscalinet.it
+ * 	
+ * Converted to Linux coding style
+ * Misc reorganization, polishing, restyling
+ *     Roberto Ragusa, r.ragusa at libero.it
+ *       
+ * Added hardware filtering support, 
+ *     Niklas Peinecke, peinecke at gdv.uni-hannover.de
+ *
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -27,7 +39,6 @@
 
 #include "dvb_i2c.h"
 #include "dvb_frontend.h"
-#include "dvb_functions.h"
 
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/dmx.h>
@@ -38,14 +49,20 @@
 #include "demux.h"
 #include "dvb_net.h"
 
+#include "dvb_functions.h"
+
 static int debug = 0;
-#define dprintk(x...) do { if (debug) printk(x); } while (0)
+#define dprintk(x...)	do { if (debug>=1) printk(x); } while (0)
+#define ddprintk(x...)	do { if (debug>=2) printk(x); } while (0)
+static int enable_hw_filters = 2;
 
-#define SizeOfBufDMA1	0x3AC00
-#define SizeOfBufDMA2	0x758
+#define SIZE_OF_BUF_DMA1	0x3ac00
+#define SIZE_OF_BUF_DMA2	0x758
 
-struct dmaq {
+#define MAX_N_HW_FILTERS	(6+32)
+#define N_PID_SLOTS		256
 
+struct dmaq {
 	u32 bus_addr;
 	u32 head;
 	u32 tail;
@@ -53,31 +70,19 @@
 	u8 *buffer;
 };
 
-struct packet_header {
-
-	u32 sync_byte;
-	u32 transport_error_indicator;
-	u32 payload_unit_start_indicator;
-	u32 transport_priority;
-	u32 pid;
-	u32 transport_scrambling_control;
-	u32 adaptation_field_control;
-	u32 continuity_counter;
-};
 
 struct adapter {
-
 	struct pci_dev *pdev;
 
 	u8 card_revision;
 	u32 b2c2_revision;
-	u32 PidFilterMax;
-	u32 MacFilterMax;
+	u32 pid_filter_max;
+	u32 mac_filter_max;
 	u32 irq;
 	unsigned long io_mem;
 	unsigned long io_port;
 	u8 mac_addr[8];
-	u32 dwSramType;
+	u32 dw_sram_type;
 
 	struct dvb_adapter *dvb_adapter;
 	struct dvb_demux demux;
@@ -95,44 +100,42 @@
 	u32 dma_ctrl;
 	u32 dma_status;
 
-	u32 capturing;
+	int capturing;
 
 	spinlock_t lock;
 
-	u16 pids[0x27];
+	int useable_hw_filters;
+	u16 hw_pids[MAX_N_HW_FILTERS];
+	u16 pid_list[N_PID_SLOTS];
+	int pid_rc[N_PID_SLOTS];	// ref counters for the pids
+	int pid_count;
+	int whole_bandwidth_count;
 	u32 mac_filter;
 };
 
-#define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
-#define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
+#define write_reg_dw(adapter,reg,value) writel(value, adapter->io_mem + reg)
+#define read_reg_dw(adapter,reg) readl(adapter->io_mem + reg)
 
-static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
+static void write_reg_bitfield(struct adapter *adapter, u32 reg, u32 zeromask, u32 orvalue)
 {
 	u32 tmp;
 
-	tmp = ReadRegDW(adapter, reg);
-
-	if (operation == 1)
-		tmp = tmp | orvalue;
-	if (operation == 2)
-		tmp = tmp & andvalue;
-	if (operation == 3)
-		tmp = (tmp & andvalue) | orvalue;
-
-	WriteRegDW(adapter, reg, tmp);
+	tmp = read_reg_dw(adapter, reg);
+	tmp = (tmp & ~zeromask) | orvalue;
+	write_reg_dw(adapter, reg, tmp);
 }
 
 /* i2c functions */
-static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
+static int i2c_main_write_for_flex2(struct adapter *adapter, u32 command, u8 *buf, int retries)
 {
-	u32 i;
+	int i;
 	u32 value;
 
-	WriteRegDW(adapter, 0x100, 0);
-	WriteRegDW(adapter, 0x100, command);
+	write_reg_dw(adapter, 0x100, 0);
+	write_reg_dw(adapter, 0x100, command);
 
 	for (i = 0; i < retries; i++) {
-		value = ReadRegDW(adapter, 0x100);
+		value = read_reg_dw(adapter, 0x100);
 
 		if ((value & 0x40000000) == 0) {
 			if ((value & 0x81000000) == 0x80000000) {
@@ -141,11 +144,9 @@
 
 				return 1;
 			}
-
 		} else {
-
-			WriteRegDW(adapter, 0x100, 0);
-			WriteRegDW(adapter, 0x100, command);
+			write_reg_dw(adapter, 0x100, 0);
+			write_reg_dw(adapter, 0x100, command);
 		}
 	}
 
@@ -153,7 +154,7 @@
 }
 
 /* device = 0x10000000 for tuner, 0x20000000 for eeprom */
-static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
+static void i2c_main_setup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
 {
 	*command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
 
@@ -163,20 +164,20 @@
 		*command = *command | 0x01000000;
 }
 
-static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
+static int flex_i2c_read4(struct adapter *adapter, u32 device, u32 chip_addr, u16 addr, u8 *buf, u8 len)
 {
 	u32 command;
 	u32 value;
 
 	int result, i;
 
-	i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
+	i2c_main_setup(device, chip_addr, 1, addr, 0, len, &command);
 
-	result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
+	result = i2c_main_write_for_flex2(adapter, command, buf, 100000);
 
 	if ((result & 0xff) != 0) {
 		if (len > 1) {
-			value = ReadRegDW(adapter, 0x104);
+			value = read_reg_dw(adapter, 0x104);
 
 			for (i = 1; i < len; i++) {
 				buf[i] = value & 0xff;
@@ -188,7 +189,7 @@
 	return result;
 }
 
-static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
+static int flex_i2c_write4(struct adapter *adapter, u32 device, u32 chip_addr, u32 addr, u8 *buf, u8 len)
 {
 	u32 command;
 	u32 value;
@@ -202,12 +203,12 @@
 			value = value | buf[i - 1];
 		}
 
-		WriteRegDW(adapter, 0x104, value);
+		write_reg_dw(adapter, 0x104, value);
 	}
 
-	i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
+	i2c_main_setup(device, chip_addr, 0, addr, buf[0], len, &command);
 
-	return i2cMainWriteForFlex2(adapter, command, 0, 100000);
+	return i2c_main_write_for_flex2(adapter, command, 0, 100000);
 }
 
 static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
@@ -218,13 +219,13 @@
 	*ret = bus;
 }
 
-static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
+static u32 flex_i2c_read(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
 {
 	u32 chipaddr;
 	u32 bytes_to_transfer;
 	u8 *start;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	start = buf;
 
@@ -236,7 +237,7 @@
 
 		fixchipaddr(device, bus, addr, &chipaddr);
 
-		if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
+		if (flex_i2c_read4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
 			return buf - start;
 
 		buf = buf + bytes_to_transfer;
@@ -247,13 +248,13 @@
 	return buf - start;
 }
 
-static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
+static u32 flex_i2c_write(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
 {
 	u32 chipaddr;
 	u32 bytes_to_transfer;
 	u8 *start;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	start = buf;
 
@@ -265,7 +266,7 @@
 
 		fixchipaddr(device, bus, addr, &chipaddr);
 
-		if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
+		if (flex_i2c_write4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
 			return buf - start;
 
 		buf = buf + bytes_to_transfer;
@@ -284,75 +285,81 @@
 	if (down_interruptible(&tmp->i2c_sem))
 		return -ERESTARTSYS;
 
-	if (0) {
-		dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s: %d messages to transfer\n", __FUNCTION__, num);
 
 		for (i = 0; i < num; i++) {
-			printk("message %d: flags=%x, addr=0x%04x, buf=%p, len=%d \n", i, msgs[i].flags, msgs[i].addr, msgs[i].buf, msgs[i].len);
-		}
-	}
+		ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
+			 msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
 	
-	/* allow only the vp310 frontend to access the bus */
-	if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
+		/* allow only the mt312 and stv0299 frontends to access the bus */
+		if ((msgs[i].addr != 0x0e) && (msgs[i].addr != 0x68) && (msgs[i].addr != 0x61)) {
 		up(&tmp->i2c_sem);
 
 		return -EREMOTEIO;
 	}
+	}
 
-	if ((num == 1) && (msgs[0].buf != NULL)) {
-		if (msgs[0].flags == I2C_M_RD) {
-			ret = -EINVAL;
+	// read command
+	if ((num == 2) && (msgs[0].flags == 0) && (msgs[1].flags == I2C_M_RD) && (msgs[0].buf != NULL) && (msgs[1].buf != NULL)) {
 
-		} else {
+		ret = flex_i2c_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
 
-			// single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
-			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
+		up(&tmp->i2c_sem);
+
+		if (ret != msgs[1].len) {
+			printk("%s: read error !\n", __FUNCTION__);
+
+			for (i = 0; i < 2; i++) {
+				printk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
+				       msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
+		}
 
-			if (ret != msgs[0].len - 1)
-				ret = -EREMOTEIO;
-			else
-				ret = num;
+			return -EREMOTEIO;
 		}
 
-	} else if ((num == 2) && (msgs[1].buf != NULL)) {
+		return num;
+	}
+	// write command
+	for (i = 0; i < num; i++) {
 
-		// i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
-		if (msgs[1].flags == I2C_M_RD) {
-			ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
+		if ((msgs[i].flags != 0) || (msgs[i].buf == NULL) || (msgs[i].len < 2))
+			return -EINVAL;
 
-		} else {
+		ret = flex_i2c_write(tmp, 0x10000000, msgs[i].addr, msgs[i].buf[0], &msgs[i].buf[1], msgs[i].len - 1);
 
-			ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
+		up(&tmp->i2c_sem);
+
+		if (ret != msgs[0].len - 1) {
+			printk("%s: write error %i !\n", __FUNCTION__, ret);
+
+			printk("message %d: flags=0x%x, addr=0x%x, buf[0]=0x%x, len=%d \n", i,
+			       msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
+
+			return -EREMOTEIO;
 		}
 
-		if (ret != msgs[1].len)
-			ret = -EREMOTEIO;
-		else
-			ret = num;
+		return num;
 	}
 
-	up(&tmp->i2c_sem);
+	printk("%s: unknown command format !\n", __FUNCTION__);
 
-	/* master xfer functions always return the number of successfully
-	   transmitted messages, not the number of transmitted bytes.
-	   return -EREMOTEIO in case of failure. */
-	return ret;
+	return -EINVAL;
 }
 
 /* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
    but it seems that FlexCopII can work with more than one chip) */
-static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
+static void sram_set_net_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xfffffffc) | (dest & 3);
 
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -360,19 +367,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
+static void sram_set_cai_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xfffffff3) | ((dest & 3) << 2);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -380,19 +387,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
+static void sram_set_cao_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xffffffcf) | ((dest & 3) << 4);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -400,19 +407,19 @@
 /*	return tmp; */
 }
 
-static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
+static void sram_set_media_dest(struct adapter *adapter, u8 dest)
 {
 	u32 tmp;
 
 	udelay(1000);
 
-	tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
+	tmp = (read_reg_dw(adapter, 0x714) & 0xffffff3f) | ((dest & 3) << 6);
 
 	udelay(1000);
 	udelay(1000);
 
-	WriteRegDW(adapter, 0x714, tmp);
-	WriteRegDW(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
+	write_reg_dw(adapter, 0x714, tmp);
 
 	udelay(1000);
 
@@ -429,16 +436,17 @@
     bits 28-29 : memory bank selector
     bit  31    : busy flag
 */
-static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
+static void flex_sram_write(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
 {
-	u32 i, command, retries;
+	int i, retries;
+	u32 command;
 
 	for (i = 0; i < len; i++) {
 		command = bank | addr | 0x04000000 | (*buf << 0x10);
 
 		retries = 2;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -446,23 +454,24 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		WriteRegDW(adapter, 0x700, command);
+		write_reg_dw(adapter, 0x700, command);
 
 		buf++;
 		addr++;
 	}
 }
 
-static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
+static void flex_sram_read(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
 {
-	u32 i, command, value, retries;
+	int i, retries;
+	u32 command, value;
 
 	for (i = 0; i < len; i++) {
 		command = bank | addr | 0x04008000;
 
 		retries = 10000;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -470,11 +479,11 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		WriteRegDW(adapter, 0x700, command);
+		write_reg_dw(adapter, 0x700, command);
 
 		retries = 10000;
 
-		while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
+		while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
 			mdelay(1);
 			retries--;
 		};
@@ -482,7 +491,7 @@
 		if (retries == 0)
 			printk("%s: SRAM timeout\n", __FUNCTION__);
 
-		value = ReadRegDW(adapter, 0x700) >> 0x10;
+		value = read_reg_dw(adapter, 0x700) >> 0x10;
 
 		*buf = (value & 0xff);
 
@@ -491,47 +500,47 @@
 	}
 }
 
-static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
+static void sram_writeChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
 {
 	u32 bank;
 
 	bank = 0;
 
-	if (adapter->dwSramType == 0x20000) {
-		bank = (addr & 0x18000) << 0x0D;
+	if (adapter->dw_sram_type == 0x20000) {
+		bank = (addr & 0x18000) << 0x0d;
 	}
 
-	if (adapter->dwSramType == 0x00000) {
-		if ((addr >> 0x0F) == 0)
+	if (adapter->dw_sram_type == 0x00000) {
+		if ((addr >> 0x0f) == 0)
 			bank = 0x20000000;
 		else
 			bank = 0x10000000;
 	}
 
-	FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
+	flex_sram_write(adapter, bank, addr & 0x7fff, buf, len);
 }
 
-static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
+static void sram_readChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
 {
 	u32 bank;
 
 	bank = 0;
 
-	if (adapter->dwSramType == 0x20000) {
-		bank = (addr & 0x18000) << 0x0D;
+	if (adapter->dw_sram_type == 0x20000) {
+		bank = (addr & 0x18000) << 0x0d;
 	}
 
-	if (adapter->dwSramType == 0x00000) {
-		if ((addr >> 0x0F) == 0)
+	if (adapter->dw_sram_type == 0x00000) {
+		if ((addr >> 0x0f) == 0)
 			bank = 0x20000000;
 		else
 			bank = 0x10000000;
 	}
 
-	FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
+	flex_sram_read(adapter, bank, addr & 0x7fff, buf, len);
 }
 
-static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
+static void sram_read(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
 {
 	u32 length;
 
@@ -541,11 +550,11 @@
 		// check if the address range belongs to the same 
 		// 32K memory chip. If not, the data is read from 
 		// one chip at a time.
-		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
+		if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+			length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
 		}
 
-		SRAM_readChunk(adapter, addr, buf, length);
+		sram_readChunk(adapter, addr, buf, length);
 
 		addr = addr + length;
 		buf = buf + length;
@@ -553,7 +562,7 @@
 	}
 }
 
-static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
+static void sram_write(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
 {
 	u32 length;
 
@@ -563,11 +572,11 @@
 		// check if the address range belongs to the same 
 		// 32K memory chip. If not, the data is written to
 		// one chip at a time.
-		if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-			length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
+		if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
+			length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
 		}
 
-		SRAM_writeChunk(adapter, addr, buf, length);
+		sram_writeChunk(adapter, addr, buf, length);
 
 		addr = addr + length;
 		buf = buf + length;
@@ -575,92 +584,92 @@
 	}
 }
 
-static void SRAM_setSize(struct adapter *adapter, u32 mask)
+static void sram_set_size(struct adapter *adapter, u32 mask)
 {
-	WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
+	write_reg_dw(adapter, 0x71c, (mask | (~0x30000 & read_reg_dw(adapter, 0x71c))));
 }
 
-static void SRAM_init(struct adapter *adapter)
+static void sram_init(struct adapter *adapter)
 {
 	u32 tmp;
 
-	tmp = ReadRegDW(adapter, 0x71C);
+	tmp = read_reg_dw(adapter, 0x71c);
 
-	WriteRegDW(adapter, 0x71C, 1);
+	write_reg_dw(adapter, 0x71c, 1);
 
-	if (ReadRegDW(adapter, 0x71C) != 0) {
-		WriteRegDW(adapter, 0x71C, tmp);
+	if (read_reg_dw(adapter, 0x71c) != 0) {
+		write_reg_dw(adapter, 0x71c, tmp);
 
-		adapter->dwSramType = tmp & 0x30000;
+		adapter->dw_sram_type = tmp & 0x30000;
 
-		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
+		ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
 
 	} else {
 
-		adapter->dwSramType = 0x10000;
+		adapter->dw_sram_type = 0x10000;
 
-		dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
+		ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
 	}
 
 	/* return value is never used? */
-/*	return adapter->dwSramType; */
+/*	return adapter->dw_sram_type; */
 }
 
-static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
+static int sram_test_location(struct adapter *adapter, u32 mask, u32 addr)
 {
 	u8 tmp1, tmp2;
 
 	dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
 
-	SRAM_setSize(adapter, mask);
-	SRAM_init(adapter);
+	sram_set_size(adapter, mask);
+	sram_init(adapter);
 
-	tmp2 = 0xA5;
-	tmp1 = 0x4F;
+	tmp2 = 0xa5;
+	tmp1 = 0x4f;
 
-	SRAM_write(adapter, addr, &tmp2, 1);
-	SRAM_write(adapter, addr + 4, &tmp1, 1);
+	sram_write(adapter, addr, &tmp2, 1);
+	sram_write(adapter, addr + 4, &tmp1, 1);
 
 	tmp2 = 0;
 
 	mdelay(20);
 
-	SRAM_read(adapter, addr, &tmp2, 1);
-	SRAM_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
 
-	dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
+	dprintk("%s: wrote 0xa5, read 0x%2x\n", __FUNCTION__, tmp2);
 
-	if (tmp2 != 0xA5)
+	if (tmp2 != 0xa5)
 		return 0;
 
-	tmp2 = 0x5A;
-	tmp1 = 0xF4;
+	tmp2 = 0x5a;
+	tmp1 = 0xf4;
 
-	SRAM_write(adapter, addr, &tmp2, 1);
-	SRAM_write(adapter, addr + 4, &tmp1, 1);
+	sram_write(adapter, addr, &tmp2, 1);
+	sram_write(adapter, addr + 4, &tmp1, 1);
 
 	tmp2 = 0;
 
 	mdelay(20);
 
-	SRAM_read(adapter, addr, &tmp2, 1);
-	SRAM_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
+	sram_read(adapter, addr, &tmp2, 1);
 
-	dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
+	dprintk("%s: wrote 0x5a, read 0x%2x\n", __FUNCTION__, tmp2);
 
-	if (tmp2 != 0x5A)
+	if (tmp2 != 0x5a)
 		return 0;
 
 	return 1;
 }
 
-static u32 SRAM_length(struct adapter * adapter)
+static u32 sram_length(struct adapter *adapter)
 {
-	if (adapter->dwSramType == 0x10000)
+	if (adapter->dw_sram_type == 0x10000)
 		return 32768;	//  32K
-	if (adapter->dwSramType == 0x00000)
+	if (adapter->dw_sram_type == 0x00000)
 		return 65536;	//  64K        
-	if (adapter->dwSramType == 0x20000)
+	if (adapter->dw_sram_type == 0x20000)
 		return 131072;	// 128K
 
 	return 32768;		// 32K
@@ -674,103 +683,104 @@
    FlexCop works only with one bank at a time. The bank is selected
    by bits 28-29 of the 0x700 register.
   
-   bank 0 covers addresses 0x00000-0x07FFF
-   bank 1 covers addresses 0x08000-0x0FFFF
-   bank 2 covers addresses 0x10000-0x17FFF
-   bank 3 covers addresses 0x18000-0x1FFFF
+   bank 0 covers addresses 0x00000-0x07fff
+   bank 1 covers addresses 0x08000-0x0ffff
+   bank 2 covers addresses 0x10000-0x17fff
+   bank 3 covers addresses 0x18000-0x1ffff
 */
-static int SramDetectForFlex2(struct adapter *adapter)
+static int sram_detect_for_flex2(struct adapter *adapter)
 {
 	u32 tmp, tmp2, tmp3;
 
 	dprintk("%s:\n", __FUNCTION__);
 
-	tmp = ReadRegDW(adapter, 0x208);
-	WriteRegDW(adapter, 0x208, 0);
+	tmp = read_reg_dw(adapter, 0x208);
+	write_reg_dw(adapter, 0x208, 0);
 
-	tmp2 = ReadRegDW(adapter, 0x71C);
+	tmp2 = read_reg_dw(adapter, 0x71c);
 
 	dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
 
-	WriteRegDW(adapter, 0x71C, 1);
+	write_reg_dw(adapter, 0x71c, 1);
 
-	tmp3 = ReadRegDW(adapter, 0x71C);
+	tmp3 = read_reg_dw(adapter, 0x71c);
 
 	dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
 
-	WriteRegDW(adapter, 0x71C, tmp2);
+	write_reg_dw(adapter, 0x71c, tmp2);
 
 	// check for internal SRAM ???
 	tmp3--;
 	if (tmp3 != 0) {
-		SRAM_setSize(adapter, 0x10000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+		sram_set_size(adapter, 0x10000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 32K\n", __FUNCTION__);
 
 		return 32;
 	}
 
-	if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
-		SRAM_setSize(adapter, 0x20000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x20000, 0x18000) != 0) {
+		sram_set_size(adapter, 0x20000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 128K\n", __FUNCTION__);
 
 		return 128;
 	}
 
-	if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
-		SRAM_setSize(adapter, 0x00000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x00000, 0x10000) != 0) {
+		sram_set_size(adapter, 0x00000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 64K\n", __FUNCTION__);
 
 		return 64;
 	}
 
-	if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
-		SRAM_setSize(adapter, 0x10000);
-		SRAM_init(adapter);
-		WriteRegDW(adapter, 0x208, tmp);
+	if (sram_test_location(adapter, 0x10000, 0x00000) != 0) {
+		sram_set_size(adapter, 0x10000);
+		sram_init(adapter);
+		write_reg_dw(adapter, 0x208, tmp);
 
 		dprintk("%s: sram size = 32K\n", __FUNCTION__);
 
 		return 32;
 	}
 
-	SRAM_setSize(adapter, 0x10000);
-	SRAM_init(adapter);
-	WriteRegDW(adapter, 0x208, tmp);
+	sram_set_size(adapter, 0x10000);
+	sram_init(adapter);
+	write_reg_dw(adapter, 0x208, tmp);
 
 	dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
 
 	return 0;
 }
 
-static void SLL_detectSramSize(struct adapter *adapter)
+static void sll_detect_sram_size(struct adapter *adapter)
 {
-	SramDetectForFlex2(adapter);
+	sram_detect_for_flex2(adapter);
 }
+
 /* EEPROM (Skystar2 has one "24LC08B" chip on board) */
 /*
-static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
+static int eeprom_write(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
 {
-	return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
+	return flex_i2c_write(adapter, 0x20000000, 0x50, addr, buf, len);
 }
 */
 
-static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
+static int eeprom_read(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
 {
-	return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
+	return flex_i2c_read(adapter, 0x20000000, 0x50, addr, buf, len);
 }
 
-u8 calc_LRC(u8 * buf, u32 len)
+u8 calc_lrc(u8 *buf, int len)
 {
-	u32 i;
+	int i;
 	u8 sum;
 
 	sum = 0;
@@ -781,13 +791,13 @@
 	return sum;
 }
 
-static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
+static int eeprom_lrc_read(struct adapter *adapter, u32 addr, u32 len, u8 *buf, int retries)
 {
 	int i;
 
 	for (i = 0; i < retries; i++) {
-		if (EEPROM_read(adapter, addr, buf, len) == len) {
-			if (calc_LRC(buf, len - 1) == buf[len - 1])
+		if (eeprom_read(adapter, addr, buf, len) == len) {
+			if (calc_lrc(buf, len - 1) == buf[len - 1])
 				return 1;
 		}
 	}
@@ -796,13 +806,13 @@
 }
 
 /*
-static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
+static int eeprom_lrc_write(struct adapter *adapter, u32 addr, u32 len, u8 *wbuf, u8 *rbuf, int retries)
 {
 	int i;
 
 	for (i = 0; i < retries; i++) {
-		if (EEPROM_write(adapter, addr, wbuf, len) == len) {
-			if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
+		if (eeprom_write(adapter, addr, wbuf, len) == len) {
+			if (eeprom_lrc_read(adapter, addr, len, rbuf, retries) == 1)
 				return 1;
 		}
 	}
@@ -811,33 +821,11 @@
 }
 */
 
-/* These functions could be called from the initialization routine 
-   to unlock SkyStar2 cards, locked by "Europe On Line".
-        
-   in cards from "Europe On Line" the key is:
-
-       u8 key[20] = {
- 	    0xB2, 0x01, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
-       };
-
-       LRC = 0xB3;
-
-  in unlocked cards the key is:
-
-       u8 key[20] = {
- 	    0xB2, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
- 	    0x00, 0x00, 0x00, 0x00,
-       };
 
-      LRC = 0xB2;
-*/
+/* These functions could be used to unlock SkyStar2 cards. */
+
 /*
-static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
+static int eeprom_writeKey(struct adapter *adapter, u8 *key, u32 len)
 {
 	u8 rbuf[20];
 	u8 wbuf[20];
@@ -850,37 +838,38 @@
 	wbuf[16] = 0;
 	wbuf[17] = 0;
 	wbuf[18] = 0;
-	wbuf[19] = calc_LRC(wbuf, 19);
+	wbuf[19] = calc_lrc(wbuf, 19);
 
-	return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
+	return eeprom_lrc_write(adapter, 0x3e4, 20, wbuf, rbuf, 4);
 }
-*/
-static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
+
+static int eeprom_readKey(struct adapter *adapter, u8 *key, u32 len)
 {
 	u8 buf[20];
 
 	if (len != 16)
 		return 0;
 
-	if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
+	if (eeprom_lrc_read(adapter, 0x3e4, 20, buf, 4) == 0)
 		return 0;
 
 	memcpy(key, buf, len);
 
 	return 1;
 }
+*/
 
-static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
+static int eeprom_get_mac_addr(struct adapter *adapter, char type, u8 *mac)
 {
 	u8 tmp[8];
 
-	if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
+	if (eeprom_lrc_read(adapter, 0x3f8, 8, tmp, 4) != 0) {
 		if (type != 0) {
 			mac[0] = tmp[0];
 			mac[1] = tmp[1];
 			mac[2] = tmp[2];
-			mac[3] = 0xFE;
-			mac[4] = 0xFF;
+			mac[3] = 0xfe;
+			mac[4] = 0xff;
 			mac[5] = tmp[3];
 			mac[6] = tmp[4];
 			mac[7] = tmp[5];
@@ -912,7 +901,7 @@
 }
 
 /*
-static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
+static char eeprom_set_mac_addr(struct adapter *adapter, char type, u8 *mac)
 {
 	u8 tmp[8];
 
@@ -935,9 +924,9 @@
 	}
 
 	tmp[6] = 0;
-	tmp[7] = calc_LRC(tmp, 7);
+	tmp[7] = calc_lrc(tmp, 7);
 
-	if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
+	if (eeprom_write(adapter, 0x3f8, tmp, 8) == 8)
 		return 1;
 
 	return 0;
@@ -945,529 +934,319 @@
 */
 
 /* PID filter */
-static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
-
-	} else {
 
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
+/* every flexcop has 6 "lower" hw PID filters     */
+/* these are enabled by setting bits 0-5 of 0x208 */
+/* for the 32 additional filters we have to select one */
+/* of them through 0x310 and modify through 0x314 */
+/* op: 0=disable, 1=enable */
+static void filter_enable_hw_filter(struct adapter *adapter, int id, u8 op)
+{
+	dprintk("%s: id=%d op=%d\n", __FUNCTION__, id, op);
+	if (id <= 5) {
+		u32 mask = (0x00000001 << id);
+		write_reg_bitfield(adapter, 0x208, mask, op ? mask : 0);
+	} else {
+		/* select */
+		write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
+		/* modify */
+		write_reg_bitfield(adapter, 0x314, 0x00006000, op ? 0x00004000 : 0);
 	}
 }
 
-static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
+/* this sets the PID that should pass the specified filter */
+static void pid_set_hw_pid(struct adapter *adapter, int id, u16 pid)
+{
+	dprintk("%s: id=%d  pid=%d\n", __FUNCTION__, id, pid);
+	if (id <= 5) {
+		u32 adr = 0x300 + ((id & 6) << 1);
+		int shift = (id & 1) ? 16 : 0;
+		dprintk("%s: id=%d  addr=%x %c  pid=%d\n", __FUNCTION__, id, adr, (id & 1) ? 'h' : 'l', pid);
+		write_reg_bitfield(adapter, adr, (0x7fff) << shift, (pid & 0x1fff) << shift);
+	} else {
+		/* select */
+		write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
+		/* modify */
+		write_reg_bitfield(adapter, 0x314, 0x1fff, pid & 0x1fff);
 	}
 }
 
-static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
-	}
-}
-
-static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
-	}
-}
-
-static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
-	}
-}
-
-static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
-{
-	dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
-	}
-}
 
 /*
-static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
+static void filter_enable_null_filter(struct adapter *adapter, u32 op)
 {
 	dprintk("%s: op=%x\n", __FUNCTION__, op);
 
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000040, op?0x00000040:0);
 }
 */
 
-static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
+static void filter_enable_mask_filter(struct adapter *adapter, u32 op)
 {
 	dprintk("%s: op=%x\n", __FUNCTION__, op);
 
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000080, op ? 0x00000080 : 0);
 }
 
 
-static void CtrlEnableMAC(struct adapter *adapter, u32 op)
+static void ctrl_enable_mac(struct adapter *adapter, u32 op)
 {
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00004000, op ? 0x00004000 : 0);
 }
 
-static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
+static int ca_set_mac_dst_addr_filter(struct adapter *adapter, u8 *mac)
 {
 	u32 tmp1, tmp2;
 
 	tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
 	tmp2 = (mac[5] << 0x08) | mac[4];
 
-	WriteRegDW(adapter, 0x418, tmp1);
-	WriteRegDW(adapter, 0x41C, tmp2);
+	write_reg_dw(adapter, 0x418, tmp1);
+	write_reg_dw(adapter, 0x41c, tmp2);
 
 	return 0;
 }
 
 /*
-static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
+static void set_ignore_mac_filter(struct adapter *adapter, u8 op)
 {
 	if (op != 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
-
+		write_reg_bitfield(adapter, 0x208, 0x00004000, 0);
 		adapter->mac_filter = 1;
-
 	} else {
-
 		if (adapter->mac_filter != 0) {
 			adapter->mac_filter = 0;
-
-			WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
+			write_reg_bitfield(adapter, 0x208, 0x00004000, 0x00004000);
 		}
 	}
 }
 */
 
 /*
-static void CheckNullFilterEnable(struct adapter *adapter)
+static void check_null_filter_enable(struct adapter *adapter)
 {
-	FilterEnableNullFilter(adapter, 1);
-	FilterEnableMaskFilter(adapter, 1);
+	filter_enable_null_filter(adapter, 1);
+	filter_enable_mask_filter(adapter, 1);
 }
 */
 
-static void InitPIDsInfo(struct adapter *adapter)
-{
-	int i;
-
-	for (i = 0; i < 0x27; i++)
-		adapter->pids[i] = 0x1FFF;
-}
-
-static int CheckPID(struct adapter *adapter, u16 pid)
-{
-	u32 i;
-
-	if (pid == 0x1FFF)
-		return 0;
-
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == pid)
-			return 1;
-	}
-
-	return 0;
-}
-
-static void PidSetGroupPID(struct adapter * adapter, u32 pid)
+static void pid_set_group_pid(struct adapter *adapter, u16 pid)
 {
 	u32 value;
 
 	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
-
-	WriteRegDW(adapter, 0x30C, value);
-
-	/* return value is never used? */
-/*	return value; */
+	value = (pid & 0x3fff) | (read_reg_dw(adapter, 0x30c) & 0xffff0000);
+	write_reg_dw(adapter, 0x30c, value);
 }
 
-static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
+static void pid_set_group_mask(struct adapter *adapter, u16 pid)
 {
 	u32 value;
 
 	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
-
-	WriteRegDW(adapter, 0x30C, value);
-
-	/* return value is never used? */
-/*	return value; */
+	value = ((pid & 0x3fff) << 0x10) | (read_reg_dw(adapter, 0x30c) & 0xffff);
+	write_reg_dw(adapter, 0x30c, value);
 }
 
-static void PidSetStream1PID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
-
-	WriteRegDW(adapter, 0x300, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetStream2PID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
-
-	WriteRegDW(adapter, 0x300, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetPcrPID(struct adapter * adapter, u32 pid)
+/*
+static int pid_get_group_pid(struct adapter *adapter)
 {
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
-
-	WriteRegDW(adapter, 0x304, value);
-
-	/* return value is never used? */
-/*	return value; */
+	return read_reg_dw(adapter, 0x30c) & 0x00001fff;
 }
 
-static void PidSetPmtPID(struct adapter * adapter, u32 pid)
+static int pid_get_group_mask(struct adapter *adapter)
 {
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
-
-	WriteRegDW(adapter, 0x304, value);
-
-	/* return value is never used? */
-/*	return value; */
-}
-
-static void PidSetEmmPID(struct adapter * adapter, u32 pid)
-{
-	u32 value;
-
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
-
-	WriteRegDW(adapter, 0x308, value);
-
-	/* return value is never used? */
-/*	return value; */
+	return (read_reg_dw(adapter, 0x30c) >> 0x10)& 0x00001fff;
 }
+*/
 
-static void PidSetEcmPID(struct adapter * adapter, u32 pid)
+/*
+static void reset_hardware_pid_filter(struct adapter *adapter)
 {
-	u32 value;
+	pid_set_stream1_pid(adapter, 0x1fff);
 
-	dprintk("%s: pid=%x\n", __FUNCTION__, pid);
-
-	value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
+	pid_set_stream2_pid(adapter, 0x1fff);
+	filter_enable_stream2_filter(adapter, 0);
 
-	WriteRegDW(adapter, 0x308, value);
+	pid_set_pcr_pid(adapter, 0x1fff);
+	filter_enable_pcr_filter(adapter, 0);
 
-	/* return value is never used? */
-/*	return value; */
-}
+	pid_set_pmt_pid(adapter, 0x1fff);
+	filter_enable_pmt_filter(adapter, 0);
 
-static int PidGetStream1PID(struct adapter * adapter)
-{
-	return ReadRegDW(adapter, 0x300) & 0x00001FFF;
-}
+	pid_set_ecm_pid(adapter, 0x1fff);
+	filter_enable_ecm_filter(adapter, 0);
 
-static int PidGetStream2PID(struct adapter * adapter)
-{
-	return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
+	pid_set_emm_pid(adapter, 0x1fff);
+	filter_enable_emm_filter(adapter, 0);
 }
+*/
 
-static int PidGetPcrPID(struct adapter * adapter)
+static void init_pids(struct adapter *adapter)
 {
-	return ReadRegDW(adapter, 0x304) & 0x00001FFF;
-}
+	int i;
 
-static int PidGetPmtPID(struct adapter * adapter)
-{
-	return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
+	adapter->pid_count = 0;
+	adapter->whole_bandwidth_count = 0;
+	for (i = 0; i < adapter->useable_hw_filters; i++) {
+		dprintk("%s: setting filter %d to 0x1fff\n", __FUNCTION__, i);
+		adapter->hw_pids[i] = 0x1fff;
+		pid_set_hw_pid(adapter, i, 0x1fff);
 }
 
-static int PidGetEmmPID(struct adapter * adapter)
-{
-	return ReadRegDW(adapter, 0x308) & 0x00001FFF;
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0x1fe0);
 }
 
-static int PidGetEcmPID(struct adapter * adapter)
+static void open_whole_bandwidth(struct adapter *adapter)
 {
-	return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
+	dprintk("%s:\n", __FUNCTION__);
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0);
+/*
+	filter_enable_mask_filter(adapter, 1);
+*/
 }
 
-static int PidGetGroupPID(struct adapter * adapter)
+static void close_whole_bandwidth(struct adapter *adapter)
 {
-	return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
+	dprintk("%s:\n", __FUNCTION__);
+	pid_set_group_pid(adapter, 0);
+	pid_set_group_mask(adapter, 0x1fe0);
+/*
+	filter_enable_mask_filter(adapter, 1);
+*/
 }
 
-static int PidGetGroupMASK(struct adapter * adapter)
+static void whole_bandwidth_inc(struct adapter *adapter)
 {
-	return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
+	if (adapter->whole_bandwidth_count++ == 0)
+		open_whole_bandwidth(adapter);
 }
 
-/*
-static void ResetHardwarePIDFilter(struct adapter *adapter)
+static void whole_bandwidth_dec(struct adapter *adapter)
 {
-	PidSetStream1PID(adapter, 0x1FFF);
-
-	PidSetStream2PID(adapter, 0x1FFF);
-	FilterEnableStream2Filter(adapter, 0);
-
-	PidSetPcrPID(adapter, 0x1FFF);
-	FilterEnablePcrFilter(adapter, 0);
-
-	PidSetPmtPID(adapter, 0x1FFF);
-	FilterEnablePmtFilter(adapter, 0);
-
-	PidSetEcmPID(adapter, 0x1FFF);
-	FilterEnableEcmFilter(adapter, 0);
-
-	PidSetEmmPID(adapter, 0x1FFF);
-	FilterEnableEmmFilter(adapter, 0);
+	if (--adapter->whole_bandwidth_count <= 0)
+		close_whole_bandwidth(adapter);
 }
-*/
 
-static void OpenWholeBandwidth(struct adapter *adapter)
+/* The specified PID has to be let through the
+   hw filters.
+   We try to allocate an hardware filter and open whole
+   bandwidth when allocation is impossible.
+   All pids<=0x1f pass through the group filter.
+   Returns 1 on success, -1 on error */
+static int add_hw_pid(struct adapter *adapter, u16 pid)
 {
-	PidSetGroupPID(adapter, 0);
-
-	PidSetGroupMASK(adapter, 0);
-
-	FilterEnableMaskFilter(adapter, 1);
-}
+	int i;
 
-static int AddHwPID(struct adapter *adapter, u32 pid)
-{
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid <= 0x1F)
+	if (pid <= 0x1f)
 		return 1;
 
-	if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
-		return 0;
-
-	if (PidGetStream1PID(adapter) == 0x1FFF) {
-		PidSetStream1PID(adapter, pid & 0xFFFF);
-
-		FilterEnableStream1Filter(adapter, 1);
-
-		return 1;
-	}
-
-	if (PidGetStream2PID(adapter) == 0x1FFF) {
-		PidSetStream2PID(adapter, (pid & 0xFFFF));
-
-		FilterEnableStream2Filter(adapter, 1);
-
-		return 1;
-	}
-
-	if (PidGetPcrPID(adapter) == 0x1FFF) {
-		PidSetPcrPID(adapter, (pid & 0xFFFF));
-
-		FilterEnablePcrFilter(adapter, 1);
-
+	/* we can't use a filter for 0x2000, so no search */
+	if (pid != 0x2000) {
+		/* find an unused hardware filter */
+		for (i = 0; i < adapter->useable_hw_filters; i++) {
+			dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
+			if (adapter->hw_pids[i] == 0x1fff) {
+				dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
+				adapter->hw_pids[i] = pid;
+				pid_set_hw_pid(adapter, i, pid);
+				filter_enable_hw_filter(adapter, i, 1);
 		return 1;
 	}
-
-	if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetPmtPID(adapter, (pid & 0xFFFF));
-
-		FilterEnablePmtFilter(adapter, 1);
-
-		return 1;
 	}
-
-	if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetEmmPID(adapter, (pid & 0xFFFF));
-
-		FilterEnableEmmFilter(adapter, 1);
-
-		return 1;
 	}
-
-	if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
-		PidSetEcmPID(adapter, (pid & 0xFFFF));
-
-		FilterEnableEcmFilter(adapter, 1);
-
+	/* if we have not used a filter, this pid depends on whole bandwidth */
+	dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
+	whole_bandwidth_inc(adapter);
 		return 1;
 	}
 
-	return -1;
-}
-
-static int RemoveHwPID(struct adapter *adapter, u32 pid)
+/* returns -1 if the pid was not present in the filters */
+static int remove_hw_pid(struct adapter *adapter, u16 pid)
 {
+	int i;
+
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid <= 0x1F)
+	if (pid <= 0x1f)
 		return 1;
 
-	if (PidGetStream1PID(adapter) == pid) {
-		PidSetStream1PID(adapter, 0x1FFF);
-
+	/* we can't use a filter for 0x2000, so no search */
+	if (pid != 0x2000) {
+		for (i = 0; i < adapter->useable_hw_filters; i++) {
+			dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
+			if (adapter->hw_pids[i] == pid) {	// find the pid slot
+				dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
+				adapter->hw_pids[i] = 0x1fff;
+				pid_set_hw_pid(adapter, i, 0x1fff);
+				filter_enable_hw_filter(adapter, i, 0);
 		return 1;
 	}
-
-	if (PidGetStream2PID(adapter) == pid) {
-		PidSetStream2PID(adapter, 0x1FFF);
-
-		FilterEnableStream2Filter(adapter, 0);
-
-		return 1;
 	}
-
-	if (PidGetPcrPID(adapter) == pid) {
-		PidSetPcrPID(adapter, 0x1FFF);
-
-		FilterEnablePcrFilter(adapter, 0);
-
-		return 1;
 	}
-
-	if (PidGetPmtPID(adapter) == pid) {
-		PidSetPmtPID(adapter, 0x1FFF);
-
-		FilterEnablePmtFilter(adapter, 0);
-
+	/* if we have not used a filter, this pid depended on whole bandwith */
+	dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
+	whole_bandwidth_dec(adapter);
 		return 1;
 	}
 
-	if (PidGetEmmPID(adapter) == pid) {
-		PidSetEmmPID(adapter, 0x1FFF);
-
-		FilterEnableEmmFilter(adapter, 0);
-
-		return 1;
-	}
-
-	if (PidGetEcmPID(adapter) == pid) {
-		PidSetEcmPID(adapter, 0x1FFF);
-
-		FilterEnableEcmFilter(adapter, 0);
-
-		return 1;
-	}
-
-	return -1;
-}
-
-static int AddPID(struct adapter *adapter, u32 pid)
+/* Adds a PID to the filters.
+   Adding a pid more than once is possible, we keep reference counts.
+   Whole stream available through pid==0x2000.
+   Returns 1 on success, -1 on error */
+static int add_pid(struct adapter *adapter, u16 pid)
 {
 	int i;
 
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid > 0x1FFE)
+	if (pid > 0x1ffe && pid != 0x2000)
 		return -1;
 
-	if (CheckPID(adapter, pid) == 1)
+	// check if the pid is already present
+	for (i = 0; i < adapter->pid_count; i++)
+		if (adapter->pid_list[i] == pid) {
+			adapter->pid_rc[i]++;	// increment ref counter
 		return 1;
+		}
 
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == 0x1FFF)	// find free pid filter
-		{
-			adapter->pids[i] = pid;
-
-			if (AddHwPID(adapter, pid) < 0)
-				OpenWholeBandwidth(adapter);
+	if (adapter->pid_count == N_PID_SLOTS)
+		return -1;	// no more pids can be added
+	adapter->pid_list[adapter->pid_count] = pid;	// register pid
+	adapter->pid_rc[adapter->pid_count] = 1;
+	adapter->pid_count++;
+	// hardware setting
+	add_hw_pid(adapter, pid);
 
 			return 1;
 		}
-	}
-
-	return -1;
-}
 
-static int RemovePID(struct adapter *adapter, u32 pid)
+/* Removes a PID from the filters. */
+static int remove_pid(struct adapter *adapter, u16 pid)
 {
-	u32 i;
+	int i;
 
 	dprintk("%s: pid=%d\n", __FUNCTION__, pid);
 
-	if (pid > 0x1FFE)
+	if (pid > 0x1ffe && pid != 0x2000)
 		return -1;
 
-	for (i = 0; i < 0x27; i++) {
-		if (adapter->pids[i] == pid) {
-			adapter->pids[i] = 0x1FFF;
-
-			RemoveHwPID(adapter, pid);
-
+	// check if the pid is present (it must be!)
+	for (i = 0; i < adapter->pid_count; i++) {
+		if (adapter->pid_list[i] == pid) {
+			adapter->pid_rc[i]--;
+			if (adapter->pid_rc[i] <= 0) {
+				// remove from the list
+				adapter->pid_count--;
+				adapter->pid_list[i]=adapter->pid_list[adapter->pid_count];
+				adapter->pid_rc[i] = adapter->pid_rc[adapter->pid_count];
+				// hardware setting
+				remove_hw_pid(adapter, pid);
+			}
 			return 1;
 		}
 	}
@@ -1475,21 +1254,16 @@
 	return -1;
 }
 
+
 /* dma & irq */
-static void CtrlEnableSmc(struct adapter *adapter, u32 op)
+static void ctrl_enable_smc(struct adapter *adapter, u32 op)
 {
-	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
-
-	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
-	}
+	write_reg_bitfield(adapter, 0x208, 0x00000800, op ? 0x00000800 : 0);
 }
 
-static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
+static void dma_enable_disable_irq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
 {
-	adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
+	adapter->dma_ctrl = adapter->dma_ctrl & 0x000f0000;
 
 	if (flag1 == 0) {
 		if (flag2 == 0)
@@ -1516,16 +1290,16 @@
 	}
 }
 
-static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
+static void irq_dma_enable_disable_irq(struct adapter *adapter, u32 op)
 {
 	u32 value;
 
-	value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
+	value = read_reg_dw(adapter, 0x208) & 0xfff0ffff;
 
 	if (op != 0)
-		value = value | (adapter->dma_ctrl & 0x000F0000);
+		value = value | (adapter->dma_ctrl & 0x000f0000);
 
-	WriteRegDW(adapter, 0x208, value);
+	write_reg_dw(adapter, 0x208, value);
 }
 
 /* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
@@ -1544,7 +1318,7 @@
        subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
        when dma1 is enabled.
 
-       the first 30 bits of register 0x00C contain the address of the second
+       the first 30 bits of register 0x00c contain the address of the second
        subbuffer. the last 2 bits contain 1.
 
        register 0x008 will contain the address of the subbuffer that was filled
@@ -1559,13 +1333,13 @@
        subbuffer.  The last 2 bits contain 0, when dma1 is disabled and 1,
        when dma1 is enabled.
 
-       the first 30 bits of register 0x01C contain the address of the second
+       the first 30 bits of register 0x01c contain the address of the second
        subbuffer. the last 2 bits contain 1.
 
        register 0x018 contains the address of the subbuffer that was filled
        with TS data, when FlexCopII generates an interrupt.
 */
-static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
+static int dma_init_dma(struct adapter *adapter, u32 dma_channel)
 {
 	u32 subbuffers, subbufsize, subbuf0, subbuf1;
 
@@ -1576,37 +1350,37 @@
 
 		subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
 
-		subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
+		subbuf0 = adapter->dmaq1.bus_addr & 0xfffffffc;
 
-		subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
+		subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xfffffffc) | 1;
 
 		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
 		udelay(1000);
-		WriteRegDW(adapter, 0x000, subbuf0);
+		write_reg_dw(adapter, 0x000, subbuf0);
 
 		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
 		udelay(1000);
-		WriteRegDW(adapter, 0x004, subbufsize);
+		write_reg_dw(adapter, 0x004, subbufsize);
 
 		dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
 		udelay(1000);
-		WriteRegDW(adapter, 0x00C, subbuf1);
+		write_reg_dw(adapter, 0x00c, subbuf1);
 
-		dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
-		WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
+		dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xfffffffc);
+		write_reg_dw(adapter, 0x008, adapter->dmaq1.bus_addr & 0xfffffffc);
 		udelay(1000);
 
 		if (subbuffers == 0)
-			DmaEnableDisableIrq(adapter, 0, 1, 0);
+			dma_enable_disable_irq(adapter, 0, 1, 0);
 		else
-			DmaEnableDisableIrq(adapter, 0, 1, 1);
+			dma_enable_disable_irq(adapter, 0, 1, 1);
 
-		IrqDmaEnableDisableIrq(adapter, 1);
+		irq_dma_enable_disable_irq(adapter, 1);
 
-		SRAMSetMediaDest(adapter, 1);
-		SRAMSetNetDest(adapter, 1);
-		SRAMSetCaiDest(adapter, 2);
-		SRAMSetCaoDest(adapter, 2);
+		sram_set_media_dest(adapter, 1);
+		sram_set_net_dest(adapter, 1);
+		sram_set_cai_dest(adapter, 2);
+		sram_set_cao_dest(adapter, 2);
 	}
 
 	if (dma_channel == 1) {
@@ -1616,39 +1390,35 @@
 
 		subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
 
-		subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
+		subbuf0 = adapter->dmaq2.bus_addr & 0xfffffffc;
 
-		subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
+		subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xfffffffc) | 1;
 
 		dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
 		udelay(1000);
-		WriteRegDW(adapter, 0x010, subbuf0);
+		write_reg_dw(adapter, 0x010, subbuf0);
 
 		dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
 		udelay(1000);
-		WriteRegDW(adapter, 0x014, subbufsize);
+		write_reg_dw(adapter, 0x014, subbufsize);
 
 		dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
 		udelay(1000);
-		WriteRegDW(adapter, 0x01C, subbuf1);
+		write_reg_dw(adapter, 0x01c, subbuf1);
 
-		SRAMSetCaiDest(adapter, 2);
+		sram_set_cai_dest(adapter, 2);
 	}
 
 	return 0;
 }
 
-static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
+static void ctrl_enable_receive_data(struct adapter *adapter, u32 op)
 {
 	if (op == 0) {
-		WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
-
+		write_reg_bitfield(adapter, 0x208, 0x00008000, 0);
 		adapter->dma_status = adapter->dma_status & ~0x00000004;
-
 	} else {
-
-		WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
-
+		write_reg_bitfield(adapter, 0x208, 0x00008000, 0x00008000);
 		adapter->dma_status = adapter->dma_status | 0x00000004;
 	}
 }
@@ -1656,7 +1426,7 @@
 /* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
    bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
 */
-static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
+static void dma_start_stop(struct adapter *adapter, u32 dma_mask, int start_stop)
 {
 	u32 dma_enable, dma1_enable, dma2_enable;
 
@@ -1679,83 +1449,82 @@
 		}
 		// enable dma1 and dma2
 		if ((dma1_enable == 1) && (dma2_enable == 1)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// enable dma1
 		if ((dma1_enable == 1) && (dma2_enable == 0)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// enable dma2
 		if ((dma1_enable == 0) && (dma2_enable == 1)) {
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
 
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 		// start dma
 		if ((dma1_enable == 0) && (dma2_enable == 0)) {
-			CtrlEnableReceiveData(adapter, 1);
+			ctrl_enable_receive_data(adapter, 1);
 
 			return;
 		}
 
 	} else {
 
-		dprintk("%s: stoping dma\n", __FUNCTION__);
+		dprintk("%s: stopping dma\n", __FUNCTION__);
 
 		dma_enable = adapter->dma_status & 0x00000003;
 
 		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
-			dma_enable = dma_enable & 0xFFFFFFFE;
+			dma_enable = dma_enable & 0xfffffffe;
 		}
 
 		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
-			dma_enable = dma_enable & 0xFFFFFFFD;
+			dma_enable = dma_enable & 0xfffffffd;
 		}
 		//stop dma
 		if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
-			CtrlEnableReceiveData(adapter, 0);
+			ctrl_enable_receive_data(adapter, 0);
 
 			udelay(3000);
 		}
 		//disable dma1
 		if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
-			WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
-			WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
+			write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr);
+			write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
 
 			adapter->dma_status = adapter->dma_status & ~0x00000001;
 		}
 		//disable dma2
 		if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
-			WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
+			write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr);
 
 			adapter->dma_status = adapter->dma_status & ~0x00000002;
 		}
 	}
 }
 
-static void OpenStream(struct adapter *adapter, u32 pid)
+static void open_stream(struct adapter *adapter, u16 pid)
 {
 	u32 dma_mask;
 
-	if (adapter->capturing == 0)
-		adapter->capturing = 1;
+	++adapter->capturing;
 
-	FilterEnableMaskFilter(adapter, 1);
+	filter_enable_mask_filter(adapter, 1);
 
-	AddPID(adapter, pid);
+	add_pid(adapter, pid);
 
 	dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
 
@@ -1779,23 +1548,22 @@
 		}
 
 		if (dma_mask != 0) {
-			IrqDmaEnableDisableIrq(adapter, 1);
+			irq_dma_enable_disable_irq(adapter, 1);
 
-			DmaStartStop0x2102(adapter, dma_mask, 1);
+			dma_start_stop(adapter, dma_mask, 1);
 		}
 	}
 }
 
-static void CloseStream(struct adapter *adapter, u32 pid)
+static void close_stream(struct adapter *adapter, u16 pid)
 {
-	u32 dma_mask;
-
-	if (adapter->capturing != 0)
-		adapter->capturing = 0;
+	if (adapter->capturing > 0)
+		--adapter->capturing;
 
 	dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
 
-	dma_mask = 0;
+	if (adapter->capturing == 0) {
+		u32 dma_mask = 0;
 
 	if ((adapter->dma_status & 1) != 0)
 		dma_mask = dma_mask | 0x00000001;
@@ -1803,94 +1571,76 @@
 		dma_mask = dma_mask | 0x00000002;
 
 	if (dma_mask != 0) {
-		DmaStartStop0x2102(adapter, dma_mask, 0);
+			dma_start_stop(adapter, dma_mask, 0);
 	}
-
-	RemovePID(adapter, pid);
+	}
+	remove_pid(adapter, pid);
 }
 
-static void InterruptServiceDMA1(struct adapter *adapter)
+static void interrupt_service_dma1(struct adapter *adapter)
 {
 	struct dvb_demux *dvbdmx = &adapter->demux;
-	struct packet_header packet_header;
 
-	int nCurDmaCounter;
-	u32 nNumBytesParsed;
-	u32 nNumNewBytesTransferred;
-	u32 dwDefaultPacketSize = 188;
-	u8 gbTmpBuffer[188];
-	u8 *pbDMABufCurPos;
+	int n_cur_dma_counter;
+	u32 n_num_bytes_parsed;
+	u32 n_num_new_bytes_transferred;
+	u32 dw_default_packet_size = 188;
+	u8 gb_tmp_buffer[188];
+	u8 *pb_dma_buf_cur_pos;
 
-	nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
-	nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
+	n_cur_dma_counter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
+	n_cur_dma_counter = (n_cur_dma_counter / dw_default_packet_size) * dw_default_packet_size;
 
-	if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
+	if ((n_cur_dma_counter < 0) || (n_cur_dma_counter > adapter->dmaq1.buffer_size)) {
 		dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
 		return;
 	}
 
-	adapter->dmaq1.head = nCurDmaCounter;
+	adapter->dmaq1.head = n_cur_dma_counter;
 
-	if (adapter->dmaq1.tail <= nCurDmaCounter) {
-		nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
+	if (adapter->dmaq1.tail <= n_cur_dma_counter) {
+		n_num_new_bytes_transferred = n_cur_dma_counter - adapter->dmaq1.tail;
 
 	} else {
 
-		nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
+		n_num_new_bytes_transferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + n_cur_dma_counter;
 	}
 
-//  dprintk("%s: nCurDmaCounter   = %d\n" , __FUNCTION__, nCurDmaCounter);
-//	dprintk("%s: dmaq1.tail       = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
-//  dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
+	ddprintk("%s: n_cur_dma_counter = %d\n", __FUNCTION__, n_cur_dma_counter);
+	ddprintk("%s: dmaq1.tail        = %d\n", __FUNCTION__, adapter->dmaq1.tail);
+	ddprintk("%s: bytes_transferred = %d\n", __FUNCTION__, n_num_new_bytes_transferred);
 
-	if (nNumNewBytesTransferred < dwDefaultPacketSize)
+	if (n_num_new_bytes_transferred < dw_default_packet_size)
 		return;
 
-	nNumBytesParsed = 0;
+	n_num_bytes_parsed = 0;
 
-	while (nNumBytesParsed < nNumNewBytesTransferred) {
-		pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
+	while (n_num_bytes_parsed < n_num_new_bytes_transferred) {
+		pb_dma_buf_cur_pos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
 
 		if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
-			memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
-			memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
+			memcpy(gb_tmp_buffer, adapter->dmaq1.buffer + adapter->dmaq1.tail,
+			       adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
+			memcpy(gb_tmp_buffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer,
+			       (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
 
-			pbDMABufCurPos = gbTmpBuffer;
+			pb_dma_buf_cur_pos = gb_tmp_buffer;
 		}
 
 		if (adapter->capturing != 0) {
-			u32 *dq = (u32 *) pbDMABufCurPos;
-
-			packet_header.sync_byte = *dq & 0x000000FF;
-			packet_header.transport_error_indicator = *dq & 0x00008000;
-			packet_header.payload_unit_start_indicator = *dq & 0x00004000;
-			packet_header.transport_priority = *dq & 0x00002000;
-			packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
-			packet_header.transport_scrambling_control = *dq >> 0x1E;
-			packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
-			packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
-
-			if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
-				if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
-					dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
-
-				} else {
-
-//                  dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
-				}
-			}
+			dvb_dmx_swfilter_packets(dvbdmx, pb_dma_buf_cur_pos, dw_default_packet_size / 188);
 		}
 
-		nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
+		n_num_bytes_parsed = n_num_bytes_parsed + dw_default_packet_size;
 
-		adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
+		adapter->dmaq1.tail = adapter->dmaq1.tail + dw_default_packet_size;
 
 		if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
 			adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
 	};
 }
 
-static void InterruptServiceDMA2(struct adapter *adapter)
+static void interrupt_service_dma2(struct adapter *adapter)
 {
 	printk("%s:\n", __FUNCTION__);
 }
@@ -1901,28 +1651,28 @@
 
 	u32 value;
 
-//  dprintk("%s:\n", __FUNCTION__);
+	ddprintk("%s:\n", __FUNCTION__);
 
 	spin_lock_irq(&tmp->lock);
 
-	if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
+	if (0 == ((value = read_reg_dw(tmp, 0x20c)) & 0x0f)) {
 		spin_unlock_irq(&tmp->lock);
 		return IRQ_NONE;
 	}
 	
 	while (value != 0) {
 		if ((value & 0x03) != 0)
-			InterruptServiceDMA1(tmp);
-		if ((value & 0x0C) != 0)
-			InterruptServiceDMA2(tmp);
-		value = ReadRegDW(tmp, 0x20C) & 0x0F;
+			interrupt_service_dma1(tmp);
+		if ((value & 0x0c) != 0)
+			interrupt_service_dma2(tmp);
+		value = read_reg_dw(tmp, 0x20c) & 0x0f;
 	}
 
 	spin_unlock_irq(&tmp->lock);
 	return IRQ_HANDLED;
 }
 
-static void Initdmaqueue(struct adapter *adapter)
+static void init_dma_queue(struct adapter *adapter)
 {
 	dma_addr_t dma_addr;
 
@@ -1933,19 +1683,19 @@
 	adapter->dmaq1.tail = 0;
 	adapter->dmaq1.buffer = 0;
 
-	adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
+	adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, &dma_addr);
 
 	if (adapter->dmaq1.buffer != 0) {
-		memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
+		memset(adapter->dmaq1.buffer, 0, SIZE_OF_BUF_DMA1);
 
 		adapter->dmaq1.bus_addr = dma_addr;
-		adapter->dmaq1.buffer_size = SizeOfBufDMA1;
+		adapter->dmaq1.buffer_size = SIZE_OF_BUF_DMA1;
 
-		DmaInitDMA(adapter, 0);
+		dma_init_dma(adapter, 0);
 
 		adapter->dma_status = adapter->dma_status | 0x10000000;
 
-		dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SizeOfBufDMA1);
+		ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SIZE_OF_BUF_DMA1);
 
 	} else {
 
@@ -1959,19 +1709,19 @@
 	adapter->dmaq2.tail = 0;
 	adapter->dmaq2.buffer = 0;
 
-	adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
+	adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, &dma_addr);
 
 	if (adapter->dmaq2.buffer != 0) {
-		memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
+		memset(adapter->dmaq2.buffer, 0, SIZE_OF_BUF_DMA2);
 
 		adapter->dmaq2.bus_addr = dma_addr;
-		adapter->dmaq2.buffer_size = SizeOfBufDMA2;
+		adapter->dmaq2.buffer_size = SIZE_OF_BUF_DMA2;
 
-		DmaInitDMA(adapter, 1);
+		dma_init_dma(adapter, 1);
 
 		adapter->dma_status = adapter->dma_status | 0x20000000;
 
-		dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
+		ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SIZE_OF_BUF_DMA2);
 
 	} else {
 
@@ -1979,10 +1729,10 @@
 	}
 }
 
-static void Freedmaqueue(struct adapter *adapter)
+static void free_dma_queue(struct adapter *adapter)
 {
 	if (adapter->dmaq1.buffer != 0) {
-		pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
+		pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
 
 		adapter->dmaq1.bus_addr = 0;
 		adapter->dmaq1.head = 0;
@@ -1992,7 +1742,7 @@
 	}
 
 	if (adapter->dmaq2.buffer != 0) {
-		pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
+		pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
 
 		adapter->dmaq2.bus_addr = 0;
 		adapter->dmaq2.head = 0;
@@ -2002,16 +1752,16 @@
 	}
 }
 
-static void FreeAdapterObject(struct adapter *adapter)
+static void free_adapter_object(struct adapter *adapter)
 {
 	dprintk("%s:\n", __FUNCTION__);
 
-	CloseStream(adapter, 0);
+	close_stream(adapter, 0);
 
 	if (adapter->irq != 0)
 		free_irq(adapter->irq, adapter);
 
-	Freedmaqueue(adapter);
+	free_dma_queue(adapter);
 
 	if (adapter->io_mem != 0)
 		iounmap((void *) adapter->io_mem);
@@ -2022,7 +1772,7 @@
 
 static struct pci_driver skystar2_pci_driver;
 
-static int ClaimAdapter(struct adapter *adapter)
+static int claim_adapter(struct adapter *adapter)
 {
 	struct pci_dev *pdev = adapter->pdev;
 
@@ -2062,20 +1812,58 @@
 }
 
 /*
-static int SLL_reset_FlexCOP(struct adapter *adapter)
+static int sll_reset_flexcop(struct adapter *adapter)
 {
-	WriteRegDW(adapter, 0x208, 0);
-	WriteRegDW(adapter, 0x210, 0xB2FF);
+	write_reg_dw(adapter, 0x208, 0);
+	write_reg_dw(adapter, 0x210, 0xb2ff);
 
 	return 0;
 }
 */
 
-static int DriverInitialize(struct pci_dev * pdev)
+static void decide_how_many_hw_filters(struct adapter *adapter)
+{
+	int hw_filters;
+	int mod_option_hw_filters;
+
+	// FlexCop IIb & III have 6+32 hw filters    
+	// FlexCop II has 6 hw filters, every other should have at least 6
+	switch (adapter->b2c2_revision) {
+	case 0x82:		/* II */
+		hw_filters = 6;
+		break;
+	case 0xc3:		/* IIB */
+		hw_filters = 6 + 32;
+		break;
+	case 0xc0:		/* III */
+		hw_filters = 6 + 32;
+		break;
+	default:
+		hw_filters = 6;
+		break;
+	}
+	printk("%s: the chip has %i hardware filters", __FILE__, hw_filters);
+
+	mod_option_hw_filters = 0;
+	if (enable_hw_filters >= 1)
+		mod_option_hw_filters += 6;
+	if (enable_hw_filters >= 2)
+		mod_option_hw_filters += 32;
+
+	if (mod_option_hw_filters >= hw_filters) {
+		adapter->useable_hw_filters = hw_filters;
+	} else {
+		adapter->useable_hw_filters = mod_option_hw_filters;
+		printk(", but only %d will be used because of module option", mod_option_hw_filters);
+	}
+	printk("\n");
+	dprintk("%s: useable_hardware_filters set to %i\n", __FILE__, adapter->useable_hw_filters);
+}
+
+static int driver_initialize(struct pci_dev *pdev)
 {
 	struct adapter *adapter;
 	u32 tmp;
-	u8 key[16];
 
 	if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
 		dprintk("%s: out of memory!\n", __FUNCTION__);
@@ -2090,113 +1878,114 @@
 	adapter->pdev = pdev;
 	adapter->irq = pdev->irq;
 
-	if ((ClaimAdapter(adapter)) != 1) {
-		FreeAdapterObject(adapter);
+	if ((claim_adapter(adapter)) != 1) {
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	IrqDmaEnableDisableIrq(adapter, 0);
+	irq_dma_enable_disable_irq(adapter, 0);
 
 	if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
 		dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
 
-		FreeAdapterObject(adapter);
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	ReadRegDW(adapter, 0x208);
-	WriteRegDW(adapter, 0x208, 0);
-	WriteRegDW(adapter, 0x210, 0xB2FF);
-	WriteRegDW(adapter, 0x208, 0x40);
-
-	InitPIDsInfo(adapter);
-
-	PidSetGroupPID(adapter, 0);
-	PidSetGroupMASK(adapter, 0x1FE0);
-	PidSetStream1PID(adapter, 0x1FFF);
-	PidSetStream2PID(adapter, 0x1FFF);
-	PidSetPmtPID(adapter, 0x1FFF);
-	PidSetPcrPID(adapter, 0x1FFF);
-	PidSetEcmPID(adapter, 0x1FFF);
-	PidSetEmmPID(adapter, 0x1FFF);
+	read_reg_dw(adapter, 0x208);
+	write_reg_dw(adapter, 0x208, 0);
+	write_reg_dw(adapter, 0x210, 0xb2ff);
+	write_reg_dw(adapter, 0x208, 0x40);
 
-	Initdmaqueue(adapter);
+	init_dma_queue(adapter);
 
 	if ((adapter->dma_status & 0x30000000) == 0) {
-		FreeAdapterObject(adapter);
+		free_adapter_object(adapter);
 
 		return -ENODEV;
 	}
 
-	adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
-
-	if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
-		if (adapter->b2c2_revision != 0x82) {
-			dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
-			dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
-
-			FreeAdapterObject(adapter);
+	adapter->b2c2_revision = (read_reg_dw(adapter, 0x204) >> 0x18);
 
+	switch (adapter->b2c2_revision) {
+	case 0x82:
+		printk("%s: FlexCopII(rev.130) chip found\n", __FILE__);
+		break;
+	case 0xc3:
+		printk("%s: FlexCopIIB(rev.195) chip found\n", __FILE__);
+		break;
+	case 0xc0:
+		printk("%s: FlexCopIII(rev.192) chip found\n", __FILE__);
+		break;
+	default:
+		printk("%s: The revision of the FlexCop chip on your card is %d\n", __FILE__, adapter->b2c2_revision);
+		printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev.192).\n", __FILE__);
+		free_adapter_object(adapter);
+		pci_set_drvdata(pdev, NULL);
+		release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
+		release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
 			return -ENODEV;
 		}
 
-	tmp = ReadRegDW(adapter, 0x204);
+	decide_how_many_hw_filters(adapter);
+
+	init_pids(adapter);
+
+	tmp = read_reg_dw(adapter, 0x204);
 
-	WriteRegDW(adapter, 0x204, 0);
+	write_reg_dw(adapter, 0x204, 0);
 	mdelay(20);
 
-	WriteRegDW(adapter, 0x204, tmp);
+	write_reg_dw(adapter, 0x204, tmp);
 	mdelay(10);
 
-	tmp = ReadRegDW(adapter, 0x308);
-	WriteRegDW(adapter, 0x308, 0x4000 | tmp);
+	tmp = read_reg_dw(adapter, 0x308);
+	write_reg_dw(adapter, 0x308, 0x4000 | tmp);
 
-	adapter->dwSramType = 0x10000;
+	adapter->dw_sram_type = 0x10000;
 
-	SLL_detectSramSize(adapter);
+	sll_detect_sram_size(adapter);
 
-	dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
+	dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, sram_length(adapter), adapter->dw_sram_type);
 
-	SRAMSetMediaDest(adapter, 1);
-	SRAMSetNetDest(adapter, 1);
+	sram_set_media_dest(adapter, 1);
+	sram_set_net_dest(adapter, 1);
 
-	CtrlEnableSmc(adapter, 0);
+	ctrl_enable_smc(adapter, 0);
 
-	SRAMSetCaiDest(adapter, 2);
-	SRAMSetCaoDest(adapter, 2);
+	sram_set_cai_dest(adapter, 2);
+	sram_set_cao_dest(adapter, 2);
 
-	DmaEnableDisableIrq(adapter, 1, 0, 0);
+	dma_enable_disable_irq(adapter, 1, 0, 0);
 
-	if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
-		printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
+	if (eeprom_get_mac_addr(adapter, 0, adapter->mac_addr) != 0) {
+		printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0],
+		       adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5],
+		       adapter->mac_addr[6], adapter->mac_addr[7]
 		    );
 
-		CASetMacDstAddrFilter(adapter, adapter->mac_addr);
-		CtrlEnableMAC(adapter, 1);
+		ca_set_mac_dst_addr_filter(adapter, adapter->mac_addr);
+		ctrl_enable_mac(adapter, 1);
 	}
 
-	EEPROM_readKey(adapter, key, 16);
-
-	printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
-
 	adapter->lock = SPIN_LOCK_UNLOCKED;
 
 	return 0;
 }
 
-static void DriverHalt(struct pci_dev *pdev)
+static void driver_halt(struct pci_dev *pdev)
 {
 	struct adapter *adapter;
 
 	adapter = pci_get_drvdata(pdev);
 
-	IrqDmaEnableDisableIrq(adapter, 0);
+	irq_dma_enable_disable_irq(adapter, 0);
 
-	CtrlEnableReceiveData(adapter, 0);
+	ctrl_enable_receive_data(adapter, 0);
 
-	FreeAdapterObject(adapter);
+	free_adapter_object(adapter);
 
 	pci_set_drvdata(pdev, NULL);
 
@@ -2212,7 +2001,7 @@
 
 	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
 
-	OpenStream(adapter, dvbdmxfeed->pid);
+	open_stream(adapter, dvbdmxfeed->pid);
 
 	return 0;
 }
@@ -2224,7 +2013,7 @@
 
 	dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
 
-	CloseStream(adapter, dvbdmxfeed->pid);
+	close_stream(adapter, dvbdmxfeed->pid);
 
 	return 0;
 }
@@ -2232,23 +2021,23 @@
 /* lnb control */
 static void set_tuner_tone(struct adapter *adapter, u8 tone)
 {
-	u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
+	u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc };
 	u16 ax;
 
 	dprintk("%s: %u\n", __FUNCTION__, tone);
 
 	switch (tone) {
 	case 1:
-		ax = wzHalfPeriodFor45MHz[0];
+		ax = wz_half_period_for_45_mhz[0];
 		break;
 	case 2:
-		ax = wzHalfPeriodFor45MHz[1];
+		ax = wz_half_period_for_45_mhz[1];
 		break;
 	case 3:
-		ax = wzHalfPeriodFor45MHz[2];
+		ax = wz_half_period_for_45_mhz[2];
 		break;
 	case 4:
-		ax = wzHalfPeriodFor45MHz[3];
+		ax = wz_half_period_for_45_mhz[3];
 		break;
 
 	default:
@@ -2256,11 +2045,11 @@
 	}
 
 	if (ax != 0) {
-		WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
+		write_reg_dw(adapter, 0x200, ((ax << 0x0f) + (ax & 0x7fff)) | 0x40000000);
 
 	} else {
 
-		WriteRegDW(adapter, 0x200, 0x40FF8000);
+		write_reg_dw(adapter, 0x200, 0x40ff8000);
 	}
 }
 
@@ -2270,7 +2059,7 @@
 
 	dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
 
-	var = ReadRegDW(adapter, 0x204);
+	var = read_reg_dw(adapter, 0x204);
 
 	if (polarity == 0) {
 		dprintk("%s: LNB power off\n", __FUNCTION__);
@@ -2287,82 +2076,150 @@
 		var = var | 4;
 	}
 
-	WriteRegDW(adapter, 0x204, var);
+	write_reg_dw(adapter, 0x204, var);
 }
 
-static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
+static void diseqc_send_bit(struct adapter *adapter, int data)
 {
-	struct adapter *adapter = fe->before_after_data;
+	set_tuner_tone(adapter, 1);
+	udelay(data ? 500 : 1000);
+	set_tuner_tone(adapter, 0);
+	udelay(data ? 1000 : 500);
+}
 
-	switch (cmd) {
-	case FE_SLEEP:
+
+static void diseqc_send_byte(struct adapter *adapter, int data)
 		{
-			printk("%s: FE_SLEEP\n", __FUNCTION__);
+	int i, par = 1, d;
 
-			set_tuner_polarity(adapter, 0);
+	for (i = 7; i >= 0; i--) {
+		d = (data >> i) & 1;
+		par ^= d;
+		diseqc_send_bit(adapter, d);
+	}
 
-			// return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
-			return -EOPNOTSUPP;
+	diseqc_send_bit(adapter, par);
 		}
 
-	case FE_SET_VOLTAGE:
-		{
-			dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
 
-			switch ((fe_sec_voltage_t) arg) {
-			case SEC_VOLTAGE_13:
+static int send_diseqc_msg(struct adapter *adapter, int len, u8 *msg, unsigned long burst)
+{
+	int i;
 
-				printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
+	set_tuner_tone(adapter, 0);
+	mdelay(16);
 
-				set_tuner_polarity(adapter, 1);
+	for (i = 0; i < len; i++)
+		diseqc_send_byte(adapter, msg[i]);
 
-				break;
+	mdelay(16);
 
-			case SEC_VOLTAGE_18:
+	if (burst != -1) {
+		if (burst)
+			diseqc_send_byte(adapter, 0xff);
+		else {
+			set_tuner_tone(adapter, 1);
+			udelay(12500);
+			set_tuner_tone(adapter, 0);
+		}
+		dvb_delay(20);
+	}
 
-				printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
+	return 0;
+}
 
-				set_tuner_polarity(adapter, 2);
 
+int soft_diseqc(struct adapter *adapter, unsigned int cmd, void *arg)
+{
+	switch (cmd) {
+	case FE_SET_TONE:
+		switch ((fe_sec_tone_mode_t) arg) {
+		case SEC_TONE_ON:
+			set_tuner_tone(adapter, 1);
+			break;
+		case SEC_TONE_OFF:
+			set_tuner_tone(adapter, 0);
 				break;
-
 			default:
-
 				return -EINVAL;
 			};
+		break;
 
+	case FE_DISEQC_SEND_MASTER_CMD:
+		{
+			struct dvb_diseqc_master_cmd *cmd = arg;
+
+			send_diseqc_msg(adapter, cmd->msg_len, cmd->msg, 0);
 			break;
 		}
 
-	case FE_SET_TONE:
+	case FE_DISEQC_SEND_BURST:
+		send_diseqc_msg(adapter, 0, NULL, (unsigned long) arg);
+		break;
+
+	default:
+		return -EOPNOTSUPP;
+	};
+
+	return 0;
+}
+
+static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
 		{
-			dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
+	struct adapter *adapter = fe->before_after_data;
 
-			switch ((fe_sec_tone_mode_t) arg) {
-			case SEC_TONE_ON:
+	struct dvb_frontend_info info;
 
-				printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
+	fe->ioctl(fe, FE_GET_INFO, &info);
 
-				set_tuner_tone(adapter, 1);
+	// we must use different DiSEqC hw
 
-				break;
+	if (strcmp(info.name, "Zarlink MT312") == 0) {
+		//VP310 using mt312 driver for tuning only: diseqc not wired
+		//use FCII instead
+		if (!soft_diseqc(adapter, cmd, arg))
+			return 0;
+	}
 
-			case SEC_TONE_OFF:
+	switch (cmd) {
+	case FE_SLEEP:
+		{
+			dprintk("%s: FE_SLEEP\n", __FUNCTION__);
 
-				printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
+			set_tuner_polarity(adapter, 0);
 
-				set_tuner_tone(adapter, 0);
+			// return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
+			return -EOPNOTSUPP;
+		}
 
-				break;
+	case FE_SET_VOLTAGE:
+		{
+			dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
+
+			switch ((fe_sec_voltage_t) arg) {
+			case SEC_VOLTAGE_13:
+
+				dprintk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
+
+				set_tuner_polarity(adapter, 1);
+
+				return 0;
+
+			case SEC_VOLTAGE_18:
+
+				dprintk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
+
+				set_tuner_polarity(adapter, 2);
+
+				return 0;
 
 			default:
 
 				return -EINVAL;
 			};
-
-			break;
 		}
 
+
 	default:
 
 		return -EOPNOTSUPP;
@@ -2382,7 +2239,7 @@
 	if (pdev == NULL)
 		return -ENODEV;
 
-	if (DriverInitialize(pdev) != 0)
+	if (driver_initialize(pdev) != 0)
 		return -ENODEV;
 
 	dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
@@ -2390,7 +2247,7 @@
 	if (dvb_adapter == NULL) {
 		printk("%s: Error registering DVB adapter\n", __FUNCTION__);
 
-		DriverHalt(pdev);
+		driver_halt(pdev);
 
 		return -ENODEV;
 	}
@@ -2411,8 +2268,8 @@
 	dvbdemux = &adapter->demux;
 
 	dvbdemux->priv = (void *) adapter;
-	dvbdemux->filternum = 32;
-	dvbdemux->feednum = 32;
+	dvbdemux->filternum = N_PID_SLOTS;
+	dvbdemux->feednum = N_PID_SLOTS;
 	dvbdemux->start_feed = dvb_start_feed;
 	dvbdemux->stop_feed = dvb_stop_feed;
 	dvbdemux->write_to_decoder = 0;
@@ -2422,7 +2279,7 @@
 
 	adapter->hw_frontend.source = DMX_FRONTEND_0;
 
-	adapter->dmxdev.filternum = 32;
+	adapter->dmxdev.filternum = N_PID_SLOTS;
 	adapter->dmxdev.demux = &dvbdemux->dmx;
 	adapter->dmxdev.capabilities = 0;
 
@@ -2475,13 +2332,13 @@
 
 			dvb_unregister_adapter(adapter->dvb_adapter);
 		}
-
-		DriverHalt(pdev);
+		driver_halt(pdev);
 	}
 }
 
 static struct pci_device_id skystar2_pci_tbl[] = {
-	{0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
+	{0x000013d0, 0x00002103, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000},
+	{0x000013d0, 0x00002200, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000},	//FCIII
 	{0,},
 };
 
@@ -2504,6 +2361,11 @@
 
 module_init(skystar2_init);
 module_exit(skystar2_cleanup);
+
+MODULE_PARM(debug, "i");
+MODULE_PARM_DESC(debug, "enable verbose debug messages: supported values: 1 and 2");
+MODULE_PARM(enable_hw_filters, "i");
+MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters: supported values: 0 (none), 1, 2");
 
 MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
 MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/dvb/bt8xx/Kconfig b/drivers/media/dvb/bt8xx/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/Kconfig	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,13 @@
+config DVB_BT8XX
+	tristate "Nebula/Pinnacle PCTV PCI cards"
+	depends on DVB_CORE && PCI && VIDEO_BT848
+	help
+	  Support for PCI cards based on the Bt8xx PCI bridge. Examples are
+	  the Nebula cards, the Pinnacle PCTV cards, and Twinhan DST cards.
+
+          Since these cards have no MPEG decoder onboard, they transmit
+	  only compressed MPEG data over the PCI bus, so you need
+	  an external software decoder to watch TV on your computer.
+
+	  Say Y if you own such a device and want to use it.
+
diff -Nru a/drivers/media/dvb/bt8xx/Makefile b/drivers/media/dvb/bt8xx/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/Makefile	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,5 @@
+
+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o
+
+EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends
+
diff -Nru a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/bt878.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,614 @@
+/*
+ * bt878.c: part of the driver for the Pinnacle PCTV Sat DVB PCI card
+ *
+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+ *
+ * large parts based on the bttv driver
+ * Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
+ *                        & Marcus Metzler (mocm@thp.uni-koeln.de)
+ * (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
+ *
+ * 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.
+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
+ * 
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <asm/io.h>
+#include <linux/ioport.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/kmod.h>
+#include <linux/vmalloc.h>
+#include <linux/init.h>
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "bt878.h"
+#include "dst-bt878.h"
+
+#include "dvb_functions.h"
+
+/**************************************/
+/* Miscellaneous utility  definitions */
+/**************************************/
+
+unsigned int bt878_verbose = 1;
+unsigned int bt878_debug = 0;
+MODULE_PARM(bt878_verbose, "i");
+MODULE_PARM_DESC(bt878_verbose,
+		 "verbose startup messages, default is 1 (yes)");
+MODULE_PARM(bt878_debug, "i");
+MODULE_PARM_DESC(bt878_debug, "debug messages, default is 0 (no)");
+MODULE_LICENSE("GPL");
+
+int bt878_num;
+struct bt878 bt878[BT878_MAX];
+
+EXPORT_SYMBOL(bt878_debug);
+EXPORT_SYMBOL(bt878_verbose);
+EXPORT_SYMBOL(bt878_num);
+EXPORT_SYMBOL(bt878);
+
+#define btwrite(dat,adr)    bmtwrite((dat), (bt->bt878_mem+(adr)))
+#define btread(adr)         bmtread(bt->bt878_mem+(adr))
+
+#define btand(dat,adr)      btwrite((dat) & btread(adr), adr)
+#define btor(dat,adr)       btwrite((dat) | btread(adr), adr)
+#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
+
+#if defined(dprintk)
+#undef dprintk
+#endif
+#define dprintk if(bt878_debug) printk
+
+static void bt878_mem_free(struct bt878 *bt)
+{
+	if (bt->buf_cpu) {
+		pci_free_consistent(bt->dev, bt->buf_size, bt->buf_cpu,
+				    bt->buf_dma);
+		bt->buf_cpu = NULL;
+	}
+
+	if (bt->risc_cpu) {
+		pci_free_consistent(bt->dev, bt->risc_size, bt->risc_cpu,
+				    bt->risc_dma);
+		bt->risc_cpu = NULL;
+	}
+}
+
+static int bt878_mem_alloc(struct bt878 *bt)
+{
+	if (!bt->buf_cpu) {
+		bt->buf_size = 128 * 1024;
+
+		bt->buf_cpu =
+		    pci_alloc_consistent(bt->dev, bt->buf_size,
+					 &bt->buf_dma);
+
+		if (!bt->buf_cpu)
+			return -ENOMEM;
+
+		memset(bt->buf_cpu, 0, bt->buf_size);
+	}
+
+	if (!bt->risc_cpu) {
+		bt->risc_size = PAGE_SIZE;
+		bt->risc_cpu =
+		    pci_alloc_consistent(bt->dev, bt->risc_size,
+					 &bt->risc_dma);
+
+		if (!bt->risc_cpu) {
+			bt878_mem_free(bt);
+			return -ENOMEM;
+		}
+
+		memset(bt->risc_cpu, 0, bt->risc_size);
+	}
+
+	return 0;
+}
+
+/* RISC instructions */
+#define RISC_WRITE        	(0x01 << 28)
+#define RISC_JUMP         	(0x07 << 28)
+#define RISC_SYNC         	(0x08 << 28)
+
+/* RISC bits */
+#define RISC_WR_SOL       	(1 << 27)
+#define RISC_WR_EOL       	(1 << 26)
+#define RISC_IRQ          	(1 << 24)
+#define RISC_STATUS(status)	((((~status) & 0x0F) << 20) | ((status & 0x0F) << 16))
+#define RISC_SYNC_RESYNC  	(1 << 15)
+#define RISC_SYNC_FM1     	0x06
+#define RISC_SYNC_VRO     	0x0C
+
+#define RISC_FLUSH()		bt->risc_pos = 0
+#define RISC_INSTR(instr) 	bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
+
+static int bt878_make_risc(struct bt878 *bt)
+{
+	bt->block_bytes = bt->buf_size >> 4;
+	bt->block_count = 1 << 4;
+	bt->line_bytes = bt->block_bytes;
+	bt->line_count = bt->block_count;
+
+	while (bt->line_bytes > 4095) {
+		bt->line_bytes >>= 1;
+		bt->line_count <<= 1;
+	}
+
+	if (bt->line_count > 255) {
+		printk("bt878: buffer size error!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+
+static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin)
+{
+	u32 buf_pos = 0;
+	u32 line;
+
+	RISC_FLUSH();
+	RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin);
+	RISC_INSTR(0);
+
+	dprintk("bt878: risc len lines %u, bytes per line %u\n", 
+			bt->line_count, bt->line_bytes);
+	for (line = 0; line < bt->line_count; line++) {
+		// At the beginning of every block we issue an IRQ with previous (finished) block number set
+		if (!(buf_pos % bt->block_bytes))
+			RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
+				   RISC_IRQ |
+				   RISC_STATUS(((buf_pos /
+						 bt->block_bytes) +
+						(bt->block_count -
+						 1)) %
+					       bt->block_count) | bt->
+				   line_bytes);
+		else
+			RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
+				   bt->line_bytes);
+		RISC_INSTR(bt->buf_dma + buf_pos);
+		buf_pos += bt->line_bytes;
+	}
+
+	RISC_INSTR(RISC_SYNC | op_sync_orin | RISC_SYNC_VRO);
+	RISC_INSTR(0);
+
+	RISC_INSTR(RISC_JUMP);
+	RISC_INSTR(bt->risc_dma);
+
+	btwrite((bt->line_count << 16) | bt->line_bytes, BT878_APACK_LEN);
+}
+
+/*****************************/
+/* Start/Stop grabbing funcs */
+/*****************************/
+
+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
+		u32 irq_err_ignore)
+{
+	u32 int_mask;
+
+	dprintk("bt878 debug: bt878_start (ctl=%8.8x)\n", controlreg);
+	/* complete the writing of the risc dma program now we have
+	 * the card specifics
+	 */
+	bt878_risc_program(bt, op_sync_orin);
+	controlreg &= ~0x1f;
+	controlreg |= 0x1b;
+
+	btwrite(cpu_to_le32(bt->risc_dma), BT878_ARISC_START);
+
+	/* original int mask had :
+	 *    6    2    8    4    0
+	 * 1111 1111 1000 0000 0000
+	 * SCERR|OCERR|PABORT|RIPERR|FDSR|FTRGT|FBUS|RISCI
+	 * Hacked for DST to:
+	 * SCERR | OCERR | FDSR | FTRGT | FBUS | RISCI
+	 */
+	int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT | 
+		BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT | 
+		BT878_AFBUS | BT878_ARISCI;
+
+
+	/* ignore pesky bits */
+	int_mask &= ~irq_err_ignore;
+	
+	btwrite(int_mask, BT878_AINT_MASK);
+	btwrite(controlreg, BT878_AGPIO_DMA_CTL);
+}
+
+void bt878_stop(struct bt878 *bt)
+{
+	u32 stat;
+	int i = 0;
+
+	dprintk("bt878 debug: bt878_stop\n");
+
+	btwrite(0, BT878_AINT_MASK);
+	btand(~0x13, BT878_AGPIO_DMA_CTL);
+
+	do {
+		stat = btread(BT878_AINT_STAT);
+		if (!(stat & BT878_ARISC_EN))
+			break;
+		i++;
+	} while (i < 500);
+
+	dprintk("bt878(%d) debug: bt878_stop, i=%d, stat=0x%8.8x\n",
+		bt->nr, i, stat);
+}
+
+EXPORT_SYMBOL(bt878_start);
+EXPORT_SYMBOL(bt878_stop);
+
+/*****************************/
+/* Interrupt service routine */
+/*****************************/
+
+static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+	u32 stat, astat, mask;
+	int count;
+	struct bt878 *bt;
+
+	bt = (struct bt878 *) dev_id;
+
+	count = 0;
+	while (1) {
+		stat = btread(BT878_AINT_STAT);
+		mask = btread(BT878_AINT_MASK);
+		if (!(astat = (stat & mask)))
+			return IRQ_NONE;	/* this interrupt is not for me */
+/*		dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask 0x%8.8x\n",bt->nr,count,stat,mask); */
+		btwrite(astat, BT878_AINT_STAT);	/* try to clear interupt condition */
+
+
+		if (astat & (BT878_ASCERR | BT878_AOCERR)) {
+			if (bt878_verbose) {
+				printk("bt878(%d): irq%s%s risc_pc=%08x\n",
+				       bt->nr,
+				       (astat & BT878_ASCERR) ? " SCERR" :
+				       "",
+				       (astat & BT878_AOCERR) ? " OCERR" :
+				       "", btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & (BT878_APABORT | BT878_ARIPERR | BT878_APPERR)) {
+			if (bt878_verbose) {
+				printk
+				    ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
+				     bt->nr,
+				     (astat & BT878_APABORT) ? " PABORT" :
+				     "",
+				     (astat & BT878_ARIPERR) ? " RIPERR" :
+				     "",
+				     (astat & BT878_APPERR) ? " PPERR" :
+				     "", btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & (BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS)) {
+			if (bt878_verbose) {
+				printk
+				    ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
+				     bt->nr,
+				     (astat & BT878_AFDSR) ? " FDSR" : "",
+				     (astat & BT878_AFTRGT) ? " FTRGT" :
+				     "",
+				     (astat & BT878_AFBUS) ? " FBUS" : "",
+				     btread(BT878_ARISC_PC));
+			}
+		}
+		if (astat & BT878_ARISCI) {
+			bt->finished_block = (stat & BT878_ARISCS) >> 28;
+			tasklet_schedule(&bt->tasklet);
+			break;
+		}
+		count++;
+		if (count > 20) {
+			btwrite(0, BT878_AINT_MASK);
+			printk(KERN_ERR
+			       "bt878(%d): IRQ lockup, cleared int mask\n",
+			       bt->nr);
+			break;
+		}
+	}
+	return IRQ_HANDLED;
+}
+
+extern int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data);
+extern int bttv_read_gpio(unsigned int card, unsigned long *data);
+extern int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data);
+
+int
+bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp)
+{
+	int retval;
+
+	retval = 0;
+	if (down_interruptible (&bt->gpio_lock))
+		return -ERESTARTSYS;
+	/* special gpio signal */
+	switch (cmd) {
+	    case DST_IG_ENABLE:
+		// dprintk("dvb_bt8xx: dst enable mask 0x%02x enb 0x%02x \n", mp->dstg.enb.mask, mp->dstg.enb.enable);
+		retval = bttv_gpio_enable(bt->bttv_nr,
+				mp->enb.mask,
+				mp->enb.enable);
+		break;
+	    case DST_IG_WRITE:
+		// dprintk("dvb_bt8xx: dst write gpio mask 0x%02x out 0x%02x\n", mp->dstg.outp.mask, mp->dstg.outp.highvals);
+		retval = bttv_write_gpio(bt->bttv_nr,
+				mp->outp.mask,
+				mp->outp.highvals);
+
+		break;
+	    case DST_IG_READ:
+		/* read */
+		retval =  bttv_read_gpio(bt->bttv_nr, &mp->rd.value);
+		// dprintk("dvb_bt8xx: dst read gpio 0x%02x\n", (unsigned)mp->dstg.rd.value);
+		break;
+	    case DST_IG_TS:
+		/* Set packet size */
+		bt->TS_Size = mp->psize;
+		break;
+
+	    default:
+		retval = -EINVAL;
+		break;
+	}
+	up(&bt->gpio_lock);
+	return retval;
+}
+
+EXPORT_SYMBOL(bt878_device_control);
+
+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap)
+{
+	unsigned int card_nr;
+	
+	printk("bt878 find by dvb adap: checking \"%s\"\n",adap->name);
+	for (card_nr = 0; card_nr < bt878_num; card_nr++) {
+		if (bt878[card_nr].adap_ptr == adap)
+			return &bt878[card_nr];
+	}
+	printk("bt878 find by dvb adap: NOT found \"%s\"\n",adap->name);
+	return NULL;
+}
+
+EXPORT_SYMBOL(bt878_find_by_dvb_adap);
+
+/***********************/
+/* PCI device handling */
+/***********************/
+
+static int __devinit bt878_probe(struct pci_dev *dev,
+				 const struct pci_device_id *pci_id)
+{
+	int result;
+	unsigned char lat;
+	struct bt878 *bt;
+#if defined(__powerpc__)
+	unsigned int cmd;
+#endif
+
+	printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n",
+	       bt878_num);
+
+	bt = &bt878[bt878_num];
+	bt->dev = dev;
+	bt->nr = bt878_num;
+	bt->shutdown = 0;
+
+	bt->id = dev->device;
+	bt->irq = dev->irq;
+	bt->bt878_adr = pci_resource_start(dev, 0);
+	if (pci_enable_device(dev))
+		return -EIO;
+	if (!request_mem_region(pci_resource_start(dev, 0),
+				pci_resource_len(dev, 0), "bt878")) {
+		return -EBUSY;
+	}
+
+	pci_read_config_byte(dev, PCI_CLASS_REVISION, &bt->revision);
+	pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
+	printk(KERN_INFO "bt878(%d): Bt%x (rev %d) at %02x:%02x.%x, ",
+	       bt878_num, bt->id, bt->revision, dev->bus->number,
+	       PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
+	printk("irq: %d, latency: %d, memory: 0x%lx\n",
+	       bt->irq, lat, bt->bt878_adr);
+
+
+#if defined(__powerpc__)
+	/* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
+	/* response on cards with no firmware is not enabled by OF */
+	pci_read_config_dword(dev, PCI_COMMAND, &cmd);
+	cmd = (cmd | PCI_COMMAND_MEMORY);
+	pci_write_config_dword(dev, PCI_COMMAND, cmd);
+#endif
+
+#ifdef __sparc__
+	bt->bt878_mem = (unsigned char *) bt->bt878_adr;
+#else
+	bt->bt878_mem = ioremap(bt->bt878_adr, 0x1000);
+#endif
+
+	/* clear interrupt mask */
+	btwrite(0, BT848_INT_MASK);
+
+	result = request_irq(bt->irq, bt878_irq,
+			     SA_SHIRQ | SA_INTERRUPT, "bt878",
+			     (void *) bt);
+	if (result == -EINVAL) {
+		printk(KERN_ERR "bt878(%d): Bad irq number or handler\n",
+		       bt878_num);
+		goto fail1;
+	}
+	if (result == -EBUSY) {
+		printk(KERN_ERR
+		       "bt878(%d): IRQ %d busy, change your PnP config in BIOS\n",
+		       bt878_num, bt->irq);
+		goto fail1;
+	}
+	if (result < 0)
+		goto fail1;
+
+	pci_set_master(dev);
+	pci_set_drvdata(dev, bt);
+
+/*        if(init_bt878(btv) < 0) {
+                bt878_remove(dev);
+                return -EIO;
+        }
+*/
+
+	if ((result = bt878_mem_alloc(bt))) {
+		printk("bt878: failed to allocate memory!\n");
+		goto fail2;
+	}
+
+	bt878_make_risc(bt);
+	btwrite(0, BT878_AINT_MASK);
+	bt878_num++;
+
+	return 0;
+
+      fail2:
+	free_irq(bt->irq, bt);
+      fail1:
+	release_mem_region(pci_resource_start(bt->dev, 0),
+			   pci_resource_len(bt->dev, 0));
+	return result;
+}
+
+static void __devexit bt878_remove(struct pci_dev *pci_dev)
+{
+	u8 command;
+	struct bt878 *bt = pci_get_drvdata(pci_dev);
+
+	if (bt878_verbose)
+		printk("bt878(%d): unloading\n", bt->nr);
+
+	/* turn off all capturing, DMA and IRQs */
+	btand(~13, BT878_AGPIO_DMA_CTL);
+
+	/* first disable interrupts before unmapping the memory! */
+	btwrite(0, BT878_AINT_MASK);
+	btwrite(~0x0UL, BT878_AINT_STAT);
+
+	/* disable PCI bus-mastering */
+	pci_read_config_byte(bt->dev, PCI_COMMAND, &command);
+	/* Should this be &=~ ?? */
+	command &= ~PCI_COMMAND_MASTER;
+	pci_write_config_byte(bt->dev, PCI_COMMAND, command);
+
+	free_irq(bt->irq, bt);
+	printk(KERN_DEBUG "bt878_mem: 0x%p.\n", bt->bt878_mem);
+	if (bt->bt878_mem)
+		iounmap(bt->bt878_mem);
+
+	release_mem_region(pci_resource_start(bt->dev, 0),
+			   pci_resource_len(bt->dev, 0));
+	/* wake up any waiting processes
+	   because shutdown flag is set, no new processes (in this queue)
+	   are expected
+	 */
+	bt->shutdown = 1;
+	bt878_mem_free(bt);
+
+	pci_set_drvdata(pci_dev, NULL);
+	return;
+}
+
+static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
+	{PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BROOKTREE_878,
+	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{0,}
+};
+
+MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
+
+static struct pci_driver bt878_pci_driver = {
+      .name 	= "bt878",
+      .id_table = bt878_pci_tbl,
+      .probe 	= bt878_probe,
+      .remove 	= bt878_remove,
+};
+
+static int bt878_pci_driver_registered = 0;
+
+/* This will be used later by dvb-bt8xx to only use the audio
+ * dma of certain cards */
+int bt878_find_audio_dma(void)
+{
+	// pci_register_driver(&bt878_pci_driver);
+	bt878_pci_driver_registered = 1;
+	return 0;
+}
+
+EXPORT_SYMBOL(bt878_find_audio_dma);
+
+/*******************************/
+/* Module management functions */
+/*******************************/
+
+int bt878_init_module(void)
+{
+	bt878_num = 0;
+	bt878_pci_driver_registered = 0;
+
+	printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n",
+	       (BT878_VERSION_CODE >> 16) & 0xff,
+	       (BT878_VERSION_CODE >> 8) & 0xff,
+	       BT878_VERSION_CODE & 0xff);
+/*
+        bt878_check_chipset();
+*/
+	/* later we register inside of bt878_find_audio_dma
+	 * because we may want to ignore certain cards */
+	bt878_pci_driver_registered = 1;
+	return pci_module_init(&bt878_pci_driver);
+}
+
+void bt878_cleanup_module(void)
+{
+	if (bt878_pci_driver_registered) {
+		bt878_pci_driver_registered = 0;
+		pci_unregister_driver(&bt878_pci_driver);
+	}
+	return;
+}
+
+EXPORT_SYMBOL(bt878_init_module);
+EXPORT_SYMBOL(bt878_cleanup_module);
+module_init(bt878_init_module);
+module_exit(bt878_cleanup_module);
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -Nru a/drivers/media/dvb/bt8xx/bt878.h b/drivers/media/dvb/bt8xx/bt878.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/bt878.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,145 @@
+/* 
+    bt878.h - Bt878 audio module (register offsets)
+
+    Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _BT878_H_
+#define _BT878_H_
+
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include "bt848.h"
+
+#define BT878_VERSION_CODE 0x000000
+
+#define BT878_AINT_STAT		0x100
+#define BT878_ARISCS		(0xf<<28)
+#define BT878_ARISC_EN		(1<<27)
+#define BT878_ASCERR		(1<<19)
+#define BT878_AOCERR		(1<<18)
+#define BT878_APABORT		(1<<17)
+#define BT878_ARIPERR		(1<<16)
+#define BT878_APPERR		(1<<15)
+#define BT878_AFDSR		(1<<14)
+#define BT878_AFTRGT		(1<<13)
+#define BT878_AFBUS		(1<<12)
+#define BT878_ARISCI		(1<<11)
+#define BT878_AOFLOW		(1<<3)
+
+#define BT878_AINT_MASK		0x104
+
+#define BT878_AGPIO_DMA_CTL	0x10c
+#define BT878_A_GAIN		(0xf<<28)
+#define BT878_A_G2X		(1<<27)
+#define BT878_A_PWRDN		(1<<26)
+#define BT878_A_SEL		(3<<24)
+#define BT878_DA_SCE		(1<<23)
+#define BT878_DA_LRI		(1<<22)
+#define BT878_DA_MLB		(1<<21)
+#define BT878_DA_LRD		(0x1f<<16)
+#define BT878_DA_DPM		(1<<15)
+#define BT878_DA_SBR		(1<<14)
+#define BT878_DA_ES2		(1<<13)
+#define BT878_DA_LMT		(1<<12)
+#define BT878_DA_SDR		(0xf<<8)
+#define BT878_DA_IOM		(3<<6)
+#define BT878_DA_APP		(1<<5)
+#define BT878_ACAP_EN		(1<<4)
+#define BT878_PKTP		(3<<2)
+#define BT878_RISC_EN		(1<<1)
+#define BT878_FIFO_EN		1
+
+#define BT878_APACK_LEN		0x110
+#define BT878_AFP_LEN		(0xff<<16)
+#define BT878_ALP_LEN		0xfff
+
+#define BT878_ARISC_START	0x114
+
+#define BT878_ARISC_PC		0x120
+
+/* BT878 FUNCTION 0 REGISTERS */
+#define BT878_GPIO_DMA_CTL	0x10c
+
+/* Interrupt register */
+#define BT878_INT_STAT		0x100
+#define BT878_INT_MASK		0x104
+#define BT878_I2CRACK		(1<<25)
+#define BT878_I2CDONE		(1<<8)
+
+#define BT878_MAX 4
+
+#define BT878_RISC_SYNC_MASK	(1 << 15)
+
+extern int bt878_num;
+extern struct bt878 bt878[BT878_MAX];
+
+struct bt878 {
+	struct semaphore  gpio_lock;
+	unsigned int nr;
+	unsigned int bttv_nr;
+	struct dvb_adapter *adap_ptr;
+	struct pci_dev *dev;
+	unsigned int id;
+	unsigned int TS_Size;
+	unsigned char revision;
+	unsigned int irq;
+	unsigned long bt878_adr;
+	unsigned char *bt878_mem; /* function 1 */
+
+	volatile u32 finished_block;
+	volatile u32 last_block;
+	u32 block_count;
+	u32 block_bytes;
+	u32 line_bytes;
+	u32 line_count;
+
+	u32 buf_size;
+	u8 *buf_cpu;
+	dma_addr_t buf_dma;
+
+	u32 risc_size;
+	u32 *risc_cpu;
+	dma_addr_t risc_dma;
+	u32 risc_pos;
+
+	struct tasklet_struct tasklet;
+	int shutdown;	
+};
+
+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
+		u32 irq_err_ignore);
+void bt878_stop(struct bt878 *bt);	     
+
+#if defined(__powerpc__)	/* big-endian */
+extern __inline__ void io_st_le32(volatile unsigned *addr, unsigned val)
+{
+	__asm__ __volatile__("stwbrx %1,0,%2":"=m"(*addr):"r"(val),
+			     "r"(addr));
+	__asm__ __volatile__("eieio":::"memory");
+}
+
+#define bmtwrite(dat,adr)  io_st_le32((unsigned *)(adr),(dat))
+#define bmtread(adr)       ld_le32((unsigned *)(adr))
+#else
+#define bmtwrite(dat,adr)  writel((dat), (char *) (adr))
+#define bmtread(adr)       readl(adr)
+#endif
+
+#endif
diff -Nru a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,530 @@
+/*
+ * Bt8xx based DVB adapter driver 
+ *
+ * Copyright (C) 2002,2003 Florian Schirmer <jolt@tuxbox.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <asm/bitops.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "dvb_demux.h"
+#include "dvb_frontend.h"
+
+#include "dvb-bt8xx.h"
+
+#include "dvb_functions.h"
+
+#include "bt878.h"
+
+/* ID THAT MUST GO INTO i2c ids */
+#ifndef  I2C_DRIVERID_DVB_BT878A
+# define I2C_DRIVERID_DVB_BT878A I2C_DRIVERID_EXP0+10
+#endif
+
+
+#define dprintk if (debug) printk
+
+extern int bttv_get_cardinfo(unsigned int card, int *type, int *cardid);
+extern struct pci_dev* bttv_get_pcidev(unsigned int card);
+
+static LIST_HEAD(card_list);
+static int debug = 0;
+
+static void dvb_bt8xx_task(unsigned long data)
+{
+	struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
+
+	//printk("%d ", finished_block);
+
+	while (card->bt->last_block != card->bt->finished_block) {
+		(card->bt->TS_Size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)(&card->demux, &card->bt->buf_cpu[card->bt->last_block * card->bt->block_bytes], card->bt->block_bytes);
+		card->bt->last_block = (card->bt->last_block + 1) % card->bt->block_count;
+	}
+}
+
+static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+	struct dvb_bt8xx_card *card = dvbdmx->priv;
+
+	dprintk("dvb_bt8xx: start_feed\n");
+	
+	if (!dvbdmx->dmx.frontend)
+		return -EINVAL;
+
+	if (card->active)
+		return 0;
+		
+	card->active = 1;
+	
+//	bt878_start(card->bt, card->gpio_mode);
+
+	return 0;
+}
+
+static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+	struct dvb_bt8xx_card *card = dvbdmx->priv;
+
+	dprintk("dvb_bt8xx: stop_feed\n");
+	
+	if (!dvbdmx->dmx.frontend)
+		return -EINVAL;
+		
+	if (!card->active)
+		return 0;
+
+//	bt878_stop(card->bt);
+
+	card->active = 0;
+
+	return 0;
+}
+
+static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
+{
+	struct dvb_bt8xx_card *card = i2c->data;
+	int retval;
+
+	if (down_interruptible (&card->bt->gpio_lock))
+		return -ERESTARTSYS;
+
+	retval = i2c_transfer(card->i2c_adapter,
+			      (struct i2c_msg*) msgs,
+			      num);
+
+	up(&card->bt->gpio_lock);
+
+	return retval;
+}
+
+static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
+{
+	if ((adev->subsystem_vendor == bdev->subsystem_vendor) &&
+		(adev->subsystem_device == bdev->subsystem_device) &&
+		(adev->bus->number == bdev->bus->number) &&
+		(PCI_SLOT(adev->devfn) == PCI_SLOT(bdev->devfn)))
+		return 1;
+	return 0;
+}
+
+static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev)
+{
+	unsigned int card_nr;
+	
+	/* Hmm, n squared. Hope n is small */
+	for (card_nr = 0; card_nr < bt878_num; card_nr++) {
+		if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev))
+			return &bt878[card_nr];
+	}
+	return NULL;
+}
+
+static int __init dvb_bt8xx_card_match(unsigned int bttv_nr, char *card_name, u32 gpio_mode, u32 op_sync_orin, u32 irq_err_ignore)
+{
+	struct dvb_bt8xx_card *card;
+	struct pci_dev* bttv_pci_dev;
+
+	dprintk("dvb_bt8xx: identified card%d as %s\n", bttv_nr, card_name);
+			
+	if (!(card = kmalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
+		return -ENOMEM;
+
+	memset(card, 0, sizeof(*card));
+	card->bttv_nr = bttv_nr;
+	strncpy(card->card_name, card_name, sizeof(card_name) - 1);
+	
+	if (!(bttv_pci_dev = bttv_get_pcidev(bttv_nr))) {
+		printk("dvb_bt8xx: no pci device for card %d\n", card->bttv_nr);
+		kfree(card);
+		return -EFAULT;
+	}
+
+	if (!(card->bt = dvb_bt8xx_878_match(card->bttv_nr, bttv_pci_dev))) {
+		printk("dvb_bt8xx: unable to determine DMA core of card %d\n", card->bttv_nr);
+	
+		kfree(card);
+		return -EFAULT;
+		
+	}
+	init_MUTEX(&card->bt->gpio_lock);
+	card->bt->bttv_nr = bttv_nr;
+	card->gpio_mode = gpio_mode;
+	card->op_sync_orin = op_sync_orin;
+	card->irq_err_ignore = irq_err_ignore;
+	list_add_tail(&card->list, &card_list);
+
+	return 0;
+}
+
+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_i2c_adap(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *item;
+	
+	printk("find by i2c adap: checking \"%s\"\n",adap->name);
+	list_for_each(item, &card_list) {
+		card = list_entry(item, struct dvb_bt8xx_card, list);
+		if (card->i2c_adapter == adap)
+			return card;
+	}
+	return NULL;
+}
+
+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_pci(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *item;
+	struct device  *dev;
+	struct pci_dev *pci;
+	
+	printk("find by pci: checking \"%s\"\n",adap->name);
+	dev = adap->dev.parent;
+	if (NULL == dev) {
+		/* shoudn't happen with 2.6.0-test7 + newer */
+		printk("attach: Huh? i2c adapter not in sysfs tree?\n");
+		return 0;
+	}
+	pci = to_pci_dev(dev);
+	list_for_each(item, &card_list) {
+		card = list_entry(item, struct dvb_bt8xx_card, list);
+		if (is_pci_slot_eq(pci, card->bt->dev)) {
+			return card;
+		}
+	}
+	return NULL;
+}
+
+static int dvb_bt8xx_attach(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+	
+	printk("attach: checking \"%s\"\n",adap->name);
+
+	/* looking for bt878 cards ... */
+	if (adap->id != (I2C_ALGO_BIT | I2C_HW_B_BT848))
+		return 0;
+	card = dvb_bt8xx_find_by_pci(adap);
+	if (!card)
+		return 0;
+	card->i2c_adapter = adap;
+	printk("attach: \"%s\", to card %d\n",
+	       adap->name, card->bttv_nr);
+	try_module_get(adap->owner);
+
+	return 0;
+}
+
+static void dvb_bt8xx_i2c_adap_free(struct i2c_adapter *adap)
+{
+	module_put(adap->owner);
+}
+
+static int dvb_bt8xx_detach(struct i2c_adapter *adap)
+{
+	struct dvb_bt8xx_card *card;
+
+	card = dvb_bt8xx_find_by_i2c_adap(adap);
+	if (!card)
+		return 0;
+
+	/* This should not happen. We have locked the module! */
+	printk("detach: \"%s\", for card %d removed\n",
+	       adap->name, card->bttv_nr);
+	return 0;
+}
+
+static struct i2c_driver dvb_bt8xx_driver = {
+	.owner           = THIS_MODULE,
+	.name            = "dvb_bt8xx",
+        .id              = I2C_DRIVERID_DVB_BT878A,
+	.flags           = I2C_DF_NOTIFY,
+        .attach_adapter  = dvb_bt8xx_attach,
+        .detach_adapter  = dvb_bt8xx_detach,
+};
+
+static void __init dvb_bt8xx_get_adaps(void)
+{
+	i2c_add_driver(&dvb_bt8xx_driver);
+}
+
+static void __exit dvb_bt8xx_exit_adaps(void)
+{
+	i2c_del_driver(&dvb_bt8xx_driver);
+}
+
+static int __init dvb_bt8xx_load_card( struct dvb_bt8xx_card *card)
+{
+	int result;
+
+	if (!card->i2c_adapter) {
+		printk("dvb_bt8xx: unable to determine i2c adaptor of card %d, deleting\n", card->bttv_nr);
+
+		return -EFAULT;
+	
+	}
+
+	if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name)) < 0) {
+	
+		printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
+		
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		return result;
+		
+	}
+	card->bt->adap_ptr = card->dvb_adapter;
+
+	if (!(dvb_register_i2c_bus(master_xfer, card, card->dvb_adapter, 0))) {
+		printk("dvb_bt8xx: dvb_register_i2c_bus of card%d failed\n", card->bttv_nr);
+
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+
+		return -EFAULT;
+	}
+
+	memset(&card->demux, 0, sizeof(struct dvb_demux));
+
+	card->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING;
+
+	card->demux.priv = card;
+	card->demux.filternum = 256;
+	card->demux.feednum = 256;
+	card->demux.start_feed = dvb_bt8xx_start_feed;
+	card->demux.stop_feed = dvb_bt8xx_stop_feed;
+	card->demux.write_to_decoder = NULL;
+	
+	if ((result = dvb_dmx_init(&card->demux)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	card->dmxdev.filternum = 256;
+	card->dmxdev.demux = &card->demux.dmx;
+	card->dmxdev.capabilities = 0;
+	
+	if ((result = dvb_dmxdev_init(&card->dmxdev, card->dvb_adapter)) < 0) {
+		printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);
+
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	card->fe_hw.source = DMX_FRONTEND_0;
+
+	if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+	
+	card->fe_mem.source = DMX_MEMORY_FE;
+
+	if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_mem)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	if ((result = card->demux.dmx.connect_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
+		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
+
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_unregister_adapter(card->dvb_adapter);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		
+		return result;
+	}
+
+	dvb_net_init(card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
+
+	tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
+	
+	bt878_start(card->bt, card->gpio_mode, card->op_sync_orin, card->irq_err_ignore);
+
+	return 0;
+}
+
+static int __init dvb_bt8xx_load_all(void)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *entry, *entry_safe;
+
+	list_for_each_safe(entry, entry_safe, &card_list) {
+		card = list_entry(entry, struct dvb_bt8xx_card, list);
+		if (dvb_bt8xx_load_card(card) < 0) {
+			list_del(&card->list);
+			kfree(card);
+			continue;
+		}
+	}
+	return 0;
+
+}
+
+#define BT878_NEBULA	0x68
+#define BT878_TWINHAN_DST 0x71
+
+static int __init dvb_bt8xx_init(void)
+{
+	unsigned int card_nr = 0;
+	int card_id;
+	int card_type;
+
+	dprintk("dvb_bt8xx: enumerating available bttv cards...\n");
+	
+	while (bttv_get_cardinfo(card_nr, &card_type, &card_id) == 0) {
+		switch(card_id) {
+			case 0x001C11BD:
+				dvb_bt8xx_card_match(card_nr, "Pinnacle PCTV DVB-S",
+					       0x0400C060, 0, 0);
+				/* 26, 15, 14, 6, 5 
+				 * A_G2X  DA_DPM DA_SBR DA_IOM_DA 
+				 * DA_APP(parallel) */
+				break;
+			case 0x01010071:
+nebula:
+				dvb_bt8xx_card_match(card_nr, "Nebula DigiTV DVB-T",
+					     (1 << 26) | (1 << 14) | (1 << 5),
+					     0, 0);
+				/* A_PWRDN DA_SBR DA_APP (high speed serial) */
+				break;
+			case 0x07611461:
+				dvb_bt8xx_card_match(card_nr, "Avermedia DVB-T",
+					     (1 << 26) | (1 << 14) | (1 << 5),
+					     0, 0);
+				/* A_PWRDN DA_SBR DA_APP (high speed serial) */
+				break;
+			case 0x0:
+				if (card_type == BT878_NEBULA ||
+					card_type == BT878_TWINHAN_DST)
+					goto dst;
+				goto unknown_card;
+			case 0x2611BD:
+			case 0x11822:
+dst:
+				dvb_bt8xx_card_match(card_nr, "DST DVB-S", 0x2204f2c,
+						BT878_RISC_SYNC_MASK,
+						BT878_APABORT | BT878_ARIPERR | BT878_APPERR | BT878_AFBUS);
+				/* 25,21,14,11,10,9,8,3,2 then
+				 * 0x33 = 5,4,1,0
+				 * A_SEL=SML, DA_MLB, DA_SBR, 
+				 * DA_SDR=f, fifo trigger = 32 DWORDS
+				 * IOM = 0 == audio A/D
+				 * DPM = 0 == digital audio mode
+				 * == async data parallel port
+				 * then 0x33 (13 is set by start_capture)
+				 * DA_APP = async data parallel port, 
+				 * ACAP_EN = 1,
+				 * RISC+FIFO ENABLE */
+				break;
+			default:
+unknown_card:
+				printk("%s: unknown card_id found %0X\n",
+					__FUNCTION__, card_id);
+				if (card_type == BT878_NEBULA) {
+					printk("%s: bttv type set to nebula\n",
+						__FUNCTION__);
+					goto nebula;
+				}
+				if (card_type == BT878_TWINHAN_DST) {
+					printk("%s: bttv type set to Twinhan DST\n",
+						__FUNCTION__);
+					goto dst;
+				}
+				printk("%s: unknown card_type found %0X, NOT LOADED\n",
+					__FUNCTION__, card_type);
+				printk("%s: unknown card_nr found %0X\n",
+					__FUNCTION__, card_nr);
+		}
+		card_nr++;
+	}
+	dvb_bt8xx_get_adaps();
+	dvb_bt8xx_load_all();
+
+	return 0;
+
+}
+
+static void __exit dvb_bt8xx_exit(void)
+{
+	struct dvb_bt8xx_card *card;
+	struct list_head *entry, *entry_safe;
+
+	dvb_bt8xx_exit_adaps();
+	list_for_each_safe(entry, entry_safe, &card_list) {
+		card = list_entry(entry, struct dvb_bt8xx_card, list);
+		
+		dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
+
+		bt878_stop(card->bt);
+		tasklet_kill(&card->bt->tasklet);
+		dvb_net_release(&card->dvbnet);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
+		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
+		dvb_dmxdev_release(&card->dmxdev);
+		dvb_dmx_release(&card->demux);
+		dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
+		dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
+		dvb_unregister_adapter(card->dvb_adapter);
+		
+		list_del(&card->list);
+		kfree(card);
+	}
+
+}
+
+module_init(dvb_bt8xx_init);
+module_exit(dvb_bt8xx_exit);
+MODULE_DESCRIPTION("Bt8xx based DVB adapter driver");
+MODULE_AUTHOR("Florian Schirmer <jolt@tuxbox.org>");
+MODULE_LICENSE("GPL");
+MODULE_PARM(debug, "i");
diff -Nru a/drivers/media/dvb/bt8xx/dvb-bt8xx.h b/drivers/media/dvb/bt8xx/dvb-bt8xx.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,47 @@
+/*
+ * Bt8xx based DVB adapter driver 
+ *
+ * Copyright (C) 2002,2003 Florian Schirmer <jolt@tuxbox.org>
+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
+ * Copyright (C) 1999-2001 Ralph  Metzler & Marcus Metzler for convergence integrated media GmbH
+ * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/i2c.h>
+#include "dvbdev.h"
+#include "dvb_net.h"
+
+struct dvb_bt8xx_card {
+
+	struct list_head list;
+	u8 active;
+	char card_name[32];
+	struct dvb_adapter *dvb_adapter;
+	struct bt878 *bt;
+	unsigned int bttv_nr;
+	struct dvb_demux demux;
+	struct dmxdev dmxdev;
+	struct dmx_frontend fe_hw;
+	struct dmx_frontend fe_mem;
+	u32 gpio_mode;
+	u32 op_sync_orin;
+	u32 irq_err_ignore;
+	struct i2c_adapter *i2c_adapter;
+	struct dvb_net dvbnet;
+				
+};
diff -Nru a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h
--- a/drivers/media/dvb/dvb-core/demux.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/dvb-core/demux.h	Thu Jan  8 23:00:23 2004
@@ -44,6 +44,15 @@
 #endif 
 
 /*
+ * DMX_MAX_SECFEED_SIZE: Maximum length (in bytes) of a private section feed filter.
+ */ 
+
+#ifndef DMX_MAX_SECFEED_SIZE 
+#define DMX_MAX_SECFEED_SIZE 4096
+#endif 
+
+
+/*
  * enum dmx_success: Success codes for the Demux Callback API. 
  */ 
 
@@ -143,9 +152,9 @@
         int check_crc;
 	u32 crc_val;
 
-        u8 secbuf[4096];
-        int secbufp;
-        int seclen;
+        u8 *secbuf;
+        u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
+        u16 secbufp, seclen, tsfeedp;
 
         int (*set) (struct dmx_section_feed* feed, 
 		    u16 pid, 
diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c
--- a/drivers/media/dvb/dvb-core/dvb_demux.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c	Thu Jan  8 23:00:23 2004
@@ -34,6 +34,11 @@
 #include "dvb_functions.h"
 
 #define NOBUFS  
+/* 
+** #define DVB_DEMUX_SECTION_LOSS_LOG to monitor payload loss in the syslog
+*/
+// #define DVB_DEMUX_SECTION_LOSS_LOG
+
 
 LIST_HEAD(dmx_muxs);
 
@@ -87,7 +92,7 @@
 }
 
 
-static inline int payload(const u8 *tsp)
+static inline u8 payload(const u8 *tsp)
 {
 	if (!(tsp[3]&0x10)) // no payload?
 		return 0;
@@ -188,9 +193,7 @@
 	struct dvb_demux_filter *f = feed->filter;
 	struct dmx_section_feed *sec = &feed->feed.sec;
 	u8 *buf = sec->secbuf;
-
-	if (sec->secbufp != sec->seclen)
-		return -1;
+	int section_syntax_indicator;
 
 	if (!sec->is_filtering)
 		return 0;
@@ -198,15 +201,19 @@
 	if (!f)
 		return 0;
 
-	if (sec->check_crc && demux->check_crc32(feed, sec->secbuf, sec->seclen))
+	if (sec->check_crc) {
+		section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0);
+		if (section_syntax_indicator &&
+		    demux->check_crc32(feed, sec->secbuf, sec->seclen))
 		return -1;
+	}
 
 	do {
 		if (dvb_dmx_swfilter_sectionfilter(feed, f) < 0)
 			return -1;
 	} while ((f = f->next) && sec->is_filtering);
 
-	sec->secbufp = sec->seclen = 0;
+	sec->seclen = 0;
 
 	memset(buf, 0, DVB_DEMUX_MASK_MAX);
  
@@ -214,128 +221,147 @@
 }
 
 
-static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf) 
+static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
 {
-	struct dvb_demux *demux = feed->demux;
 	struct dmx_section_feed *sec = &feed->feed.sec;
-	int p, count;
-	int ccok, rest;
-	u8 cc;
-
-	if (!(count = payload(buf)))
-		return -1;
-
-	p = 188-count;
-
-	cc = buf[3] & 0x0f;
-	ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
-	feed->cc = cc;
-
-	if (buf[1] & 0x40) { // PUSI set
-		// offset to start of first section is in buf[p] 
-		if (p+buf[p]>187) // trash if it points beyond packet
-			return -1;
 
-		if (buf[p] && ccok) { // rest of previous section?
-			// did we have enough data in last packet to calc length?
-			int tmp = 3 - sec->secbufp;
-
-			if (tmp > 0 && tmp != 3) {
-				if (p + tmp >= 187)
-					return -1;
-
-				demux->memcopy (feed, sec->secbuf+sec->secbufp,
-					       buf+p+1, tmp);
-
-				sec->seclen = section_length(sec->secbuf);
-
-				if (sec->seclen > 4096) 
-					return -1;
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+	if(sec->secbufp < sec->tsfeedp)
+	{
+		int i, n = sec->tsfeedp - sec->secbufp;
+
+		/* section padding is done with 0xff bytes entirely.
+		** due to speed reasons, we won't check all of them
+		** but just first and last
+		*/
+		if(sec->secbuf[0] != 0xff || sec->secbuf[n-1] != 0xff)
+		{
+			printk("dvb_demux.c section ts padding loss: %d/%d\n", 
+			       n, sec->tsfeedp);
+			printk("dvb_demux.c pad data:");
+			for(i = 0; i < n; i++)
+				printk(" %02x", sec->secbuf[i]);
+			printk("\n");
 			}
-
-			rest = sec->seclen - sec->secbufp;
-
-			if (rest == buf[p] && sec->seclen) {
-				demux->memcopy (feed, sec->secbuf + sec->secbufp,
-					       buf+p+1, buf[p]);
-				sec->secbufp += buf[p];
-				dvb_dmx_swfilter_section_feed(feed);
 			}
-		}
-
-		p += buf[p] + 1; 		// skip rest of last section
-		count = 188 - p;
+#endif
 
-		while (count) {
+	sec->tsfeedp = sec->secbufp = sec->seclen = 0;
+	sec->secbuf = sec->secbuf_base;
+		}
 
-			sec->crc_val = ~0;
+/* 
+** Losless Section Demux 1.4 by Emard
+*/
+static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed, const u8 *buf, u8 len)
+{
+	struct dvb_demux *demux = feed->demux;
+	struct dmx_section_feed *sec = &feed->feed.sec;
+	u16 limit, seclen, n;
 
-			if ((count>2) && // enough data to determine sec length?
-			    ((sec->seclen = section_length(buf+p)) <= count)) {
-				if (sec->seclen>4096) 
-					return -1;
+	if(sec->tsfeedp >= DMX_MAX_SECFEED_SIZE)
+		return 0;
 
-				demux->memcopy (feed, sec->secbuf, buf+p,
-					       sec->seclen);
+	if(sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE)
+	{
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		printk("dvb_demux.c section buffer full loss: %d/%d\n", 
+		       sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, DMX_MAX_SECFEED_SIZE);
+#endif
+		len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp;
+	}
 
-				sec->secbufp = sec->seclen;
-				p += sec->seclen;
-				count = 188 - p;
+	if(len <= 0)
+		return 0;
 
-				dvb_dmx_swfilter_section_feed(feed);
+	demux->memcopy(feed, sec->secbuf_base + sec->tsfeedp, buf, len);
+	sec->tsfeedp += len;
 
-				// filling bytes until packet end?
-				if (count && buf[p]==0xff) 
-					count=0;
+	/* -----------------------------------------------------
+	** Dump all the sections we can find in the data (Emard)
+	*/
 
-			} else { // section continues to following TS packet
-				demux->memcopy(feed, sec->secbuf, buf+p, count);
-				sec->secbufp+=count;
-				count=0;
-			}
+	limit = sec->tsfeedp;
+	if(limit > DMX_MAX_SECFEED_SIZE)
+		return -1; /* internal error should never happen */
+
+	/* to be sure always set secbuf */
+	sec->secbuf = sec->secbuf_base + sec->secbufp;
+
+	for(n = 0; sec->secbufp + 2 < limit; n++)
+	{
+		seclen = section_length(sec->secbuf);
+		if(seclen <= 0 || seclen > DMX_MAX_SECFEED_SIZE 
+		   || seclen + sec->secbufp > limit)
+			return 0;
+		sec->seclen = seclen;
+		sec->crc_val = ~0;
+		/* dump [secbuf .. secbuf+seclen) */
+		dvb_dmx_swfilter_section_feed(feed);
+		sec->secbufp += seclen; /* secbufp and secbuf moving together is */
+		sec->secbuf += seclen; /* redundand but saves pointer arithmetic */
 		}
 
 		return 0;
 	}
 
-	// section continued below
-	if (!ccok)
-		return -1;
 
-	if (!sec->secbufp) // any data in last ts packet?
-		return -1;
+static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf) 
+{
+	u8 p, count;
+	int ccok;
+	u8 cc;
 
-	// did we have enough data in last packet to calc section length?
-	if (sec->secbufp < 3) {
-		int tmp = 3 - sec->secbufp;
+	count = payload(buf);
 		
-		if (tmp>count)
+	if (count == 0)  /* count == 0 if no payload or out of range */
 			return -1;
 
-		sec->crc_val = ~0;
-
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, tmp);
+	p = 188-count; /* payload start */
 
-		sec->seclen = section_length(sec->secbuf);
-
-		if (sec->seclen > 4096) 
-			return -1;
+	cc = buf[3] & 0x0f;
+	ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
+	feed->cc = cc;
+	if(ccok == 0)
+	{
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		printk("dvb_demux.c discontinuity detected %d bytes lost\n", count);
+		/* those bytes under sume circumstances will again be reported
+		** in the following dvb_dmx_swfilter_section_new
+		*/
+#endif
+		dvb_dmx_swfilter_section_new(feed);
+		return 0;
 	}
 
-	rest = sec->seclen - sec->secbufp;
-
-	if (rest < 0)
-		return -1;
-
-	if (rest <= count) {	// section completed in this TS packet
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, rest);
-		sec->secbufp += rest;
-		dvb_dmx_swfilter_section_feed(feed);
-	} else 	{	// section continues in following ts packet
-		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, count);
-		sec->secbufp += count;
+	if(buf[1] & 0x40)
+	{
+		// PUSI=1 (is set), section boundary is here
+		if(count > 1 && buf[p] < count)
+		{
+			const u8 *before = buf+p+1;
+			u8 before_len = buf[p];
+			const u8 *after = before+before_len;
+			u8 after_len = count-1-before_len;
+
+			dvb_dmx_swfilter_section_copy_dump(feed, before, before_len);
+			dvb_dmx_swfilter_section_new(feed);
+			dvb_dmx_swfilter_section_copy_dump(feed, after, after_len);
+		}
+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
+		else
+			if(count > 0)
+				printk("dvb_demux.c PUSI=1 but %d bytes lost\n", count);
+#endif
 	}
+	else
+	{
+		// PUSI=0 (is not set), no section boundary
+		const u8 *entire = buf+p;
+		u8 entire_len = count;
 
+		dvb_dmx_swfilter_section_copy_dump(feed, entire, entire_len);
+	}
 	return 0;
 }
 
@@ -439,6 +465,50 @@
 	spin_unlock(&demux->lock);
 }
 
+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
+{
+	int p = 0,i, j;
+	u8 tmppack[188];
+	spin_lock(&demux->lock);
+
+	if ((i = demux->tsbufp)) {
+		if (count < (j=204-i)) {
+			memcpy(&demux->tsbuf[i], buf, count);
+			demux->tsbufp += count;
+			goto bailout;
+		}
+		memcpy(&demux->tsbuf[i], buf, j);
+		if ((demux->tsbuf[0] == 0x47)|(demux->tsbuf[0]==0xB8))  {
+			memcpy(tmppack, demux->tsbuf, 188);
+			if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
+			dvb_dmx_swfilter_packet(demux, tmppack);
+		}
+		demux->tsbufp = 0;
+		p += j;
+	}
+
+	while (p < count) {
+		if ((buf[p] == 0x47)|(buf[p] == 0xB8)) {
+			if (count-p >= 204) {
+				memcpy(tmppack, buf+p, 188);
+				if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
+				dvb_dmx_swfilter_packet(demux, tmppack);
+				p += 204;
+			} else {
+				i = count-p;
+				memcpy(demux->tsbuf, buf+p, i);
+				demux->tsbufp=i;
+				goto bailout;
+			}
+		} else { 
+			p++;
+		}
+	}
+
+bailout:
+	spin_unlock(&demux->lock);
+}
+
 
 static struct dvb_demux_filter * dvb_dmx_filter_alloc(struct dvb_demux *demux)
 {
@@ -472,33 +542,38 @@
 	return &demux->feed[i];
 }
 
-
-static int dmx_pid_set (u16 pid, struct dvb_demux_feed *feed)
+static int dvb_demux_feed_find(struct dvb_demux_feed *feed)
 {
-	struct dvb_demux *demux = feed->demux;
-	struct list_head *pos, *n, *head=&demux->feed_list;
+	struct dvb_demux_feed *entry;
 
-	if (pid > DMX_MAX_PID)
-		return -EINVAL;
+	list_for_each_entry(entry, &feed->demux->feed_list, list_head)
+		if (entry == feed)
+			return 1;
 
-	if (pid == feed->pid)
 		return 0;
-
-	if (feed->pid <= DMX_MAX_PID) {
-		list_for_each_safe(pos, n, head) {
-			if (DMX_FEED_ENTRY(pos)->pid == feed->pid) {
-				list_del(pos);
-				break;
-			}
 		}
+
+static void dvb_demux_feed_add(struct dvb_demux_feed *feed)
+{
+	if (dvb_demux_feed_find(feed)) {
+		printk(KERN_ERR "%s: feed already in list (type=%x state=%x pid=%x)\n",
+				__FUNCTION__, feed->type, feed->state, feed->pid);
+		return;
 	}
 
-	list_add(&feed->list_head, head);
-	feed->pid = pid;
+	list_add(&feed->list_head, &feed->demux->feed_list);
+}
 
-	return 0;
+static void dvb_demux_feed_del(struct dvb_demux_feed *feed)
+{
+	if (!(dvb_demux_feed_find(feed))) {
+		printk(KERN_ERR "%s: feed not in list (type=%x state=%x pid=%x)\n",
+				__FUNCTION__, feed->type, feed->state, feed->pid);
+		return;
 }
 
+	list_del(&feed->list_head);
+}
 
 static int dmx_ts_feed_set (struct dmx_ts_feed* ts_feed, u16 pid, int ts_type, 
 		     enum dmx_ts_pes pes_type, size_t callback_length, 
@@ -507,7 +582,9 @@
 {
 	struct dvb_demux_feed *feed = (struct dvb_demux_feed *) ts_feed;
 	struct dvb_demux *demux = feed->demux;
-	int ret;
+
+	if (pid > DMX_MAX_PID)
+		return -EINVAL;
 	
 	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
@@ -524,26 +601,13 @@
 			return -EINVAL;
 		}
 
-		if ((pes_type != DMX_TS_PES_PCR0) && 
-		    (pes_type != DMX_TS_PES_PCR1) && 
-		    (pes_type != DMX_TS_PES_PCR2) && 
-		    (pes_type != DMX_TS_PES_PCR3)) {
-			if ((ret = dmx_pid_set(pid, feed))<0) {
-				up(&demux->mutex);
-				return ret;
-			}
-		} else
-			feed->pid = pid;
-				
 		demux->pesfilter[pes_type] = feed;
-		demux->pids[pes_type] = feed->pid;
-	} else {
-		if ((ret = dmx_pid_set(pid, feed))<0) {
-			up(&demux->mutex);
-			return ret;
-		}
+		demux->pids[pes_type] = pid;
 	}
 
+	dvb_demux_feed_add(feed);
+
+	feed->pid = pid;
 	feed->buffer_size = circular_buffer_size;
 	feed->descramble = descramble;
 	feed->timeout = timeout;
@@ -687,7 +751,6 @@
 {
 	struct dvb_demux *demux = (struct dvb_demux *) dmx;
 	struct dvb_demux_feed *feed = (struct dvb_demux_feed *) ts_feed;
-	struct list_head *pos, *n, *head=&demux->feed_list;
 
 	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
@@ -707,14 +770,9 @@
 	feed->state = DMX_STATE_FREE;
 	feed->filter->state = DMX_STATE_FREE;
 
-	if (feed->pid <= DMX_MAX_PID) {
-		list_for_each_safe(pos, n, head)
-			if (DMX_FEED_ENTRY(pos)->pid == feed->pid) {
-				list_del(pos);
-				break;
-			}
+	dvb_demux_feed_del(feed);
+
 		feed->pid = 0xffff;
-	}
 	
 	if (feed->ts_type & TS_DECODER)
 		demux->pesfilter[feed->pes_type] = NULL;
@@ -766,7 +824,6 @@
 {
 	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
 	struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-	struct list_head *pos, *n, *head=&dvbdmx->feed_list;
 
 	if (pid>0x1fff)
 		return -EINVAL;
@@ -774,16 +831,7 @@
 	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 	
-	if (dvbdmxfeed->pid <= DMX_MAX_PID) {
-		list_for_each_safe(pos, n, head) {
-			if (DMX_FEED_ENTRY(pos)->pid == dvbdmxfeed->pid) {
-				list_del(pos);
-				break;
-			}
-		}
-	}
-
-	list_add(&dvbdmxfeed->list_head, head);
+	dvb_demux_feed_add(dvbdmxfeed);
 
 	dvbdmxfeed->pid = pid;
 	dvbdmxfeed->buffer_size=circular_buffer_size;
@@ -848,6 +896,9 @@
 		up(&dvbdmx->mutex);
 		return -EINVAL;
 	}
+
+	dvbdmxfeed->feed.sec.tsfeedp = 0;
+	dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
 	dvbdmxfeed->feed.sec.secbufp=0;
 	dvbdmxfeed->feed.sec.seclen=0;
 	
@@ -946,7 +997,9 @@
 	dvbdmxfeed->cb.sec=callback;
 	dvbdmxfeed->demux=dvbdmx;
 	dvbdmxfeed->pid=0xffff;
-	dvbdmxfeed->feed.sec.secbufp=0;
+	dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
+	dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0;
+	dvbdmxfeed->feed.sec.tsfeedp = 0;
 	dvbdmxfeed->filter=0;
 	dvbdmxfeed->buffer=0;
 
@@ -970,7 +1023,6 @@
 {
 	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
 	struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
-	struct list_head *pos, *n, *head=&dvbdmx->feed_list;
 
 	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
@@ -987,15 +1039,9 @@
 #endif
 	dvbdmxfeed->state=DMX_STATE_FREE;
 
-	if (dvbdmxfeed->pid <= DMX_MAX_PID) {
-		list_for_each_safe(pos, n, head) {
-			if (DMX_FEED_ENTRY(pos)->pid == dvbdmxfeed->pid) {
-				list_del(pos);
-				break;
-			}
-		}
+	dvb_demux_feed_del(dvbdmxfeed);
+
 		dvbdmxfeed->pid = 0xffff;
-	}
 
 	up(&dvbdmx->mutex);
 	return 0;
diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h
--- a/drivers/media/dvb/dvb-core/dvb_demux.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/dvb-core/dvb_demux.h	Thu Jan  8 23:00:23 2004
@@ -127,7 +127,7 @@
 
 #define DMX_MAX_PID 0x2000
 	struct list_head feed_list;
-        u8 tsbuf[188];
+        u8 tsbuf[204];
         int tsbufp;
 
 	struct semaphore mutex;
@@ -140,6 +140,7 @@
 void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
 void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, size_t count);
 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count);
+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count);
 
 int dvbdmx_connect_frontend(struct dmx_demux *demux, struct dmx_frontend *frontend);
 int dvbdmx_disconnect_frontend(struct dmx_demux *demux);
diff -Nru a/drivers/media/dvb/dvb-core/dvb_filter.c b/drivers/media/dvb/dvb-core/dvb_filter.c
--- a/drivers/media/dvb/dvb-core/dvb_filter.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/dvb-core/dvb_filter.c	Thu Jan  8 23:00:24 2004
@@ -564,14 +564,18 @@
 	p2ts->priv=priv;
 }
 
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len)
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+		      int len, int payload_start)
 {
 	unsigned char *buf=p2ts->buf;
 	int ret=0, rest;
 	
 	//len=6+((pes[4]<<8)|pes[5]);
 
+	if (payload_start)
 	buf[1]|=0x40;
+	else
+		buf[1]&=~0x40;
 	while (len>=184) {
 		buf[3]=0x10|((p2ts->cc++)&0x0f);
 		memcpy(buf+4, pes, 184);
diff -Nru a/drivers/media/dvb/dvb-core/dvb_filter.h b/drivers/media/dvb/dvb-core/dvb_filter.h
--- a/drivers/media/dvb/dvb-core/dvb_filter.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/dvb-core/dvb_filter.h	Thu Jan  8 23:00:23 2004
@@ -37,7 +37,8 @@
 void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid, 
 		 	    dvb_filter_pes2ts_cb_t *cb, void *priv);
 
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len);
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+		      int len, int payload_start);
 
 
 #define PROG_STREAM_MAP  0xBC
diff -Nru a/drivers/media/dvb/dvb-core/dvb_i2c.c b/drivers/media/dvb/dvb-core/dvb_i2c.c
--- a/drivers/media/dvb/dvb-core/dvb_i2c.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/dvb-core/dvb_i2c.c	Thu Jan  8 23:00:24 2004
@@ -51,6 +51,7 @@
 
 	client->detach = dev->detach;
 	client->owner = dev->owner;
+	client->data = dev->data;
 
 	INIT_LIST_HEAD(&client->list_head);
 
diff -Nru a/drivers/media/dvb/dvb-core/dvb_ksyms.c b/drivers/media/dvb/dvb-core/dvb_ksyms.c
--- a/drivers/media/dvb/dvb-core/dvb_ksyms.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/dvb-core/dvb_ksyms.c	Thu Jan  8 23:00:24 2004
@@ -18,6 +18,7 @@
 EXPORT_SYMBOL(dvb_dmx_swfilter_packet);
 EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
 EXPORT_SYMBOL(dvb_dmx_swfilter);
+EXPORT_SYMBOL(dvb_dmx_swfilter_204);
 EXPORT_SYMBOL(dvbdmx_connect_frontend);
 EXPORT_SYMBOL(dvbdmx_disconnect_frontend);
 
diff -Nru a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c	Thu Jan  8 23:00:24 2004
@@ -9,24 +9,18 @@
  *                       & Marcus Metzler for convergence integrated media GmbH
  *
  * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
  * of the License, or (at your option) any later version.
  * 
- *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
+ * GNU Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
+ * You should have received a copy of the GNU Lesser General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- * 
- *
- * the project's page is at http://www.linuxtv.org/dvb/
  */
 
 
@@ -167,11 +161,11 @@
 }
 
 
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_init);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_empty);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_free);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_avail);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush_spinlock_wakeup);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_read);
-EXPORT_SYMBOL_GPL(dvb_ringbuffer_write);
+EXPORT_SYMBOL(dvb_ringbuffer_init);
+EXPORT_SYMBOL(dvb_ringbuffer_empty);
+EXPORT_SYMBOL(dvb_ringbuffer_free);
+EXPORT_SYMBOL(dvb_ringbuffer_avail);
+EXPORT_SYMBOL(dvb_ringbuffer_flush);
+EXPORT_SYMBOL(dvb_ringbuffer_flush_spinlock_wakeup);
+EXPORT_SYMBOL(dvb_ringbuffer_read);
+EXPORT_SYMBOL(dvb_ringbuffer_write);
diff -Nru a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h	Thu Jan  8 23:00:24 2004
@@ -16,7 +16,7 @@
  * 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.
+ * GNU Lesser General Public License for more details.
  * 
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program; if not, write to the Free Software
diff -Nru a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
--- a/drivers/media/dvb/frontends/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/Kconfig	Thu Jan  8 23:00:23 2004
@@ -1,6 +1,17 @@
 comment "Supported Frontend Modules"
 	depends on DVB
 
+config DVB_TWINHAN_DST
+	tristate "TWINHAN DST based DVB-S frontend (QPSK)"
+	depends on DVB_CORE
+	help
+	  Used in such cards as the VP-1020/1030, Twinhan DST,
+	  VVmer TV@SAT. Say Y when you want to support frontends 
+	  using this asic.
+
+	  This module requires the dvb-bt8xx driver and dvb bt878
+	  module.
+
 config DVB_STV0299
 	tristate "STV0299 based DVB-S frontend (QPSK)"
 	depends on DVB_CORE
@@ -26,6 +37,23 @@
  	  DVB adapter simply enable all supported frontends, the
  	  right one will get autodetected.
 
+
+config DVB_SP887X_FIRMWARE_FILE
+        string "Full pathname of sp887x firmware file"
+        depends on DVB_SP887X
+        default "/usr/lib/hotplug/firmware/sc_main.mc"
+        help
+          This driver needs a copy of the Avermedia firmware. The version tested
+	  is part of the Avermedia DVB-T 1.3.26.3 Application. This can be downloaded
+	  from the Avermedia web site.
+	  If the software is installed in Windows the file will be in the
+	  /Program Files/AVerTV DVB-T/ directory and is called sc_main.mc.
+	  Alternatively it can "extracted" from the install cab files but this will have
+	  to be done in windows as I don't know of a linux version of extract.exe.
+	  Copy this file to /usr/lib/hotplug/firmware/sc_main.mc.
+	  With this version of the file the first 10 bytes are discarded and the next
+	  0x4000 loaded. This may change in future versions.
+
 config DVB_ALPS_TDLB7
 	tristate "Alps TDLB7 (OFDM)"
 	depends on DVB_CORE
@@ -138,10 +166,10 @@
 config DVB_TDA1004X_FIRMWARE_FILE
         string "Full pathname of tda1004x.bin firmware file"
         depends on DVB_TDA1004X
-        default "/etc/dvb/tda1004x.bin"
+        default "/usr/lib/hotplug/firmware/tda1004x.bin"
         help
           The TDA1004X requires additional firmware in order to function.
           The firmware file can obtained as follows:
             wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
             unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
-            mv ttlcdacc.dll /etc/dvb/tda1004x.bin
+            mv ttlcdacc.dll /usr/lib/hotplug/firmware/tda1004x.bin
diff -Nru a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
--- a/drivers/media/dvb/frontends/Makefile	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/Makefile	Thu Jan  8 23:00:23 2004
@@ -4,6 +4,7 @@
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
 
+obj-$(CONFIG_DVB_TWINHAN_DST) += dst.o
 obj-$(CONFIG_DVB_STV0299) += stv0299.o
 obj-$(CONFIG_DVB_ALPS_TDLB7) += alps_tdlb7.o
 obj-$(CONFIG_DVB_ALPS_TDMB7) += alps_tdmb7.o
diff -Nru a/drivers/media/dvb/frontends/alps_tdmb7.c b/drivers/media/dvb/frontends/alps_tdmb7.c
--- a/drivers/media/dvb/frontends/alps_tdmb7.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/alps_tdmb7.c	Thu Jan  8 23:00:23 2004
@@ -159,7 +159,7 @@
 	cx22700_writereg (i2c, 0x00, 0x02);   /*  soft reset */
 	cx22700_writereg (i2c, 0x00, 0x00);
 
-	dvb_delay (HZ/100);
+	dvb_delay(10);
 	
 	for (i=0; i<sizeof(init_tab); i+=2)
 		cx22700_writereg (i2c, init_tab[i], init_tab[i+1]);
@@ -281,15 +281,15 @@
 
 	val = cx22700_readreg (i2c, 0x02);
 
-	if ((val >> 3) > 4)
+	if (((val >> 3) & 0x07) > 4)
 		p->code_rate_HP = FEC_AUTO;
 	else
-		p->code_rate_HP = fec_tab[val >> 3];
+		p->code_rate_HP = fec_tab[(val >> 3) & 0x07];
 
-	if ((val & 0x7) > 4)
+	if ((val & 0x07) > 4)
 		p->code_rate_LP = FEC_AUTO;
 	else
-		p->code_rate_LP = fec_tab[val >> 3];
+		p->code_rate_LP = fec_tab[val & 0x07];
 
 
 	val = cx22700_readreg (i2c, 0x03);
@@ -333,7 +333,7 @@
 		if (sync & 0x10)
 			*status |= FE_HAS_SYNC;
 
-		if (sync & 0x10)
+		if (*status == 0x0f)
 			*status |= FE_HAS_LOCK;
 
 		break;
diff -Nru a/drivers/media/dvb/frontends/at76c651.c b/drivers/media/dvb/frontends/at76c651.c
--- a/drivers/media/dvb/frontends/at76c651.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/frontends/at76c651.c	Thu Jan  8 23:00:24 2004
@@ -4,7 +4,8 @@
  * Atmel DVB-C Frontend Driver (at76c651/dat7021)
  *
  * Copyright (C) 2001 fnbrd <fnbrd@gmx.de>
- *             & 2002 Andreas Oberritter <andreas@oberritter.de>
+ *             & 2002 Andreas Oberritter <obi@linuxtv.org>
+ *             & 2003 Wolfram Joost <dbox2@frokaschwei.de>
  *
  * 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
@@ -524,6 +525,6 @@
 module_exit(at76c651_exit);
 
 MODULE_DESCRIPTION("at76c651/dat7021 dvb-c frontend driver");
-MODULE_AUTHOR("Andreas Oberritter <andreas@oberritter.de>");
+MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>");
 MODULE_LICENSE("GPL");
 MODULE_PARM(debug, "i");
diff -Nru a/drivers/media/dvb/frontends/cx24110.c b/drivers/media/dvb/frontends/cx24110.c
--- a/drivers/media/dvb/frontends/cx24110.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/cx24110.c	Thu Jan  8 23:00:23 2004
@@ -248,7 +248,7 @@
         cx24108_write(i2c,pll);
         cx24110_writereg(i2c,0x56,0x7f);
 
-	dvb_delay(HZ/10); /* wait a moment for the tuner pll to lock */
+	dvb_delay(10); /* wait a moment for the tuner pll to lock */
 
 	/* tuner pll lock can be monitored on GPIO pin 4 of cx24110 */
         while (!(cx24110_readreg(i2c,0x66)&0x20)&&i<1000)
diff -Nru a/drivers/media/dvb/frontends/dst-bt878.h b/drivers/media/dvb/frontends/dst-bt878.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/dst-bt878.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,38 @@
+/*
+ * dst-bt878.h: part of the DST driver for the TwinHan DST Frontend
+ *
+ * Copyright (C) 2003 Jamie Honan
+ */
+
+struct dst_gpio_enable {
+	u32	mask;
+	u32	enable;
+};
+
+struct dst_gpio_output {
+	u32	mask;
+	u32	highvals;
+};
+
+struct dst_gpio_read {
+	unsigned long value;
+};
+
+union dst_gpio_packet {
+	struct dst_gpio_enable enb;
+	struct dst_gpio_output outp;
+	struct dst_gpio_read rd;
+	int    psize;
+};
+
+#define DST_IG_ENABLE	0
+#define DST_IG_WRITE	1
+#define DST_IG_READ	2
+#define DST_IG_TS       3
+
+struct bt878 ;
+
+int
+bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
+
+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap);
diff -Nru a/drivers/media/dvb/frontends/dst.c b/drivers/media/dvb/frontends/dst.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/dst.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,1191 @@
+/* 
+    Frontend-driver for TwinHan DST Frontend
+
+    Copyright (C) 2003 Jamie Honan
+
+
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/    
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <asm/div64.h>
+#include <asm/delay.h>
+
+#include "dvb_frontend.h"
+#include "dvb_functions.h"
+#include "dst-bt878.h"
+
+unsigned int dst_debug = 0;
+unsigned int dst_verbose = 0;
+
+MODULE_PARM(dst_verbose, "i");
+MODULE_PARM_DESC(dst_verbose,
+		 "verbose startup messages, default is 1 (yes)");
+MODULE_PARM(dst_debug, "i");
+MODULE_PARM_DESC(dst_debug, "debug messages, default is 0 (no)");
+
+#define DST_MAX_CARDS	6
+unsigned int dst_cur_no = 0;
+
+unsigned int dst_type[DST_MAX_CARDS] = { [0 ... (DST_MAX_CARDS-1)] = (-1U)};
+unsigned int dst_type_flags[DST_MAX_CARDS] = { [0 ... (DST_MAX_CARDS-1)] = (-1U)};
+MODULE_PARM(dst_type, "1-" __stringify(DST_MAX_CARDS) "i");
+MODULE_PARM_DESC(dst_type,
+		"Type of DST card, 0 Satellite, 1 terrestial TV, 2 Cable, default driver determined");
+MODULE_PARM(dst_type_flags, "1-" __stringify(DST_MAX_CARDS) "i");
+MODULE_PARM_DESC(dst_type_flags,
+		"Type flags of DST card, bitfield 1=10 byte tuner, 2=TS is 204, 4=symdiv");
+
+#define dprintk	if (dst_debug) printk
+
+#define DST_TYPE_IS_SAT		0
+#define DST_TYPE_IS_TERR	1
+#define DST_TYPE_IS_CABLE	2
+
+#define DST_TYPE_HAS_NEWTUNE	1
+#define DST_TYPE_HAS_TS204	2
+#define DST_TYPE_HAS_SYMDIV	4
+
+#define HAS_LOCK	1
+#define ATTEMPT_TUNE	2
+#define HAS_POWER	4
+
+struct dst_data {
+	u8	tx_tuna[10];
+	u8	rx_tuna[10];
+	u8	rxbuffer[10];
+	u8	diseq_flags;
+	u8	dst_type;
+	u32	type_flags;
+	u32 frequency;     /* intermediate frequency in kHz for QPSK */
+        fe_spectral_inversion_t inversion;
+        u32   symbol_rate;  /* symbol rate in Symbols per second */
+	fe_code_rate_t  fec;
+	fe_sec_voltage_t voltage;
+	fe_sec_tone_mode_t tone;
+	u32 decode_freq;
+	u8  decode_lock;
+	u16 decode_strength;
+	u16 decode_snr;
+	unsigned long cur_jiff;
+	u8  k22;
+	fe_bandwidth_t bandwidth;
+	struct bt878 *bt;
+	struct dvb_i2c_bus *i2c;
+} ;
+
+static struct dvb_frontend_info dst_info_sat = {
+	.name 			= "DST SAT",
+	.type 			= FE_QPSK,
+	.frequency_min 		= 950000,
+	.frequency_max 		= 2150000,
+	.frequency_stepsize 	= 1000,           /* kHz for QPSK frontends */
+	.frequency_tolerance 	= 29500,
+	.symbol_rate_min	= 1000000,
+	.symbol_rate_max	= 45000000,
+/*     . symbol_rate_tolerance	= 	???,*/
+	.notifier_delay		= 50,                /* 1/20 s */
+	.caps = FE_CAN_FEC_AUTO |
+		FE_CAN_QPSK
+};
+
+static struct dvb_frontend_info dst_info_cable = {
+	.name 			= "DST CABLE",
+	.type 			= FE_QAM,
+        .frequency_stepsize 	= 62500,
+	.frequency_min 		= 51000000,
+	.frequency_max 		= 858000000,
+	.symbol_rate_min	= 1000000,
+	.symbol_rate_max	= 45000000,
+/*     . symbol_rate_tolerance	= 	???,*/
+	.notifier_delay		= 50,                /* 1/20 s */
+	.caps = FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_AUTO
+};
+
+static struct dvb_frontend_info dst_info_tv = {
+	.name 			= "DST TERR",
+	.type 			= FE_OFDM,
+	.frequency_min 		= 137000000,
+	.frequency_max 		= 858000000,
+	.frequency_stepsize 	= 166667,
+	.caps = FE_CAN_FEC_AUTO |
+	    FE_CAN_QAM_AUTO |
+	    FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
+};
+
+static void dst_packsize(struct dst_data *dst, int psize)
+{
+	union dst_gpio_packet bits;
+
+	bits.psize = psize;
+	bt878_device_control(dst->bt, DST_IG_TS, &bits);
+}
+
+static int dst_gpio_outb(struct dst_data *dst, u32 mask, u32 enbb, u32 outhigh)
+{
+	union dst_gpio_packet enb;
+	union dst_gpio_packet bits;
+	int err;
+
+	enb.enb.mask = mask;
+	enb.enb.enable = enbb;
+        if ((err = bt878_device_control(dst->bt, DST_IG_ENABLE, &enb)) < 0) {
+		dprintk ("%s: dst_gpio_enb error (err == %i, mask == 0x%02x, enb == 0x%02x)\n", __FUNCTION__, err, mask, enbb);
+		return -EREMOTEIO;
+	}
+
+	/* because complete disabling means no output, no need to do
+	 * output packet */
+	if (enbb == 0)
+		return 0;
+
+	bits.outp.mask = enbb;
+	bits.outp.highvals = outhigh;
+
+        if ((err = bt878_device_control(dst->bt, DST_IG_WRITE, &bits)) < 0) {
+		dprintk ("%s: dst_gpio_outb error (err == %i, enbb == 0x%02x, outhigh == 0x%02x)\n", __FUNCTION__, err, enbb, outhigh);
+		return -EREMOTEIO;
+	}
+        return 0;
+}
+
+static int dst_gpio_inb(struct dst_data *dst, u8 *result)
+{
+	union dst_gpio_packet rd_packet;
+	int err;
+
+	*result = 0;
+
+        if ((err = bt878_device_control(dst->bt, DST_IG_READ, &rd_packet)) < 0) {
+		dprintk ("%s: dst_gpio_inb error (err == %i)\n", __FUNCTION__, err);
+		return -EREMOTEIO;
+	}
+	*result = (u8)rd_packet.rd.value;
+        return 0;
+}
+
+#define DST_I2C_ENABLE	1
+#define DST_8820  	2
+
+static int
+dst_reset8820(struct dst_data *dst)
+{
+int retval;
+	/* pull 8820 gpio pin low, wait, high, wait, then low */
+	// dprintk ("%s: reset 8820\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
+	if (retval < 0)
+		return retval;
+	dvb_delay(10);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, DST_8820);
+	if (retval < 0)
+		return retval;
+	/* wait for more feedback on what works here *
+	dvb_delay(10);
+	retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
+	if (retval < 0)
+		return retval;
+	*/
+	return 0;
+}
+
+static int
+dst_i2c_enable(struct dst_data *dst)
+{
+int retval;
+	/* pull I2C enable gpio pin low, wait */
+	// dprintk ("%s: i2c enable\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, ~0, DST_I2C_ENABLE, 0);
+	if (retval < 0)
+		return retval;
+	// dprintk ("%s: i2c enable delay\n", __FUNCTION__);
+	dvb_delay(33);
+	return 0;
+}
+
+static int
+dst_i2c_disable(struct dst_data *dst)
+{
+int retval;
+	/* release I2C enable gpio pin, wait */
+	// dprintk ("%s: i2c disable\n", __FUNCTION__);
+	retval = dst_gpio_outb(dst, ~0, 0, 0);
+	if (retval < 0)
+		return retval;
+	// dprintk ("%s: i2c disable delay\n", __FUNCTION__);
+	dvb_delay(33);
+	return 0;
+}
+
+static int
+dst_wait_dst_ready(struct dst_data *dst)
+{
+u8 reply;
+int retval;
+int i;
+	for (i = 0; i < 200; i++) {
+		retval = dst_gpio_inb(dst, &reply);
+		if (retval < 0)
+			return retval;
+		if ((reply & DST_I2C_ENABLE) == 0) {
+			dprintk ("%s: dst wait ready after %d\n", __FUNCTION__, i);
+			return 1;
+		}
+		dvb_delay(5);
+	}
+	dprintk ("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
+	return 0;
+}
+
+#define DST_I2C_ADDR 0x55
+
+static int write_dst (struct dst_data *dst, u8 *data, u8 len)
+{
+	struct i2c_msg msg = {
+		.addr = DST_I2C_ADDR, .flags = 0, .buf = data, .len = len };
+	int err;
+	int cnt;
+
+	if (dst_debug && dst_verbose) {
+		u8 i;
+		dprintk("%s writing",__FUNCTION__);
+		for (i = 0 ; i < len ; i++) {
+			dprintk(" 0x%02x", data[i]);
+		}
+		dprintk("\n");
+	}
+	dvb_delay(30);
+	for (cnt = 0; cnt < 4; cnt++) {
+		if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
+			dprintk ("%s: write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
+			dst_i2c_disable(dst);
+			dvb_delay(500);
+			dst_i2c_enable(dst);
+			dvb_delay(500);
+			continue;
+		} else
+			break;
+	}
+	if (cnt >= 4)
+		return -EREMOTEIO;
+        return 0;
+}
+
+static int read_dst (struct dst_data *dst, u8 *ret, u8 len)
+{
+	struct i2c_msg msg = 
+		{ .addr = DST_I2C_ADDR, .flags = I2C_M_RD, .buf = ret, .len = len };
+	int err;
+	int cnt;
+
+	for (cnt = 0; cnt < 4; cnt++) {
+		if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
+			dprintk ("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
+			dst_i2c_disable(dst);
+			dst_i2c_enable(dst);
+			continue;
+		} else
+			break;
+	}
+	if (cnt >= 4)
+		return -EREMOTEIO;
+	dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
+	if (dst_debug && dst_verbose) {
+		for (err = 1; err < len; err++)
+			dprintk(" 0x%x", ret[err]);
+		if (err > 1)
+			dprintk("\n");
+	}
+	return 0;
+}
+
+static int dst_set_freq(struct dst_data *dst, u32 freq)
+{
+	u8 *val;
+
+	dst->frequency = freq;
+
+	// dprintk("%s: set frequency %u\n", __FUNCTION__, freq);
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		freq = freq / 1000;
+		if (freq < 950 || freq > 2150)
+			return -EINVAL;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 8) & 0x7f;
+		val[3] = (u8)freq;
+		val[4] = 1;
+		val[8] &= ~4;
+		if (freq < 1531)
+			val[8] |= 4;
+	} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+		freq = freq / 1000;
+		if (freq < 137000 || freq > 858000)
+			return -EINVAL;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 16) & 0xff;
+		val[3] = (freq >> 8) & 0xff;
+		val[4] = (u8)freq;
+		val[5] = 0;
+		switch (dst->bandwidth) {
+		case BANDWIDTH_6_MHZ:
+			val[6] = 6;
+			break;
+
+		case BANDWIDTH_7_MHZ:
+		case BANDWIDTH_AUTO:
+			val[6] = 7;
+			break;
+
+		case BANDWIDTH_8_MHZ:
+			val[6] = 8;
+			break;
+		}
+
+		val[7] = 0;
+		val[8] = 0;
+	} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+		/* guess till will get one */
+		freq = freq / 1000;
+		val = &dst->tx_tuna[0];
+		val[2] = (freq >> 16) & 0xff;
+		val[3] = (freq >> 8) & 0xff;
+		val[4] = (u8)freq;
+	} else
+		return -EINVAL;
+	return 0;
+}
+
+static int dst_set_bandwidth(struct dst_data *dst, fe_bandwidth_t bandwidth)
+{
+	u8 *val;
+
+	dst->bandwidth = bandwidth;
+
+	if (dst->dst_type != DST_TYPE_IS_TERR)
+		return 0;
+
+	val = &dst->tx_tuna[0];
+        switch (bandwidth) {
+	case BANDWIDTH_6_MHZ:
+		val[6] = 6;
+		break;
+
+	case BANDWIDTH_7_MHZ:
+		val[6] = 7;
+		break;
+
+	case BANDWIDTH_8_MHZ:
+		val[6] = 8;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int dst_set_inversion (struct dst_data *dst, fe_spectral_inversion_t inversion)
+{
+	u8 *val;
+
+	dst->inversion = inversion;
+
+	val = &dst->tx_tuna[0];
+
+	val[8] &= ~0x80;
+
+	switch (inversion) {
+	case INVERSION_OFF:
+		break;
+	case INVERSION_ON:
+		val[8] |= 0x80;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+
+static int dst_set_fec (struct dst_data *dst, fe_code_rate_t fec)
+{
+	dst->fec = fec;
+	return 0;
+}
+
+static fe_code_rate_t dst_get_fec (struct dst_data *dst)
+{
+	return dst->fec;
+}
+
+static int dst_set_symbolrate (struct dst_data *dst, u32 srate)
+{
+	u8 *val;
+	u32 symcalc;
+	u64 sval;
+
+	dst->symbol_rate = srate;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR) {
+		return 0;
+	}
+
+	// dprintk("%s: set srate %u\n", __FUNCTION__, srate);
+	srate /= 1000;
+	val = &dst->tx_tuna[0];
+
+	if (dst->type_flags & DST_TYPE_HAS_SYMDIV) {
+		sval = srate;
+		sval <<= 20;
+		do_div(sval, 88000);
+	        symcalc = (u32)sval;
+		// dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
+		val[5] = (u8)(symcalc >> 12);
+		val[6] = (u8)(symcalc >> 4);
+		val[7] = (u8)(symcalc << 4);
+	} else {
+		val[5] = (u8)(srate >> 16) & 0x7f;
+		val[6] = (u8)(srate >> 8);
+		val[7] = (u8)srate;
+	}
+	val[8] &= ~0x20;
+	if (srate > 8000)
+		val[8] |= 0x20;
+	return 0;
+}
+
+
+static u8 dst_check_sum(u8 *buf, u32 len)
+{
+	u32 i;
+	u8  val = 0;
+	if (!len)
+		return 0;
+	for (i = 0; i < len; i++) {
+		val += buf[i];
+	}
+	return ((~val) + 1);
+}
+
+typedef struct dst_types {
+	char	*mstr;
+	int	offs;
+	u8	dst_type;
+	u32	type_flags;
+} DST_TYPES;
+
+struct dst_types dst_tlist[] = {
+	{ "DST-020", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV },
+	{ "DST-030", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
+	{ "DST-03T", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV|DST_TYPE_HAS_TS204},
+	{ "DST-MOT", 0,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_SYMDIV },
+	{ "DST-CI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
+	{ "DSTMCI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_NEWTUNE },
+	{ "DSTFCI",  1,  DST_TYPE_IS_SAT,    DST_TYPE_HAS_NEWTUNE },
+	{ "DCTNEW",  1,  DST_TYPE_IS_CABLE,  DST_TYPE_HAS_NEWTUNE },
+	{ "DCT_CI",  1,  DST_TYPE_IS_CABLE,  DST_TYPE_HAS_NEWTUNE|DST_TYPE_HAS_TS204 },
+	{ "DTTDIG" , 1,  DST_TYPE_IS_TERR,   0} };
+/* DCTNEW and DCT-CI are guesses */
+
+static void dst_type_flags_print(u32 type_flags)
+{
+	printk("DST type flags :");
+	if (type_flags & DST_TYPE_HAS_NEWTUNE)
+		printk(" 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);
+	if (type_flags & DST_TYPE_HAS_TS204)
+		printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
+	if (type_flags & DST_TYPE_HAS_SYMDIV)
+		printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
+	printk("\n");
+}
+
+static int dst_type_print(u8 type)
+{
+	char *otype;
+	switch (type) {
+		case DST_TYPE_IS_SAT:
+			otype = "satellite";
+			break;
+		case DST_TYPE_IS_TERR:
+			otype = "terrestial TV";
+			break;
+		case DST_TYPE_IS_CABLE:
+			otype = "terrestial TV";
+			break;
+		default:
+			printk("%s: invalid dst type %d\n",
+				__FUNCTION__, type);
+			return -EINVAL;
+	}
+	printk("DST type : %s\n", otype);
+	return 0;
+}
+
+static int dst_check_ci (struct dst_data *dst)
+{
+	u8 txbuf[8];
+	u8 rxbuf[8];
+	int retval;
+	int i;
+	struct dst_types *dsp;
+	u8 use_dst_type;
+	u32 use_type_flags;
+
+	memset(txbuf, 0, sizeof(txbuf));
+	txbuf[1] = 6;
+	txbuf[7] = dst_check_sum (txbuf, 7);
+ 
+	dst_i2c_enable(dst);
+	dst_reset8820(dst);
+	retval = write_dst (dst, txbuf, 8);
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful, maybe no card?\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(3);
+	retval = read_dst (dst, rxbuf, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful, maybe no card?\n", __FUNCTION__);
+		return retval;
+	}
+	if (rxbuf[0] != 0xff) {
+		dprintk("%s: write reply not 0xff, not ci (%02x)\n", __FUNCTION__, rxbuf[0]);
+		return retval;
+	}
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	// dst_i2c_enable(i2c); Dimitri
+	retval = read_dst (dst, rxbuf, 8);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (rxbuf[7] != dst_check_sum (rxbuf, 7)) {
+		dprintk("%s: checksum failure\n", __FUNCTION__);
+		return retval;
+	}
+	rxbuf[7] = '\0';
+	for (i = 0, dsp = &dst_tlist[0]; i < sizeof(dst_tlist) / sizeof(dst_tlist[0]); i++, dsp++) {
+		if (!strncmp(&rxbuf[dsp->offs],
+				dsp->mstr,
+				strlen(dsp->mstr))) {
+			use_type_flags = dsp->type_flags;
+			use_dst_type = dsp->dst_type;
+			printk("%s: recognize %s\n", __FUNCTION__, dsp->mstr);
+			break;
+		}
+	}
+	if (i >= sizeof(dst_tlist) / sizeof(dst_tlist[0])) {
+		printk("%s: unable to recognize %s or %s\n", __FUNCTION__, &rxbuf[0], &rxbuf[1]);
+		printk("%s please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
+		use_dst_type = DST_TYPE_IS_SAT;
+		use_type_flags = DST_TYPE_HAS_SYMDIV;
+	}
+	switch (dst_type[dst_cur_no]) {
+		case (-1U):
+			/* not used */
+			break;
+		case DST_TYPE_IS_SAT:
+		case DST_TYPE_IS_TERR:
+		case DST_TYPE_IS_CABLE:
+			use_dst_type = (u8)(dst_type[dst_cur_no]);
+			break;
+		default:
+			printk("%s: invalid user override dst type %d, not used\n",
+				__FUNCTION__, dst_type[dst_cur_no]);
+			break;
+	}
+	dst_type_print(use_dst_type);
+	if (dst_type_flags[dst_cur_no] != (-1U)) {
+		printk("%s: user override dst type flags 0x%x\n",
+				__FUNCTION__, dst_type_flags[dst_cur_no]);
+		use_type_flags = dst_type_flags[dst_cur_no];
+	}
+	dst->type_flags = use_type_flags;
+	dst->dst_type= use_dst_type;
+	dst_type_flags_print(dst->type_flags);
+
+	if (dst->type_flags & DST_TYPE_HAS_TS204) {
+		dst_packsize(dst, 204);
+	}
+	return 0;
+}
+
+static int dst_command (struct dst_data *dst, u8 *data, u8 len)
+{
+	int retval;
+	u8 reply;
+
+	dst_i2c_enable(dst);
+	dst_reset8820(dst);
+	retval = write_dst (dst, data, len);
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(33);
+	retval = read_dst (dst, &reply, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read verify  not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (reply != 0xff) {
+		dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
+		return 0;
+	}
+	if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
+		return 0;
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	// dst_i2c_enable(i2c); Per dimitri
+	retval = read_dst (dst, dst->rxbuffer, 8);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return 0;
+	}
+	if (dst->rxbuffer[7] != dst_check_sum (dst->rxbuffer, 7)) {
+		dprintk("%s: checksum failure\n", __FUNCTION__);
+		return 0;
+	}
+	return 0;
+}
+
+static int dst_get_signal(struct dst_data *dst)
+{
+	int retval;
+	u8 get_signal[] = {0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb};
+
+	if ((dst->diseq_flags & ATTEMPT_TUNE) == 0) {
+		dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+		return 0;
+	}
+	if (0 == (dst->diseq_flags & HAS_LOCK)) {
+		dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+		return 0;
+	}
+	if (time_after_eq(jiffies, dst->cur_jiff + (HZ/5))) {
+		retval =  dst_command(dst, get_signal, 8);
+		if (retval < 0)
+			return retval;
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			dst->decode_lock = ((dst->rxbuffer[6] & 0x10) == 0) ?
+					1 : 0;
+			dst->decode_strength = dst->rxbuffer[5] << 8;
+			dst->decode_snr = dst->rxbuffer[2] << 8 |
+				dst->rxbuffer[3];
+		} else if ((dst->dst_type == DST_TYPE_IS_TERR) ||
+				(dst->dst_type == DST_TYPE_IS_CABLE)) {
+			dst->decode_lock = (dst->rxbuffer[1]) ?
+					1 : 0;
+			dst->decode_strength = dst->rxbuffer[4] << 8;
+			dst->decode_snr = dst->rxbuffer[3] << 8;
+		}
+		dst->cur_jiff = jiffies;
+	}
+	return 0;
+}
+
+/*
+ * line22k0    0x00, 0x09, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00
+ * line22k1    0x00, 0x09, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00
+ * line22k2    0x00, 0x09, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00
+ * tone        0x00, 0x09, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00
+ * data        0x00, 0x09, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00
+ * power_off   0x00, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
+ * power_on    0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00
+ * Diseqc 1    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec
+ * Diseqc 2    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf4, 0xe8 
+ * Diseqc 3    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf8, 0xe4 
+ * Diseqc 4    0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xfc, 0xe0 
+ */
+
+static int dst_set_diseqc (struct dst_data *dst, u8 *cmd, u8 len)
+{
+	u8 paket[8] =  {0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	if (len == 0 || len > 4)
+		return -EINVAL;
+	memcpy(&paket[3], cmd, len);
+	paket[7] = dst_check_sum (&paket[0], 7);
+	dst_command(dst, paket, 8);
+	return 0;
+}
+
+static int dst_tone_power_cmd (struct dst_data *dst)
+{
+	u8 paket[8] =  {0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00};
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	if (dst->voltage == SEC_VOLTAGE_OFF) 
+		paket[4] = 0;
+	else
+		paket[4] = 1;
+	if (dst->tone == SEC_TONE_ON)
+		paket[2] = dst->k22;
+	else
+		paket[2] = 0;
+	paket[7] = dst_check_sum (&paket[0], 7);
+	dst_command(dst, paket, 8);
+	return 0;
+}
+
+static int dst_set_voltage (struct dst_data *dst, fe_sec_voltage_t voltage)
+{
+	u8 *val;
+	int need_cmd;
+
+	dst->voltage = voltage;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	need_cmd = 0;
+	val = &dst->tx_tuna[0];
+	val[8] &= ~0x40;
+	switch (voltage) {
+	case SEC_VOLTAGE_13:
+		if ((dst->diseq_flags & HAS_POWER) == 0)
+			need_cmd = 1;
+		dst->diseq_flags |= HAS_POWER;
+		break;
+	case SEC_VOLTAGE_18:
+		if ((dst->diseq_flags & HAS_POWER) == 0)
+			need_cmd = 1;
+		dst->diseq_flags |= HAS_POWER;
+		val[8] |= 0x40;
+		break;
+	case SEC_VOLTAGE_OFF:
+		need_cmd = 1;
+		dst->diseq_flags &= ~(HAS_POWER|HAS_LOCK|ATTEMPT_TUNE);
+		break;
+	default:
+		return -EINVAL;
+	}
+	if (need_cmd) {
+		dst_tone_power_cmd(dst);
+	}
+	return 0;
+}
+
+
+static int dst_set_tone (struct dst_data *dst, fe_sec_tone_mode_t tone)
+{
+	u8 *val;
+
+	dst->tone = tone;
+
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		return 0;
+
+	val = &dst->tx_tuna[0];
+
+	val[8] &= ~0x1;
+
+	switch (tone) {
+	case SEC_TONE_OFF:
+		break;
+	case SEC_TONE_ON:
+		val[8] |= 1;
+		break;
+	default:
+		return -EINVAL;
+	}
+	dst_tone_power_cmd(dst);
+	return 0;
+}
+
+static int dst_get_tuna (struct dst_data *dst)
+{
+int retval;
+	if ((dst->diseq_flags & ATTEMPT_TUNE) == 0)
+		return 0;
+	dst->diseq_flags &= ~(HAS_LOCK);
+	if (!dst_wait_dst_ready(dst))
+		return 0;
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		/* how to get variable length reply ???? */
+		retval = read_dst (dst, dst->rx_tuna, 10);
+	} else {
+		retval = read_dst (dst, &dst->rx_tuna[2], 8);
+	}
+	if (retval < 0) {
+		dprintk("%s: read not successful\n", __FUNCTION__);
+		return 0;
+	}
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[0], 9)) {
+			dprintk("%s: checksum failure?\n", __FUNCTION__);
+			return 0;
+		}
+	} else {
+		if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[2], 7)) {
+			dprintk("%s: checksum failure?\n", __FUNCTION__);
+			return 0;
+		}
+	}
+	if (dst->rx_tuna[2] == 0 && dst->rx_tuna[3] == 0)
+		return 0;
+	dst->decode_freq = ((dst->rx_tuna[2] & 0x7f) << 8) +  dst->rx_tuna[3];
+
+	dst->decode_lock = 1;
+	/*
+	dst->decode_n1 = (dst->rx_tuna[4] << 8) +  
+			(dst->rx_tuna[5]);
+
+	dst->decode_n2 = (dst->rx_tuna[8] << 8) +  
+			(dst->rx_tuna[7]);
+	*/
+	dst->diseq_flags |= HAS_LOCK;
+	/* dst->cur_jiff = jiffies; */
+	return 1;
+}
+
+static int dst_write_tuna (struct dst_data *dst)
+{
+	int retval;
+	u8 reply;
+
+	dprintk("%s: type_flags 0x%x \n", __FUNCTION__, dst->type_flags);
+	dst->decode_freq = 0;
+	dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		if (!(dst->diseq_flags & HAS_POWER))
+			dst_set_voltage (dst, SEC_VOLTAGE_13);
+	}
+	dst->diseq_flags &= ~(HAS_LOCK|ATTEMPT_TUNE);
+	dst_i2c_enable(dst);
+	if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
+		dst_reset8820(dst);
+		dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[0], 9);
+		retval = write_dst (dst, &dst->tx_tuna[0], 10);
+	} else {
+		dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[2], 7);
+		retval = write_dst (dst, &dst->tx_tuna[2], 8);
+	}
+	if (retval < 0) {
+		dst_i2c_disable(dst);
+		dprintk("%s: write not successful\n", __FUNCTION__);
+		return retval;
+	}
+	dvb_delay(3);
+	retval = read_dst (dst, &reply, 1);
+	dst_i2c_disable(dst);
+	if (retval < 0) {
+		dprintk("%s: read verify  not successful\n", __FUNCTION__);
+		return retval;
+	}
+	if (reply != 0xff) {
+		dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
+		return 0;
+	}
+	dst->diseq_flags |= ATTEMPT_TUNE;
+	return dst_get_tuna(dst);
+}
+
+static void dst_init (struct dst_data *dst)
+{
+static u8 ini_satci_tuna[] = {  9, 0, 3, 0xb6, 1, 0,    0x73, 0x21, 0, 0 };
+static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
+static u8 ini_tvfta_tuna[] = { 0, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_tvci_tuna[] = { 9, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_cabfta_tuna[] = { 0, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+static u8 ini_cabci_tuna[] = { 9, 0,  3, 0xb6, 1, 7,    0x0,   0x0, 0, 0 };
+	dst->inversion = INVERSION_ON;
+	dst->voltage = SEC_VOLTAGE_13;
+	dst->tone = SEC_TONE_OFF;
+	dst->symbol_rate = 29473000;
+	dst->fec = FEC_AUTO;
+	dst->diseq_flags = 0;
+	dst->k22 = 0x02;
+	dst->bandwidth = BANDWIDTH_7_MHZ;
+	dst->cur_jiff = jiffies;
+	if (dst->dst_type == DST_TYPE_IS_SAT) {
+		dst->frequency = 950000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_satci_tuna : ini_satfta_tuna),
+				sizeof(ini_satfta_tuna));
+	} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+		dst->frequency = 137000000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_tvci_tuna : ini_tvfta_tuna),
+				sizeof(ini_tvfta_tuna));
+	} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+		dst->frequency = 51000000;
+		memcpy(dst->tx_tuna, ((dst->type_flags &  DST_TYPE_HAS_NEWTUNE )? 
+					ini_cabci_tuna : ini_cabfta_tuna),
+				sizeof(ini_cabfta_tuna));
+	}
+}
+
+struct lkup {
+	unsigned int cmd;
+	char *desc;
+} looker[] = {
+	{FE_GET_INFO,                "FE_GET_INFO:"},
+	{FE_READ_STATUS,             "FE_READ_STATUS:" },
+	{FE_READ_BER,                "FE_READ_BER:" },
+	{FE_READ_SIGNAL_STRENGTH,    "FE_READ_SIGNAL_STRENGTH:" },
+	{FE_READ_SNR,                "FE_READ_SNR:" },
+	{FE_READ_UNCORRECTED_BLOCKS, "FE_READ_UNCORRECTED_BLOCKS:" },
+	{FE_SET_FRONTEND,            "FE_SET_FRONTEND:" },
+	{FE_GET_FRONTEND,            "FE_GET_FRONTEND:" },
+	{FE_SLEEP,                   "FE_SLEEP:" },
+	{FE_INIT,                    "FE_INIT:" },
+	{FE_RESET,                   "FE_RESET:" },
+	{FE_SET_TONE,                "FE_SET_TONE:" },
+	{FE_SET_VOLTAGE,             "FE_SET_VOLTAGE:" },
+	};
+
+static int dst_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+	struct dst_data *dst = fe->data;
+	int retval;
+	/*
+	char  *cc;
+                
+	cc = "FE_UNSUPP:";
+	for(retval = 0; retval < sizeof(looker) / sizeof(looker[0]); retval++) {
+		if (looker[retval].cmd == cmd) {
+			cc = looker[retval].desc;
+			break;
+		}
+	}
+	dprintk("%s cmd %s (0x%x)\n",__FUNCTION__, cc, cmd);
+	*/
+	// printk("%s: dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__, dst, dst->bt, dst->i2c);
+	/* should be set by attach, but just in case */
+	dst->i2c = fe->i2c;
+        switch (cmd) {
+        case FE_GET_INFO: 
+	{
+	     struct dvb_frontend_info *info;
+		info = &dst_info_sat;
+		if (dst->dst_type == DST_TYPE_IS_TERR)
+			info = &dst_info_tv;
+		else if (dst->dst_type == DST_TYPE_IS_CABLE)
+			info = &dst_info_cable;
+		memcpy (arg, info, sizeof(struct dvb_frontend_info));
+		break;
+	}
+        case FE_READ_STATUS:
+	{
+		fe_status_t *status = arg;
+
+		*status = 0;
+		if (dst->diseq_flags & HAS_LOCK) {
+			dst_get_signal(dst);
+			if (dst->decode_lock)
+				*status |= FE_HAS_LOCK 
+					| FE_HAS_SIGNAL 
+					| FE_HAS_CARRIER
+					| FE_HAS_SYNC
+					| FE_HAS_VITERBI;
+		}
+		break;
+	}
+
+        case FE_READ_BER:
+	{
+		/* guess */
+		// *(u32*) arg = dst->decode_n1;
+		*(u32*) arg = 0;
+		return -EOPNOTSUPP; 
+	}
+
+        case FE_READ_SIGNAL_STRENGTH:
+	{
+		dst_get_signal(dst);
+		*((u16*) arg) = dst->decode_strength;
+		break;
+	}
+
+        case FE_READ_SNR:
+	{
+		dst_get_signal(dst);
+		*((u16*) arg) = dst->decode_snr;
+		break;
+	}
+
+	case FE_READ_UNCORRECTED_BLOCKS: 
+	{
+		*((u32*) arg) = 0;    /* the stv0299 can't measure BER and */
+		return -EOPNOTSUPP;   /* errors at the same time.... */
+	}
+
+        case FE_SET_FRONTEND:
+        {
+		struct dvb_frontend_parameters *p = arg;
+
+		dst_set_freq (dst, p->frequency);
+		dst_set_inversion (dst, p->inversion);
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			dst_set_fec (dst, p->u.qpsk.fec_inner);
+			dst_set_symbolrate (dst, p->u.qpsk.symbol_rate);
+		} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+			dst_set_bandwidth(dst, p->u.ofdm.bandwidth);
+		} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+			dst_set_fec (dst, p->u.qam.fec_inner);
+			dst_set_symbolrate (dst, p->u.qam.symbol_rate);
+		}
+		dst_write_tuna (dst);
+
+                break;
+        }
+
+	case FE_GET_FRONTEND:
+	{
+		struct dvb_frontend_parameters *p = arg;
+
+
+		p->frequency = dst->decode_freq;
+		p->inversion = dst->inversion;
+		if (dst->dst_type == DST_TYPE_IS_SAT) {
+			p->u.qpsk.symbol_rate = dst->symbol_rate;
+			p->u.qpsk.fec_inner = dst_get_fec (dst);
+		} else if (dst->dst_type == DST_TYPE_IS_TERR) {
+			p->u.ofdm.bandwidth = dst->bandwidth;
+		} else if (dst->dst_type == DST_TYPE_IS_CABLE) {
+			p->u.qam.symbol_rate = dst->symbol_rate;
+			p->u.qam.fec_inner = dst_get_fec (dst);
+			p->u.qam.modulation = QAM_AUTO;
+		}
+		break;
+	}
+
+        case FE_SLEEP:
+		return 0;
+
+        case FE_INIT:
+		dst_init(dst);
+		break;
+
+	case FE_RESET:
+		break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+	{
+		struct dvb_diseqc_master_cmd *cmd = (struct dvb_diseqc_master_cmd *)arg;
+		retval = dst_set_diseqc (dst, cmd->msg, cmd->msg_len);
+		if (retval < 0)
+			return retval;
+		break;
+	}
+	case FE_SET_TONE:
+		retval = dst_set_tone (dst, (fe_sec_tone_mode_t) arg);
+		if (retval < 0)
+			return retval;
+		break;
+	case FE_SET_VOLTAGE:
+		retval = dst_set_voltage (dst, (fe_sec_voltage_t) arg);
+		if (retval < 0)
+			return retval;
+		break;
+	default:
+		return -EOPNOTSUPP;
+        };
+        
+        return 0;
+} 
+
+
+static int dst_attach (struct dvb_i2c_bus *i2c, void **data)
+{
+	struct dst_data *dst;
+	struct bt878 *bt;
+	struct dvb_frontend_info *info;
+
+	dprintk("%s: check ci\n", __FUNCTION__);
+	if (dst_cur_no >= DST_MAX_CARDS) {
+		dprintk("%s: can't have more than %d cards\n", __FUNCTION__, DST_MAX_CARDS);
+		return -ENODEV;
+	}
+	bt = bt878_find_by_dvb_adap(i2c->adapter);
+	if (!bt)
+		return -ENODEV;
+	dst = kmalloc(sizeof(struct dst_data), GFP_KERNEL);
+	if (dst == NULL) {
+		printk(KERN_INFO "%s: Out of memory.\n", __FUNCTION__);
+		return -ENOMEM;
+	}
+	memset(dst, 0, sizeof(*dst));
+	*data = dst;
+	dst->bt = bt;
+	dst->i2c = i2c;
+	if (dst_check_ci(dst) < 0) {
+		kfree(dst);
+		return -ENODEV;
+	}
+
+	dst_init (dst);
+	dprintk("%s: register dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__, 
+			(u32)dst, (u32)(dst->bt), (u32)(dst->i2c));
+
+	info = &dst_info_sat;
+	if (dst->dst_type == DST_TYPE_IS_TERR)
+		info = &dst_info_tv;
+	else if (dst->dst_type == DST_TYPE_IS_CABLE)
+		info = &dst_info_cable;
+
+	dvb_register_frontend (dst_ioctl, i2c, dst, info);
+	dst_cur_no++;
+	return 0;
+}
+
+static void dst_detach (struct dvb_i2c_bus *i2c, void *data)
+{
+	dvb_unregister_frontend (dst_ioctl, i2c);
+	dprintk("%s: unregister dst %8.8x\n", __FUNCTION__, (u32)(data));
+	if (data)
+		kfree(data);
+}
+
+static int __init init_dst (void)
+{
+	return dvb_register_i2c_device (THIS_MODULE, dst_attach, dst_detach);
+}
+
+static void __exit exit_dst (void)
+{
+	dvb_unregister_i2c_device (dst_attach);
+}
+
+
+module_init(init_dst);
+module_exit(exit_dst);
+
+MODULE_DESCRIPTION("DST DVB-S Frontend");
+MODULE_AUTHOR("Jamie Honan");
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c
--- a/drivers/media/dvb/frontends/mt312.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/mt312.c	Thu Jan  8 23:00:23 2004
@@ -1,7 +1,7 @@
 /* 
     Driver for Zarlink MT312 Satellite Channel Decoder
 
-    Copyright (C) 2003 Andreas Oberritter <obi@saftware.de>
+    Copyright (C) 2003 Andreas Oberritter <obi@linuxtv.org>
 
     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
@@ -39,11 +39,19 @@
 #define MT312_DEBUG		0
 
 #define MT312_SYS_CLK		90000000UL	/* 90 MHz */
+#define MT312_LPOWER_SYS_CLK	60000000UL	/* 60 MHz */
 #define MT312_PLL_CLK		10000000UL	/* 10 MHz */
 
 /* number of active frontends */
 static int mt312_count = 0;
 
+#if MT312_DEBUG == 0
+#define dprintk(x...)
+#else
+static int debug = 0;
+#define dprintk if(debug == 1) printk
+#endif
+
 static struct dvb_frontend_info mt312_info = {
 	.name = "Zarlink MT312",
 	.type = FE_QPSK,
@@ -86,7 +94,7 @@
 		return -EREMOTEIO;
 	}
 #if MT312_DEBUG
-	{
+	if(debug) {
 		int i;
 		printk(KERN_INFO "R(%d):", reg & 0x7f);
 		for (i = 0; i < count; i++)
@@ -107,7 +115,7 @@
 	struct i2c_msg msg;
 
 #if MT312_DEBUG
-	{
+	if(debug) {
 		int i;
 		printk(KERN_INFO "W(%d):", reg & 0x7f);
 		for (i = 0; i < count; i++)
@@ -205,7 +213,7 @@
 	if (freq < 1550000)
 		buf[3] |= 0x10;
 
-	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
+	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
 	       buf[1], buf[2], buf[3]);
 
 	return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));
@@ -225,7 +233,7 @@
 	if (freq < 1550000)
 		buf[3] |= 0x02;
 
-	printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
+	dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
 	       buf[1], buf[2], buf[3]);
 
 	return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));
@@ -236,13 +244,13 @@
 	return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);
 }
 
-static int mt312_init(struct dvb_i2c_bus *i2c, const long id)
+static int mt312_init(struct dvb_i2c_bus *i2c, const long id, u8 pll)
 {
 	int ret;
 	u8 buf[2];
 
 	/* wake up */
-	if ((ret = mt312_writereg(i2c, CONFIG, 0x8c)) < 0)
+	if ((ret = mt312_writereg(i2c, CONFIG, (pll == 60 ? 0x88 : 0x8c))) < 0)
 		return ret;
 
 	/* wait at least 150 usec */
@@ -252,8 +260,17 @@
 	if ((ret = mt312_reset(i2c, 1)) < 0)
 		return ret;
 
+// Per datasheet, write correct values. 09/28/03 ACCJr.
+// If we don't do this, we won't get FE_HAS_VITERBI in the VP310.
+	{
+		u8 buf_def[8]={0x14, 0x12, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00};
+
+		if ((ret = mt312_write(i2c, VIT_SETUP, buf_def, sizeof(buf_def))) < 0)
+			return ret;
+	}
+
 	/* SYS_CLK */
-	buf[0] = mt312_div(MT312_SYS_CLK * 2, 1000000);
+	buf[0] = mt312_div((pll == 60 ? MT312_LPOWER_SYS_CLK : MT312_SYS_CLK) * 2, 1000000);
 
 	/* DISEQC_RATIO */
 	buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);
@@ -370,16 +387,18 @@
 	return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);
 }
 
-static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t * s)
+static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t *s, const long id)
 {
 	int ret;
-	u8 status[3];
+	u8 status[3], vit_mode;
 
 	*s = 0;
 
 	if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)
 		return ret;
 
+	dprintk(KERN_DEBUG "QPSK_STAT_H: 0x%02x, QPSK_STAT_L: 0x%02x, FEC_STATUS: 0x%02x\n", status[0], status[1], status[2]);
+
 	if (status[0] & 0xc0)
 		*s |= FE_HAS_SIGNAL;	/* signal noise ratio */
 	if (status[0] & 0x04)
@@ -390,6 +409,16 @@
 		*s |= FE_HAS_SYNC;	/* byte align lock */
 	if (status[0] & 0x01)
 		*s |= FE_HAS_LOCK;	/* qpsk lock */
+	// VP310 doesn't have AUTO, so we "implement it here" ACCJr
+	if ((id == ID_VP310) && !(status[0] & 0x01)) {
+		if ((ret = mt312_readreg(i2c, VIT_MODE, &vit_mode)) < 0)
+			return ret;
+		vit_mode ^= 0x40;
+		if ((ret = mt312_writereg(i2c, VIT_MODE, vit_mode)) < 0)
+                	return ret;
+		if ((ret = mt312_writereg(i2c, GO, 0x01)) < 0)
+                	return ret;
+	}
 
 	return 0;
 }
@@ -422,7 +451,7 @@
 
 	*signal_strength = agc;
 
-	printk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
+	dprintk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
 
 	return 0;
 }
@@ -458,7 +487,7 @@
 			      const long id)
 {
 	int ret;
-	u8 buf[5];
+	u8 buf[5], config_val;
 	u16 sr;
 
 	const u8 fec_tab[10] =
@@ -467,6 +496,8 @@
 
 	int (*set_tv_freq)(struct dvb_i2c_bus *i2c, u32 freq, u32 sr);
 
+	dprintk("%s: Freq %d\n", __FUNCTION__, p->frequency);
+
 	if ((p->frequency < mt312_info.frequency_min)
 	    || (p->frequency > mt312_info.frequency_max))
 		return -EINVAL;
@@ -489,6 +520,22 @@
 
 	switch (id) {
 	case ID_VP310:
+	// For now we will do this only for the VP310.
+	// It should be better for the mt312 as well, but tunning will be slower. ACCJr 09/29/03
+		if ((ret = mt312_readreg(i2c, CONFIG, &config_val) < 0))
+			return ret;
+		if (p->u.qpsk.symbol_rate >= 30000000) //Note that 30MS/s should use 90MHz
+		{
+			if ((config_val & 0x0c) == 0x08) //We are running 60MHz
+				if ((ret = mt312_init(i2c, id, (u8) 90)) < 0)
+					return ret;
+		}
+		else
+		{
+			if ((config_val & 0x0c) == 0x0C) //We are running 90MHz
+				if ((ret = mt312_init(i2c, id, (u8) 60)) < 0)
+					return ret;
+		}
 		set_tv_freq = tsa5059_set_tv_freq;
 		break;
 	case ID_MT312:
@@ -562,7 +609,7 @@
 
 		monitor = (buf[0] << 8) | buf[1];
 
-		printk(KERN_DEBUG "sr(auto) = %u\n",
+		dprintk(KERN_DEBUG "sr(auto) = %u\n",
 		       mt312_div(monitor * 15625, 4));
 	} else {
 		if ((ret = mt312_writereg(i2c, MON_CTRL, 0x05)) < 0)
@@ -578,9 +625,9 @@
 
 		sym_rat_op = (buf[0] << 8) | buf[1];
 
-		printk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
+		dprintk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
 		       sym_rat_op, dec_ratio);
-		printk(KERN_DEBUG "*sr(manual) = %lu\n",
+		dprintk(KERN_DEBUG "*sr(manual) = %lu\n",
 		       (((MT312_PLL_CLK * 8192) / (sym_rat_op + 8192)) *
 			2) - dec_ratio);
 	}
@@ -675,7 +722,7 @@
 		return -EOPNOTSUPP;
 
 	case FE_READ_STATUS:
-		return mt312_read_status(i2c, arg);
+		return mt312_read_status(i2c, arg, (long) fe->data);
 
 	case FE_READ_BER:
 		return mt312_read_bercnt(i2c, arg);
@@ -702,7 +749,12 @@
 		return mt312_sleep(i2c);
 
 	case FE_INIT:
-		return mt312_init(i2c, (long) fe->data);
+	//For the VP310 we should run at 60MHz when ever possible.
+	//It should be better to run the mt312 ar lower speed when ever possible, but tunning will be slower. ACCJr 09/29/03
+		if ((long)fe->data == ID_MT312)
+			return mt312_init(i2c, (long) fe->data, (u8) 90);
+		else
+			return mt312_init(i2c, (long) fe->data, (u8) 60);
 
 	case FE_RESET:
 		return mt312_reset(i2c, 0);
@@ -755,6 +807,11 @@
 module_init(mt312_module_init);
 module_exit(mt312_module_exit);
 
+#if MT312_DEBUG != 0
+MODULE_PARM(debug,"i");
+MODULE_PARM_DESC(debug, "enable verbose debug messages");
+#endif
+
 MODULE_DESCRIPTION("MT312 Satellite Channel Decoder Driver");
-MODULE_AUTHOR("Andreas Oberritter <obi@saftware.de>");
+MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>");
 MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/dvb/frontends/mt312.h b/drivers/media/dvb/frontends/mt312.h
--- a/drivers/media/dvb/frontends/mt312.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/mt312.h	Thu Jan  8 23:00:23 2004
@@ -1,7 +1,7 @@
 /* 
     Driver for Zarlink MT312 QPSK Frontend
 
-    Copyright (C) 2003 Andreas Oberritter <obi@saftware.de>
+    Copyright (C) 2003 Andreas Oberritter <obi@linuxtv.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
diff -Nru a/drivers/media/dvb/frontends/nxt6000.c b/drivers/media/dvb/frontends/nxt6000.c
--- a/drivers/media/dvb/frontends/nxt6000.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/frontends/nxt6000.c	Thu Jan  8 23:00:24 2004
@@ -8,7 +8,7 @@
 	Alps TDED4 (Tuner: TI ALP510, external Nxt6000)
 	Comtech DVBT-6k07 (PLL IC: SP5730)
 
-    Copyright (C) 2002-2003 Florian Schirmer <schirmer@taytron.net>
+    Copyright (C) 2002-2003 Florian Schirmer <jolt@tuxbox.org>
     Copyright (C) 2003 Paul Andreassen <paul@andreassen.com.au>
 
     This program is free software; you can redistribute it and/or modify
@@ -55,34 +55,21 @@
 	.symbol_rate_max = 9360000,	/* FIXME */
 	.symbol_rate_tolerance = 4000,
 	.notifier_delay = 0,
-	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-			FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
-			FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-			FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-			FE_CAN_TRANSMISSION_MODE_AUTO |
-			FE_CAN_GUARD_INTERVAL_AUTO |
-			FE_CAN_HIERARCHY_AUTO,
-
+	.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
 };
 
-#pragma pack(1)
-
 struct nxt6000_config {
-
 	u8 demod_addr;
 	u8 tuner_addr;
 	u8 tuner_type;
 	u8 clock_inversion;
-
 };
 
-#pragma pack()
-
 #define TUNER_TYPE_ALP510	0
 #define TUNER_TYPE_SP5659	1
 #define TUNER_TYPE_SP5730	2
 
-#define FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
+#define FE2NXT(fe) ((struct nxt6000_config *)((fe)->data))
 #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
 
 #define dprintk if (debug) printk
@@ -116,8 +103,10 @@
 	int ret;
 	u8 b0[] = {reg};
 	u8 b1[] = {0};
-	struct i2c_msg msgs[] = {{.addr = addr >> 1, .flags = 0, .buf = b0, .len = 1},
-							{.addr = addr >> 1, .flags = I2C_M_RD, .buf = b1, .len = 1}};
+	struct i2c_msg msgs[] = {
+		{.addr = addr >> 1,.flags = 0,.buf = b0,.len = 1},
+		{.addr = addr >> 1,.flags = I2C_M_RD,.buf = b1,.len = 1}
+	};
 
 	ret = i2c->xfer(i2c, msgs, 2);
 	
@@ -394,7 +383,7 @@
 	nxt6000_writereg(fe, OFDM_ITB_FREQ_1, 0x06);
 	nxt6000_writereg(fe, OFDM_ITB_FREQ_2, 0x31);
 	nxt6000_writereg(fe, OFDM_CAS_CTL, (0x01 << 7) | (0x02 << 3) | 0x04);
-	nxt6000_writereg(fe, CAS_FREQ, 0xBB);	// CHECKME
+	nxt6000_writereg(fe, CAS_FREQ, 0xBB);	/* CHECKME */
 	nxt6000_writereg(fe, OFDM_SYR_CTL, 1 << 2);
 	nxt6000_writereg(fe, OFDM_PPM_CTL_1, PPM256);
 	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, 0x49);
@@ -414,20 +403,20 @@
 
 static void nxt6000_dump_status(struct dvb_frontend *fe)
 {
-
 	u8 val;
 
-//	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
-//	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
-//	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
-//	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
-//	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
-//	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
-//	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
-//	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
-//	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
-//	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
-
+/*
+	printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
+	printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
+	printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
+	printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
+	printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
+	printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
+	printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
+	printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
+	printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
+	printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
+*/
 	printk("NXT6000 status:");
 
 	val = nxt6000_readreg(fe, RS_COR_STAT);
@@ -460,13 +449,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" VITERBI CODERATE: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" VITERBI CODERATE: 7/8,");
-			
 			break;
 
 		default: 
@@ -503,13 +490,11 @@
 			break;
 	
 		case 0x04:
-		
 			printk(" CoreState: WAIT_PPM,");
+		break;
 
 		case 0x01:
-		
 			printk(" CoreState: WAIT_TRL,");
-			
 			break;
 
 		case 0x05:
@@ -586,13 +571,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" TPSLP: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" TPSLP: 7/8,");
-			
 			break;
 
 		default: 
@@ -622,13 +605,11 @@
 			break;
 	
 		case 0x03: 
-		
 			printk(" TPSHP: 5/6,");
+		break;
 
 		case 0x04: 
-		
 			printk(" TPSHP: 7/8,");
-			
 			break;
 
 		default: 
@@ -669,7 +650,7 @@
 			
 	}
 	
-	// Strange magic required to gain access to RF_AGC_STATUS
+	/* Strange magic required to gain access to RF_AGC_STATUS */
 	nxt6000_readreg(fe, RF_AGC_VAL_1);
 	val = nxt6000_readreg(fe, RF_AGC_STATUS);
 	val = nxt6000_readreg(fe, RF_AGC_STATUS);
@@ -735,21 +716,23 @@
 	
 		case FE_READ_SIGNAL_STRENGTH:
 		{
-//			s16 *signal = (s16 *)arg;
-
-//		*signal=(((signed char)readreg(client, 0x16))+128)<<8;
-
+			s16 *signal = (s16 *) arg;
+/*
+			*signal=(((signed char)readreg(client, 0x16))+128)<<8;
+*/
+			*signal = 0;
 			return 0;
 			
 		}
 	
 		case FE_READ_SNR:
 		{
-//			s16 *snr = (s16 *)arg;
-
-//		*snr=readreg(client, 0x24)<<8;
-//		*snr|=readreg(client, 0x25);
-
+			s16 *snr = (s16 *) arg;
+/*
+			*snr=readreg(client, 0x24)<<8;
+			*snr|=readreg(client, 0x25);
+*/
+			*snr = 0;
 			break;
 		}
 	
@@ -831,70 +814,74 @@
 
 static int nxt6000_attach(struct dvb_i2c_bus *i2c, void **data)
 {
-
 	u8 addr_nr;
 	u8 fe_count = 0;
-	struct nxt6000_config nxt;
+	struct nxt6000_config *pnxt;
 
 	dprintk("nxt6000: attach\n");
 	
+	pnxt = kmalloc(sizeof(demod_addr_tbl)*sizeof(struct nxt6000_config), GFP_KERNEL);
+	if (NULL == pnxt) {
+		dprintk("nxt6000: no memory for private data.\n");
+		return -ENOMEM;
+	}
+	*data = pnxt;
+
 	for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); addr_nr++) {
+		struct nxt6000_config *nxt = &pnxt[addr_nr];
 	
 		if (nxt6000_read(i2c, demod_addr_tbl[addr_nr], OFDM_MSC_REV) != NXT6000ASICDEVICE)
 			continue;
 
 		if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC0;
+			nxt->tuner_type = TUNER_TYPE_ALP510;
+			nxt->clock_inversion = 1;
 	
-			nxt.tuner_addr = 0xC0;
-			nxt.tuner_type = TUNER_TYPE_ALP510;
-			nxt.clock_inversion = 1;
-			
-			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC2, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC2;
+			nxt->tuner_type = TUNER_TYPE_SP5659;
+			nxt->clock_inversion = 0;
 
-			nxt.tuner_addr = 0xC2;
-			nxt.tuner_type = TUNER_TYPE_SP5659;
-			nxt.clock_inversion = 0;
-	
-			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
+			nxt->tuner_addr = 0xC0;
+			nxt->tuner_type = TUNER_TYPE_SP5730;
+			nxt->clock_inversion = 0;
 
-			nxt.tuner_addr = 0xC0;
-			nxt.tuner_type = TUNER_TYPE_SP5730;
-			nxt.clock_inversion = 0;
-	
-			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt.tuner_addr);
+			dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt->tuner_addr);
 		
 		} else {
-
 			printk("nxt6000: unable to detect tuner\n");
-
 			continue;	
-		
 		}
 		
-		nxt.demod_addr = demod_addr_tbl[addr_nr];
+		nxt->demod_addr = demod_addr_tbl[addr_nr];
 	  
 		dprintk("nxt6000: attached at %d:%d\n", i2c->adapter->num, i2c->id);
 	
-		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)(*((u32 *)&nxt)), &nxt6000_info);
+		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)nxt, &nxt6000_info);
 		
 		fe_count++;
 	}
 	
-	return (fe_count > 0) ? 0 : -ENODEV;
+	if (fe_count == 0) {
+		kfree(pnxt);
+		return -ENODEV;
+	}
 	
+	return 0;
 }
 
 static void nxt6000_detach(struct dvb_i2c_bus *i2c, void *data)
 {
-
+	struct nxt6000_config *pnxt = (struct nxt6000_config *)data;
 	dprintk("nxt6000: detach\n");
-
 	dvb_unregister_frontend(nxt6000_ioctl, i2c);
-	
+	kfree(pnxt);
 }
 
 static __init int nxt6000_init(void)
diff -Nru a/drivers/media/dvb/frontends/nxt6000.h b/drivers/media/dvb/frontends/nxt6000.h
--- a/drivers/media/dvb/frontends/nxt6000.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/nxt6000.h	Thu Jan  8 23:00:23 2004
@@ -1,45 +1,10 @@
-/**********************************************************************/
- * DRV6000reg.H
+/*
  * Public Include File for DRV6000 users
+ * (ie. NxtWave Communications - NXT6000 demodulator driver)
  *
  * Copyright (C) 2001 NxtWave Communications, Inc.
  *
- * $Log: nxt6000.h,v $
- * Revision 1.2  2003/01/27 12:32:42  fschirmer
- * Lots of bugfixes and new features
- *
- * Revision 1.1  2003/01/21 18:43:09  fschirmer
- * Nxt6000 based frontend driver
- *
- * Revision 1.1  2003/01/03 02:25:45  obi
- * alps tdme7 driver
- *
- * 
- *    Rev 1.10   Jun 12 2002 11:28:02   dkoeger
- * Updated for SA in GUi work
- * 
- *    Rev 1.9   Apr 01 2002 10:38:46   dkoeger
- * Updated for 1.0.31 GUI
- * 
- *    Rev 1.8   Mar 11 2002 10:04:56   dkoeger
- * Updated for 1.0.31 GUI version
- * 
- *    Rev 1.5   Dec 07 2001 14:40:40   dkoeger
- * Updated for 1.0.28 GUI
- * 
- *    Rev 1.4   Nov 13 2001 11:09:00   dkoeger
- * No change.
- * 
- *    Rev 1.3   Aug 23 2001 14:21:02   dkoeger
- * Updated for driver version 2.1.9
- * 
- *    Rev 1.2   Jul 09 2001 09:20:04   dkoeger
- * Updated for 1.0.18
- * 
- *    Rev 1.1   Jun 13 2001 16:14:24   dkoeger
- * Updated to reflect NXT6000 GUI BETA 1.0.11 6/13/2001
- **********************************************************************/
-
+ */
 
 /*  Nxt6000 Register Addresses and Bit Masks */
 
diff -Nru a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c
--- a/drivers/media/dvb/frontends/sp887x.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/frontends/sp887x.c	Thu Jan  8 23:00:24 2004
@@ -1,11 +1,39 @@
+/*
+   Driver for the Microtune 7202D Frontend
+*/
+
+/*
+   This driver needs a copy of the Avermedia firmware. The version tested
+   is part of the Avermedia DVB-T 1.3.26.3 Application. If the software is
+   installed in Windows the file will be in the /Program Files/AVerTV DVB-T/
+   directory and is called sc_main.mc. Alternatively it can "extracted" from
+   the install cab files. Copy this file to '/usr/lib/hotplug/firmware/sc_main.mc'.
+   With this version of the file the first 10 bytes are discarded and the
+   next 0x4000 loaded. This may change in future versions.
+ */
 
+#define __KERNEL_SYSCALLS__
+#include <linux/kernel.h>
+#include <linux/vmalloc.h>
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/unistd.h>
+#include <linux/fcntl.h>
+#include <linux/errno.h>
 #include <linux/i2c.h>
 
+
 #include "dvb_frontend.h"
 #include "dvb_functions.h"
 
+#ifndef DVB_SP887X_FIRMWARE_FILE
+#define DVB_SP887X_FIRMWARE_FILE "/usr/lib/hotplug/firmware/sc_main.mc"
+#endif
+
+static char *sp887x_firmware = DVB_SP887X_FIRMWARE_FILE;
 
 #if 0
 #define dprintk(x...) printk(x)
@@ -39,7 +67,7 @@
 		FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER
 };
 
-
+static int errno;
 
 static
 int i2c_writebytes (struct dvb_frontend *fe, u8 addr, u8 *buf, u8 len)
@@ -112,6 +140,7 @@
 static
 void sp887x_microcontroller_stop (struct dvb_frontend *fe)
 {
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0xf08, 0x000);
 	sp887x_writereg(fe, 0xf09, 0x000);		
 
@@ -123,6 +152,7 @@
 static
 void sp887x_microcontroller_start (struct dvb_frontend *fe)
 {
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0xf08, 0x000);
 	sp887x_writereg(fe, 0xf09, 0x000);		
 
@@ -135,6 +165,7 @@
 void sp887x_setup_agc (struct dvb_frontend *fe)
 {
 	/* setup AGC parameters */
+	dprintk("%s\n", __FUNCTION__);
 	sp887x_writereg(fe, 0x33c, 0x054);
 	sp887x_writereg(fe, 0x33b, 0x04c);
 	sp887x_writereg(fe, 0x328, 0x000);
@@ -152,8 +183,6 @@
 }
 
 
-#include "sp887x_firm.h"
-
 #define BLOCKSIZE 30
 
 /**
@@ -162,14 +191,63 @@
 static
 int sp887x_initial_setup (struct dvb_frontend *fe)
 {
-	u8 buf [BLOCKSIZE];
+	u8 buf [BLOCKSIZE+2];
+	unsigned char *firmware = NULL;
 	int i;
+	int fd;
+	int filesize;
+	int fw_size;
+	mm_segment_t fs;
+
+	dprintk("%s\n", __FUNCTION__);
 
 	/* soft reset */
 	sp887x_writereg(fe, 0xf1a, 0x000);
 
 	sp887x_microcontroller_stop (fe);
 
+	fs = get_fs();
+
+	// Load the firmware
+	set_fs(get_ds());
+	fd = open(sp887x_firmware, 0, 0);
+	if (fd < 0) {
+		printk(KERN_WARNING "%s: Unable to open firmware %s\n", __FUNCTION__,
+		       sp887x_firmware);
+		return -EIO;
+	}
+	filesize = lseek(fd, 0L, 2);
+	if (filesize <= 0) {
+		printk(KERN_WARNING "%s: Firmware %s is empty\n", __FUNCTION__,
+		       sp887x_firmware);
+		sys_close(fd);
+		return -EIO;
+	}
+
+	fw_size = 0x4000;
+
+	// allocate buffer for it
+	firmware = vmalloc(fw_size);
+	if (firmware == NULL) {
+		printk(KERN_WARNING "%s: Out of memory loading firmware\n",
+		       __FUNCTION__);
+		sys_close(fd);
+		return -EIO;
+	}
+
+	// read it!
+	// read the first 16384 bytes from the file
+	// ignore the first 10 bytes
+	lseek(fd, 10, 0);
+	if (read(fd, firmware, fw_size) != fw_size) {
+		printk(KERN_WARNING "%s: Failed to read firmware\n", __FUNCTION__);
+		vfree(firmware);
+		sys_close(fd);
+		return -EIO;
+	}
+	sys_close(fd);
+	set_fs(fs);
+
 	printk ("%s: firmware upload... ", __FUNCTION__);
 
 	/* setup write pointer to -1 (end of memory) */
@@ -179,12 +257,12 @@
 	/* dummy write (wrap around to start of memory) */
 	sp887x_writereg(fe, 0x8f0a, 0x0000);
 
-	for (i=0; i<sizeof(sp887x_firm); i+=BLOCKSIZE) {
+	for (i=0; i<fw_size; i+=BLOCKSIZE) {
 		int c = BLOCKSIZE;
 		int err;
 
-		if (i+c > sizeof(sp887x_firm))
-			c = sizeof(sp887x_firm) - i;
+		if (i+c > fw_size)
+			c = fw_size - i;
 
 		/* bit 0x8000 in address is set to enable 13bit mode */
 		/* bit 0x4000 enables multibyte read/write transfers */
@@ -192,14 +270,17 @@
 		buf[0] = 0xcf;
 		buf[1] = 0x0a;
 
-		memcpy(&buf[2], &sp887x_firm[i], c);
+		memcpy(&buf[2], firmware + i, c);
 
 		if ((err = i2c_writebytes (fe, 0x70, buf, c+2)) < 0) {
 			printk ("failed.\n");
 			printk ("%s: i2c error (err == %i)\n", __FUNCTION__, err);
+			vfree(firmware);
 			return err;
 		}
 	}
+
+	vfree(firmware);
 
 	/* don't write RS bytes between packets */
 	sp887x_writereg(fe, 0xc13, 0x001);
diff -Nru a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c
--- a/drivers/media/dvb/frontends/stv0299.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/frontends/stv0299.c	Thu Jan  8 23:00:24 2004
@@ -9,15 +9,22 @@
 	<holger@convergence.de>,
 	<js@convergence.de>
     
+
     Philips SU1278/SH
 
-    Copyright (C) 2002 by Peter Schildmann
-        <peter.schildmann@web.de>
+    Copyright (C) 2002 by Peter Schildmann <peter.schildmann@web.de>
+
 
     LG TDQF-S001F
 
     Copyright (C) 2002 Felix Domke <tmbinc@elitedvb.net>
-                     & Andreas Oberritter <andreas@oberritter.de>
+                     & Andreas Oberritter <obi@linuxtv.org>
+
+
+    Support for Samsung TBMU24112IMB used on Technisat SkyStar2 rev. 2.6B
+
+    Copyright (C) 2003 Vadim Catana <skystar@moldova.cc>:
+
 
     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
@@ -39,6 +46,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/string.h>
+#include <asm/div64.h>
 
 #include "dvb_frontend.h"
 #include "dvb_functions.h"
@@ -49,6 +57,11 @@
 #define dprintk(x...)
 #endif
 
+static int stv0299_status = 0;
+
+#define STATUS_BER 0
+#define STATUS_UCBLOCKS 1
+
 
 /* frontend types */
 #define UNKNOWN_FRONTEND  -1
@@ -56,6 +69,7 @@
 #define ALPS_BSRU6         1
 #define LG_TDQF_S001F      2
 #define PHILIPS_SU1278     3
+#define SAMSUNG_TBMU24112IMB    4
 
 /* Master Clock = 88 MHz */
 #define M_CLK (88000000UL) 
@@ -142,6 +156,51 @@
 };
 
 
+static u8 init_tab_samsung [] = {
+	0x01, 0x15,
+	0x02, 0x00,
+	0x03, 0x00,
+	0x04, 0x7D,
+	0x05, 0x35,
+	0x06, 0x02,
+	0x07, 0x00,
+	0x08, 0xC3,
+	0x0C, 0x00,
+	0x0D, 0x81,
+	0x0E, 0x23,
+	0x0F, 0x12,
+	0x10, 0x7E,
+	0x11, 0x84,
+	0x12, 0xB9,
+	0x13, 0x88,
+	0x14, 0x89,
+	0x15, 0xC9,
+	0x16, 0x00,
+	0x17, 0x5C,
+	0x18, 0x00,
+	0x19, 0x00,
+	0x1A, 0x00,
+	0x1C, 0x00,
+	0x1D, 0x00,
+	0x1E, 0x00,
+	0x1F, 0x3A,
+	0x20, 0x2E,
+	0x21, 0x80,
+	0x22, 0xFF,
+	0x23, 0xC1,
+	0x28, 0x00,
+	0x29, 0x1E,
+	0x2A, 0x14,
+	0x2B, 0x0F,
+	0x2C, 0x09,
+	0x2D, 0x05,
+	0x31, 0x1F,
+	0x32, 0x19,
+	0x33, 0xFE,
+	0x34, 0x93
+};
+
+
 static int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
 {
 	int ret;
@@ -169,7 +228,8 @@
 	ret = i2c->xfer (i2c, msg, 2);
         
 	if (ret != 2) 
-		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+		dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
+				__FUNCTION__, reg, ret);
 
 	return b1[0];
 }
@@ -193,18 +253,19 @@
 static int pll_write (struct dvb_i2c_bus *i2c, u8 addr, u8 *data, int len)
 {
 	int ret;
-	u8 rpt1 [] = { 0x05, 0xb5 };  /*  enable i2c repeater on stv0299  */
-	u8 rpt2 [] = { 0x05, 0x35 };  /*  disable i2c repeater on stv0299  */
-	struct i2c_msg msg [] = {{ .addr = 0x68, .flags = 0, .buf = rpt1, .len = 2 },
-			         { addr: addr, .flags = 0, .buf = data, .len = len },
-				 { .addr = 0x68, .flags = 0, .buf = rpt2, .len = 2 }};
+	struct i2c_msg msg = { addr: addr, .flags = 0, .buf = data, .len = len };
 
-	ret = i2c->xfer (i2c, msg, 3);
 
-	if (ret != 3)
-		printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
+	stv0299_writereg(i2c, 0x05, 0xb5);	/*  enable i2c repeater on stv0299  */
 
-	return (ret != 3) ? ret : 0;
+	ret =  i2c->xfer (i2c, &msg, 1);
+
+	stv0299_writereg(i2c, 0x05, 0x35);	/*  disable i2c repeater on stv0299  */
+
+	if (ret != 1)
+		dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
+
+	return (ret != 1) ? -1 : 0;
 }
 
 
@@ -213,23 +274,16 @@
 	u8 buf[4];
 	u32 div;
 
-	u32 ratios[] = { 2000, 1000, 500, 250, 125 };
-	u8 ratio;
-
-	for (ratio = 4; ratio > 0; ratio--)
-		if ((freq / ratios[ratio]) <= 0x3fff)
-			break;
+	div = freq / 125;
 
-	div = freq / ratios[ratio];
+	dprintk("%s : freq = %i, div = %i\n", __FUNCTION__, freq, div);
 
-	buf[0] = (freq >> 8) & 0x7f;
-	buf[1] = freq & 0xff;
-	buf[2] = 0x80 | ratio;
+	buf[0] = (div >> 8) & 0x7f;
+	buf[1] = div & 0xff;
+	buf[2] = 0x84;	// 0xC4
+	buf[3] = 0x08;
 
-	if (freq < 1531000)
-		buf[3] = 0x10;
-	else
-		buf[3] = 0x00;
+	if (freq < 1500000) buf[3] |= 0x10;
 
 	return pll_write (i2c, 0x61, buf, sizeof(buf));
 }
@@ -238,21 +292,47 @@
  *   set up the downconverter frequency divisor for a 
  *   reference clock comparision frequency of 125 kHz.
  */
-static int tsa5059_set_tv_freq	(struct dvb_i2c_bus *i2c, u32 freq, int ftype)
+static int tsa5059_set_tv_freq	(struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
 {
-	u8 addr = (ftype == PHILIPS_SU1278SH) ? 0x60 : 0x61;
-        u32 div = freq / 125;
-	u8 buf[4] = { (div >> 8) & 0x7f, div & 0xff, 0x84 };
+	u8 addr;
+	u32 div;
+	u8 buf[4];
 
 	dprintk ("%s: freq %i, ftype %i\n", __FUNCTION__, freq, ftype);
 
-	if (ftype == PHILIPS_SU1278SH)
-		/* activate f_xtal/f_comp signal output */
-		/* charge pump current C0/C1 = 00 */
-		buf[3] = 0x20;
-	else
-		buf[3] = freq > 1530000 ? 0xc0 : 0xc4;
+	if ((freq < 950000) || (freq > 2150000)) return -EINVAL;
+
+	// setup frequency divisor
+	div = freq / 1000;
+	buf[0] = (div >> 8) & 0x7f;
+	buf[1] = div & 0xff;
+	buf[2] = 0x81 | ((div & 0x18000) >> 10);
+	buf[3] = 0;
+
+	// tuner-specific settings
+	switch(ftype) {
+	case PHILIPS_SU1278SH:
+		addr = 0x60;
+		buf[3] |= 0x20;
+
+		if (srate < 4000000) buf[3] |= 1;
+	   
+		if (freq <= 1250000) buf[3] |= 0;
+		else if (freq <= 1550000) buf[3] |= 0x40;
+		else if (freq <= 2050000) buf[3] |= 0x80;
+		else if (freq <= 2150000) buf[3] |= 0xC0;
+		break;
+
+	case ALPS_BSRU6:
+		addr = 0x61;
+		buf[3] |= 0xC0;
+	 	break;
+
+	default:
+		return -EINVAL;
+	}
 
+	// charge pump
 	return pll_write (i2c, addr, buf, sizeof(buf));
 }
 
@@ -385,12 +465,14 @@
 
 static int pll_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
 {
-	if (ftype == LG_TDQF_S001F)
+	if (ftype == SAMSUNG_TBMU24112IMB)
+		return sl1935_set_tv_freq(i2c, freq, ftype);
+	else if (ftype == LG_TDQF_S001F)
 		return sl1935_set_tv_freq(i2c, freq, ftype);
 	else if (ftype == PHILIPS_SU1278)
 		return tua6100_set_tv_freq(i2c, freq, ftype, srate);
 	else
-		return tsa5059_set_tv_freq(i2c, freq, ftype);
+		return tsa5059_set_tv_freq(i2c, freq, ftype, srate);
 }
 
 #if 0
@@ -421,6 +503,19 @@
 
 	dprintk("stv0299: init chip\n");
 
+	switch(ftype) {
+	case SAMSUNG_TBMU24112IMB:
+		dprintk("%s: init stv0299 chip for Samsung TBMU24112IMB\n", __FUNCTION__);
+
+		for (i=0; i<sizeof(init_tab_samsung); i+=2)
+		{
+			dprintk("%s: reg == 0x%02x, val == 0x%02x\n", __FUNCTION__, init_tab_samsung[i], init_tab_samsung[i+1]);
+
+			stv0299_writereg (i2c, init_tab_samsung[i], init_tab_samsung[i+1]);
+		}
+		break;
+
+	default:
 	stv0299_writereg (i2c, 0x01, 0x15);
 	stv0299_writereg (i2c, 0x02, ftype == PHILIPS_SU1278 ? 0x00 : 0x30);
 	stv0299_writereg (i2c, 0x03, 0x00);
@@ -430,11 +525,23 @@
 
         /* AGC1 reference register setup */
 	if (ftype == PHILIPS_SU1278SH)
-	  stv0299_writereg (i2c, 0x0f, 0xd2);  /* Iagc = Inverse, m1 = 18 */
+		  stv0299_writereg (i2c, 0x0f, 0x92);  /* Iagc = Inverse, m1 = 18 */
 	else if (ftype == PHILIPS_SU1278)
-	  stv0299_writereg (i2c, 0x0f, 0x94);  /* Iagc = Inverse, m1 = 18 */
+		  stv0299_writereg (i2c, 0x0f, 0x94);  /* Iagc = Inverse, m1 = 20 */
 	else
 	  stv0299_writereg (i2c, 0x0f, 0x52);  /* Iagc = Normal,  m1 = 18 */
+		break;
+	}
+	
+	switch(stv0299_status) {
+	case STATUS_BER:
+		stv0299_writereg(i2c, 0x34, 0x93);
+		break;
+	
+	case STATUS_UCBLOCKS:
+		stv0299_writereg(i2c, 0x34, 0xB3);
+		break;
+	}
 
 	return 0;
 }
@@ -448,6 +555,7 @@
 		dvb_delay(30);
 		if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
 		u8 val = stv0299_readreg (i2c, 0x0c);
+			dprintk ("%s : changing inversion\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
 	}
 	}
@@ -462,21 +570,42 @@
 
 	switch (fec) {
 	case FEC_AUTO:
+	{
+		dprintk ("%s : FEC_AUTO\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x1f);
+	}
 	case FEC_1_2:
+	{
+		dprintk ("%s : FEC_1_2\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x01);
+	}
 	case FEC_2_3:
+	{
+		dprintk ("%s : FEC_2_3\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x02);
+	}
 	case FEC_3_4:
+	{
+		dprintk ("%s : FEC_3_4\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x04);
+	}
 	case FEC_5_6:
+	{
+		dprintk ("%s : FEC_5_6\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x08);
+	}
 	case FEC_7_8:
+	{
+		dprintk ("%s : FEC_7_8\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x31, 0x10);
+	}
 	default:
+	{
+		dprintk ("%s : FEC invalid\n", __FUNCTION__);
 		return -EINVAL;
 	}
 }
+}
 
 
 static fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
@@ -606,11 +735,20 @@
 
 	switch (tone) {
 	case SEC_TONE_ON:
+	{
+	    	dprintk("%s: TONE_ON\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x08, val | 0x3);
+	}	
 	case SEC_TONE_OFF:
+	{
+	    	dprintk("%s: TONE_OFF\n", __FUNCTION__);
 		return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02);
+	}
 	default:
+	{
+	    	dprintk("%s: TONE INVALID\n", __FUNCTION__);
 		return -EINVAL;
+	}
 	};
 }
 
@@ -651,39 +789,60 @@
 }
 
 
-static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
+static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate, int tuner_type)
 {
+	u64 big = srate;
 	u32 ratio;
-	u32 tmp;
-	u8 aclk = 0xb4, bclk = 0x51;
+	u8 aclk = 0;
+	u8 bclk = 0;
+	u8 m1;
+
+	if ((srate < 1000000) || (srate > 45000000)) return -EINVAL;
+	switch(tuner_type) {
+	case PHILIPS_SU1278SH:
+		aclk = 0xb5;
+		if (srate < 2000000) bclk = 0x86;
+		else if (srate < 5000000) bclk = 0x89;
+		else if (srate < 15000000) bclk = 0x8f;
+		else if (srate < 45000000) bclk = 0x95;
 
-	if (srate > M_CLK)
-		srate = M_CLK;
-        if (srate < 500000)
-		srate = 500000;
-
-	if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
-	if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
-	if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
-	if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
-	if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
+		m1 = 0x14;
+		if (srate < 4000000) m1 = 0x10;
+		break;
 
-#define FIN (M_CLK >> 4)
+	case ALPS_BSRU6:
+	default:
+		if (srate <= 1500000) { aclk = 0xb7; bclk = 0x87; }
+		else if (srate <= 3000000) { aclk = 0xb7; bclk = 0x8b; }
+		else if (srate <= 7000000) { aclk = 0xb7; bclk = 0x8f; }
+		else if (srate <= 14000000) { aclk = 0xb7; bclk = 0x93; }
+		else if (srate <= 30000000) { aclk = 0xb6; bclk = 0x93; }
+		else if (srate <= 45000000) { aclk = 0xb4; bclk = 0x91; }
 
-	tmp = srate << 4;
-	ratio = tmp / FIN;
+		m1 = 0x12;
+		break;   
+	}
         
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
         
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
+	big = big << 20;
+
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
+
+	do_div(big, M_CLK);
+
+	dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff),  (int) (big & 0xffffffff) );
+
+	ratio = big << 4;
+
+	dprintk("%s : ratio = %i\n", __FUNCTION__, ratio);
   
 	stv0299_writereg (i2c, 0x13, aclk);
 	stv0299_writereg (i2c, 0x14, bclk);
 	stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff);
 	stv0299_writereg (i2c, 0x20, (ratio >>  8) & 0xff);
 	stv0299_writereg (i2c, 0x21, (ratio      ) & 0xf0);
+	stv0299_writereg (i2c, 0x0f, (stv0299_readreg(i2c, 0x0f) & 0xc0) | m1);
 
 	return 0;
 }
@@ -710,6 +869,9 @@
 	offset = (s32) rtf * (srate / 4096L);
 	offset /= 128;
 
+	dprintk ("%s : srate = %i\n", __FUNCTION__, srate);
+	dprintk ("%s : ofset = %i\n", __FUNCTION__, offset);
+
 	srate += offset;
 
 	srate += 1000;
@@ -725,6 +887,8 @@
         int tuner_type = (long) fe->data;
 	struct dvb_i2c_bus *i2c = fe->i2c;
 
+	dprintk ("%s\n", __FUNCTION__);
+
 	switch (cmd) {
 	case FE_GET_INFO:
 		memcpy (arg, &uni0299_info, sizeof(struct dvb_frontend_info));
@@ -736,7 +900,7 @@
 		u8 signal = 0xff - stv0299_readreg (i2c, 0x18);
 		u8 sync = stv0299_readreg (i2c, 0x1b);
 
-		dprintk ("VSTATUS: 0x%02x\n", sync);
+		dprintk ("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __FUNCTION__, sync);
 
 		*status = 0;
 
@@ -759,8 +923,12 @@
 	}
 
         case FE_READ_BER:
+		if (stv0299_status == STATUS_BER) {
 		*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
 			       | stv0299_readreg (i2c, 0x1e);
+		} else {
+			*((u32*) arg) = 0;
+		}
 		break;
 
 	case FE_READ_SIGNAL_STRENGTH:
@@ -768,7 +936,7 @@
 		s32 signal =  0xffff - ((stv0299_readreg (i2c, 0x18) << 8)
 			               | stv0299_readreg (i2c, 0x19));
 
-		dprintk ("AGC2I: 0x%02x%02x, signal=0x%04x\n",
+		dprintk ("%s : FE_READ_SIGNAL_STRENGTH : AGC2I: 0x%02x%02x, signal=0x%04x\n", __FUNCTION__,
 			 stv0299_readreg (i2c, 0x18),
 			 stv0299_readreg (i2c, 0x19), (int) signal);
 
@@ -787,18 +955,25 @@
 		break;
 	}
 	case FE_READ_UNCORRECTED_BLOCKS: 
-		*((u32*) arg) = 0;    /* the stv0299 can't measure BER and */
-		return -EOPNOTSUPP;   /* errors at the same time.... */
+		if (stv0299_status == STATUS_UCBLOCKS) {
+			*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
+			               | stv0299_readreg (i2c, 0x1e);
+		} else {
+			*((u32*) arg) = 0;
+		}
+		break;
 
         case FE_SET_FRONTEND:
         {
 		struct dvb_frontend_parameters *p = arg;
 
+		dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
+
 		pll_set_tv_freq (i2c, p->frequency, tuner_type,
 				 p->u.qpsk.symbol_rate);
 
                 stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
-                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
+                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, tuner_type);
 		stv0299_writereg (i2c, 0x22, 0x00);
 		stv0299_writereg (i2c, 0x23, 0x00);
 		stv0299_readreg (i2c, 0x23);
@@ -859,6 +1034,8 @@
 
 static long probe_tuner (struct dvb_i2c_bus *i2c)
 {
+	struct dvb_adapter * adapter = (struct dvb_adapter *) i2c->adapter;
+
         /* read the status register of TSA5059 */
 	u8 rpt[] = { 0x05, 0xb5 };
         u8 stat [] = { 0 };
@@ -875,6 +1052,17 @@
 	stv0299_writereg (i2c, 0x02, 0x30);
 	stv0299_writereg (i2c, 0x03, 0x00);
 
+
+	printk ("%s: try to attach to %s\n", __FUNCTION__, adapter->name);
+
+	if ( strcmp(adapter->name, "Technisat SkyStar2 driver") == 0 )
+	{
+	    printk ("%s: setup for tuner Samsung TBMU24112IMB\n", __FILE__);
+
+    	    return SAMSUNG_TBMU24112IMB;
+	}
+
+
 	if ((ret = i2c->xfer(i2c, msg1, 2)) == 2) {
 		printk ("%s: setup for tuner SU1278/SH\n", __FILE__);
 		return PHILIPS_SU1278SH;
@@ -961,3 +1149,5 @@
 MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, Andreas Oberritter");
 MODULE_LICENSE("GPL");
 
+MODULE_PARM(stv0299_status, "i");
+MODULE_PARM_DESC(stv0299_status, "Which status value to support (0: BER, 1: UCBLOCKS)");
diff -Nru a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c
--- a/drivers/media/dvb/frontends/tda1004x.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/tda1004x.c	Thu Jan  8 23:00:23 2004
@@ -20,7 +20,7 @@
 
 /*
     This driver needs a copy of the DLL "ttlcdacc.dll" from the Haupauge or Technotrend
-    windows driver saved as '/etc/dvb/tda1004x.mc'.
+    windows driver saved as '/usr/lib/hotplug/firmware/tda1004x.mc'.
     You can also pass the complete file name with the module parameter 'tda1004x_firmware'.
 
     Currently the DLL from v2.15a of the technotrend driver is supported. Other versions can
@@ -45,7 +45,7 @@
 #include "dvb_functions.h"
 
 #ifndef DVB_TDA1004X_FIRMWARE_FILE
-#define DVB_TDA1004X_FIRMWARE_FILE "/etc/dvb/tda1004x.mc"
+#define DVB_TDA1004X_FIRMWARE_FILE "/usr/lib/hotplug/firmware/tda1004x.mc"
 #endif
 
 static int tda1004x_debug = 0;
@@ -108,7 +108,7 @@
 	.frequency_min = 51000000,
 	.frequency_max = 858000000,
 	.frequency_stepsize = 166667,
-	.caps = FE_CAN_INVERSION_AUTO |
+	.caps =
 	    FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 	    FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 	    FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
diff -Nru a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c
--- a/drivers/media/dvb/frontends/ves1820.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/frontends/ves1820.c	Thu Jan  8 23:00:24 2004
@@ -19,6 +19,8 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */    
 
+#include <linux/config.h>
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -70,7 +72,18 @@
 #define GET_TUNER(data) ((u8) (((long) data >> 16) & 0xff))
 #define GET_DEMOD_ADDR(data) ((u8) (((long) data >> 24) & 0xff))
 
+#if defined(CONFIG_DBOX2)
+#define XIN 69600000UL
+#define DISABLE_INVERSION(reg0)		do { reg0 &= ~0x20; } while (0)
+#define ENABLE_INVERSION(reg0)		do { reg0 |= 0x20; } while (0)
+#define HAS_INVERSION(reg0)		(reg0 & 0x20)
+#else	/* PCI cards */
 #define XIN 57840000UL
+#define DISABLE_INVERSION(reg0)		do { reg0 |= 0x20; } while (0)
+#define ENABLE_INVERSION(reg0)		do { reg0 &= ~0x20; } while (0)
+#define HAS_INVERSION(reg0)		(!(reg0 & 0x20))
+#endif
+
 #define FIN (XIN >> 4)
 
 
@@ -209,9 +222,9 @@
 	reg0 |= GET_REG0(fe->data) & 0x62;
 	
 	if (INVERSION_ON == inversion)
-		reg0 &= ~0x20;
+		ENABLE_INVERSION(reg0);
 	else if (INVERSION_OFF == inversion)
-		reg0 |= 0x20;
+		DISABLE_INVERSION(reg0);
 	
 	ves1820_writereg (fe, 0x00, reg0 & 0xfe);
         ves1820_writereg (fe, 0x00, reg0 | 0x01);
@@ -220,7 +233,7 @@
 	 *  check lock and toggle inversion bit if required...
 	 */
 	if (INVERSION_AUTO == inversion && !(ves1820_readreg (fe, 0x11) & 0x08)) {
-		dvb_delay(10);
+		mdelay(50);
 		if (!(ves1820_readreg (fe, 0x11) & 0x08)) {
 			reg0 ^= 0x20;
 			ves1820_writereg (fe, 0x00, reg0 & 0xfe);
@@ -242,6 +255,10 @@
 
         ves1820_writereg (fe, 0, 0);
 
+#if defined(CONFIG_DBOX2)
+	ves1820_inittab[2] &= ~0x08;
+#endif
+
 	for (i=0; i<53; i++)
                 ves1820_writereg (fe, i, ves1820_inittab[i]);
 
@@ -330,6 +347,10 @@
 
 	ves1820_setup_reg0 (fe, reg0x00[real_qam], p->inversion);
 
+	/* yes, this speeds things up: userspace reports lock in about 8 ms
+	   instead of 500 to 1200 ms after calling FE_SET_FRONTEND. */
+	mdelay(50);
+
 	return 0;
 }
 
@@ -419,14 +440,14 @@
 					fe->i2c->adapter->num, afc,
 				-((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7));
 
-		p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON;
+		p->inversion = HAS_INVERSION(reg0) ? INVERSION_ON : INVERSION_OFF;
 		p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16;
 
 		p->u.qam.fec_inner = FEC_NONE;
 
 		p->frequency = ((p->frequency + 31250) / 62500) * 62500;
-		// To prevent overflow, shift symbol rate first a
-		// couple of bits.
+		/* To prevent overflow, shift symbol rate first a
+		   couple of bits. */
 		p->frequency -= (s32)(p->u.qam.symbol_rate >> 3) * afc >> 7;
 		break;
 	}
@@ -462,8 +483,6 @@
 		printk ("DVB: VES1820(%d): setup for tuner sp5659c\n", i2c->adapter->num);
 	} else {
 		type = -1;
-		printk ("DVB: VES1820(%d): unknown PLL, "
-			"please report to <linuxdvb@linuxtv.org>!!\n", i2c->adapter->num);
 	}
 
 	return type;
@@ -477,13 +496,11 @@
 	struct i2c_msg msg [] = { { .addr = 0x50, .flags = 0, .buf = &b, .len = 1 },
 			 { .addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1 } };
 
-	i2c->xfer (i2c, msg, 2);
+	if ((i2c->xfer(i2c, msg, 2) != 2) || (pwm == 0xff))
+		pwm = 0x48;
 
 	printk("DVB: VES1820(%d): pwm=0x%02x\n", i2c->adapter->num, pwm);
 
-	if (pwm == 0xff)
-		pwm = 0x48;
-
 	return pwm;
 }
 
@@ -516,8 +533,7 @@
 	if ((demod_addr = probe_demod_addr(i2c)) < 0)
 		return -ENODEV;
 
-	if ((tuner_type = probe_tuner(i2c)) < 0)
-		return -ENODEV;
+	tuner_type = probe_tuner(i2c);
 
 	if ((i2c->adapter->num < MAX_UNITS) && pwm[i2c->adapter->num] != -1) {
 		printk("DVB: VES1820(%d): pwm=0x%02x (user specified)\n",
diff -Nru a/drivers/media/dvb/frontends/ves1x93.c b/drivers/media/dvb/frontends/ves1x93.c
--- a/drivers/media/dvb/frontends/ves1x93.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/frontends/ves1x93.c	Thu Jan  8 23:00:23 2004
@@ -2,9 +2,9 @@
     Driver for VES1893 and VES1993 QPSK Frontends
 
     Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de>
-    Copyright (C) 2001 Ronny Strutz <3des@tuxbox.org>
+    Copyright (C) 2001 Ronny Strutz <3des@elitedvb.de>
     Copyright (C) 2002 Dennis Noermann <dennis.noermann@noernet.de>
-    Copyright (C) 2002-2003 Andreas Oberritter <obi@tuxbox.org>
+    Copyright (C) 2002-2003 Andreas Oberritter <obi@linuxtv.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
diff -Nru a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig
--- a/drivers/media/dvb/ttpci/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/ttpci/Kconfig	Thu Jan  8 23:00:23 2004
@@ -1,6 +1,7 @@
 config DVB_AV7110
 	tristate "AV7110 cards"
 	depends on DVB_CORE
+	select FW_LOADER
 	select VIDEO_DEV
 	select VIDEO_SAA7146_VV
 	help
@@ -12,6 +13,23 @@
 
 	  Say Y if you own such a card and want to use it.
 
+config DVB_AV7110_FIRMWARE
+	bool "Compile AV7110 firmware into the driver"
+	depends on DVB_AV7110 && !STANDALONE
+	help
+	  The AV7110 firmware is normally loaded by the firmware hotplug manager.
+	  If you want to compile the firmware into the driver you need to say
+	  Y here and provide the correct path of the firmware. You need this
+	  option if you want to compile the whole driver statically into the
+	  kernel. 
+
+	  All other people say N.
+
+config DVB_AV7110_FIRMWARE_FILE
+	string "Full pathname of av7110 firmware file"
+	depends on DVB_AV7110_FIRMWARE
+	default "/usr/lib/hotplug/firmware/dvb-ttpci-01.fw"
+
 config DVB_AV7110_OSD
 	bool "AV7110 OSD support"
 	depends on DVB_AV7110
@@ -71,8 +89,7 @@
 config DVB_BUDGET_PATCH
 	tristate "AV7110 cards with Budget Patch"
 	depends on DVB_BUDGET
-	select VIDEO_DEV
-	select VIDEO_SAA7146_VV
+	select DVB_AV7110
 	help
 	  Support for Budget Patch (full TS) modification on 
 	  SAA7146+AV7110 based cards (DVB-S cards). This
diff -Nru a/drivers/media/dvb/ttpci/Makefile b/drivers/media/dvb/ttpci/Makefile
--- a/drivers/media/dvb/ttpci/Makefile	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/ttpci/Makefile	Thu Jan  8 23:00:23 2004
@@ -12,3 +12,12 @@
 obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o ttpci-eeprom.o
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+
+host-progs	:= fdump
+
+ifdef CONFIG_DVB_AV7110_FIRMWARE
+$(obj)/av7110.o: $(obj)/fdump $(obj)/av7110_firm.h 
+
+$(obj)/av7110_firm.h:
+	$(obj)/fdump $(CONFIG_DVB_AV7110_FIRMWARE_FILE) dvb_ttpci_fw $@
+endif
diff -Nru a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
--- a/drivers/media/dvb/ttpci/av7110.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttpci/av7110.c	Thu Jan  8 23:00:24 2004
@@ -35,7 +35,6 @@
 
 #define __KERNEL_SYSCALLS__
 #include <linux/module.h>
-#include <linux/init.h>
 #include <linux/kmod.h>
 #include <linux/delay.h>
 #include <linux/fs.h>
@@ -43,7 +42,6 @@
 #include <linux/poll.h>
 #include <linux/unistd.h>
 #include <linux/byteorder/swabb.h>
-#include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <stdarg.h>
 
@@ -55,15 +53,15 @@
 #include <linux/ptrace.h>
 #include <linux/ioport.h>
 #include <linux/in.h>
-#include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/pci.h>
-#include <linux/init.h>
 #include <linux/vmalloc.h>
 #include <linux/netdevice.h>
 #include <linux/inetdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
+#include <linux/firmware.h>
+#include <linux/crc32.h>
 
 #include <asm/system.h>
 #include <asm/bitops.h>
@@ -108,6 +106,7 @@
 static int pids_off;
 static int adac=DVB_ADAC_TI;
 static int hw_sections = 1;
+static int rgb_on = 0;
 
 int av7110_num = 0;
 
@@ -118,42 +117,12 @@
  * DEBI functions
  ****************************************************************************/
 
+#define wait_for_debi_done(x) \
+       saa7146_wait_for_debi_done(x->dev) \
+
 /* This DEBI code is based on the Stradis driver 
    by Nathan Laredo <laredo@gnu.org> */
 
-static int wait_for_debi_done(struct av7110 *av7110)
-{
-	struct saa7146_dev *dev = av7110->dev;
-	int start;
-
-	/* wait for registers to be programmed */
-	start = jiffies;
-	while (1) {
-                if (saa7146_read(dev, MC2) & 2)
-                        break;
-		if (jiffies-start > HZ/20) {
-			printk ("%s: timed out while waiting for registers "
-				"getting programmed\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	/* wait for transfer to complete */
-	start = jiffies;
-	while (1) {
-		if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
-			break;
-		saa7146_read(dev, MC2);
-		if (jiffies-start > HZ/4) {
-			printk ("%s: timed out while waiting for transfer "
-				"completion\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	return 0;
-}
-
 static int debiwrite(struct av7110 *av7110, u32 config, 
                      int addr, u32 val, int count)
 {
@@ -375,7 +344,7 @@
 {
         struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
 
-	DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
+//	DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
 
         if (!(dvbdmxfeed->ts_type & TS_PACKET)) 
                 return 0;
@@ -385,14 +354,14 @@
                 return dvbdmxfeed->cb.ts(buf, len, 0, 0, 
                                          &dvbdmxfeed->feed.ts, DMX_OK); 
         else
-                return dvb_filter_pes2ts(p2t, buf, len);
+                return dvb_filter_pes2ts(p2t, buf, len, 1);
 }
 
 static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
 {
         struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
 
-	DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
+//	DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
         
         dvbdmxfeed->cb.ts(data, 188, 0, 0,
                           &dvbdmxfeed->feed.ts,
@@ -886,10 +855,10 @@
         txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
         len=(av7110->debilen+3)&(~3);
 
-        DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
+//        DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
         print_time("gpio");
 
-        DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));        
+//       DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));        
         switch (av7110->debitype&0xff) {
 
         case DATA_TS_PLAY:
@@ -2002,8 +1971,6 @@
         0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
 };
 
-#include "av7110_firm.h"
-
 static int bootarm(struct av7110 *av7110)
 {
 	struct saa7146_dev *dev= av7110->dev;
@@ -2056,7 +2023,7 @@
         
         DEB_D(("bootarm: load dram code\n"));
 
-	if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
+	if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root)<0)
 		return -1;
 
 	saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
@@ -2064,7 +2031,7 @@
         
         DEB_D(("bootarm: load dpram code\n"));
 
-	mwdebi(av7110, DEBISWAB, DPRAM_BASE, Dpram, sizeof(Dpram));
+	mwdebi(av7110, DEBISWAB, DPRAM_BASE, av7110->bin_dpram, av7110->size_dpram);
 
 	wait_for_debi_done(av7110);
 
@@ -2706,9 +2673,9 @@
 	buf[1] = div & 0xff;
 	buf[2] = 0x8e;
 
-	if (freq < (u32) (16*168.25) ) 
+	if (freq < (u32) (16*168.25) )
 		config = 0xa0;
-	else if (freq < (u32) (16*447.25)) 
+	else if (freq < (u32) (16*447.25) )
 		config = 0x90;
 	else
 		config = 0x30;
@@ -4294,8 +4261,10 @@
                         av7110->pids[DMX_PES_TELETEXT], 0, 
                         av7110->pids[DMX_PES_PCR]);
         	outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-	} else 
+	} else {
 		SetPIDs(av7110, 0, 0, 0, 0, 0);
+        	outcom(av7110, COMTYPE_PIDFILTER, FlushTSQueue, 0);
+	}
 
         up(&av7110->pid_mutex);
 }
@@ -4529,31 +4498,117 @@
 static struct saa7146_ext_vv av7110_vv_data_st;
 static struct saa7146_ext_vv av7110_vv_data_c;
 
+
+
+
+
+#ifdef CONFIG_DVB_AV7110_FIRMWARE_FILE
+#include "av7110_firm.h"
+#endif
+
 static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
 {
+#ifndef CONFIG_DVB_AV7110_FIRMWARE_FILE
+	const struct firmware *fw;
+#endif
 	struct av7110 *av7110 = NULL;
 	int ret = 0;
-	
+	u32 crc = 0, len = 0;
+	unsigned char *ptr;
+		
+	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+
+#ifndef CONFIG_DVB_AV7110_FIRMWARE_FILE 
+	/* request the av7110 firmware, this will block until someone uploads it */
+	ret = request_firmware(&fw, "dvb-ttpci-01.fw", &dev->pci->dev);
+	if ( 0 != ret ) {
+		printk("dvb-ttpci: cannot request firmware!\n");
+		return -EINVAL;
+	}
+
+	if (fw->size <= 200000) {
+		printk("dvb-ttpci: this firmware is way too small.\n");
+		return -EINVAL;
+	}
+#endif
+
+	/* prepare the av7110 device struct */
 	if (!(av7110 = kmalloc (sizeof (struct av7110), GFP_KERNEL))) {
 		printk ("%s: out of memory!\n", __FUNCTION__);
 		return -ENOMEM;
 	}
-
 	memset(av7110, 0, sizeof(struct av7110));
+	
+#ifndef CONFIG_DVB_AV7110_FIRMWARE_FILE 
+	/* check if the firmware is available */
+	av7110->bin_fw = (unsigned char*)vmalloc(fw->size);
+	if (NULL == av7110->bin_fw) {
+		DEB_D(("out of memory\n"));
+		kfree(av7110);
+		return -ENOMEM;
+	}
+	memcpy(av7110->bin_fw, fw->data, fw->size);
+	av7110->size_fw = fw->size;
+#else
+	av7110->bin_fw = dvb_ttpci_fw;
+	av7110->size_fw = sizeof dvb_ttpci_fw;
+#endif
 
+	/* check for firmware magic */
+	ptr = av7110->bin_fw;
+	if (ptr[0] != 'A' || ptr[1] != 'V' || 
+	    ptr[2] != 'F' || ptr[3] != 'W') {
+		printk("dvb-ttpci: this is not an av7110 firmware\n");
+		goto fw_error;
+	}
+	ptr += 4;
+
+	/* check dpram file */
+	crc = ntohl(*(u32*)ptr);
+	ptr += 4;
+	len = ntohl(*(u32*)ptr);
+	ptr += 4;
+	if (len >= 512) {
+		printk("dvb-ttpci: dpram file is way to big.\n");
+		goto fw_error;
+	}
+	if( crc != crc32_le(0,ptr,len)) {
+		printk("dvb-ttpci: crc32 of dpram file does not match.\n");
+		goto fw_error;
+	}
+	av7110->bin_dpram = ptr;
+	av7110->size_dpram = len;
+	ptr += len;
+	
+	/* check root file */
+	crc = ntohl(*(u32*)ptr);
+	ptr += 4;
+	len = ntohl(*(u32*)ptr);
+	ptr += 4;
+	
+	if (len <= 200000 || len >= 300000 || len > ((av7110->bin_fw+av7110->size_fw)-ptr) ) {
+		printk("dvb-ttpci: root file has strange size (%d). aborting.\n",len);
+		goto fw_error;
+	}
+	if( crc != crc32_le(0,ptr,len)) {
+		printk("dvb-ttpci: crc32 of dpram file does not match.\n");
+		goto fw_error;
+	}
+	av7110->bin_root = ptr;
+	av7110->size_root = len;
+	
+	/* go on with regular device initialization */
 	av7110->card_name = (char*)pci_ext->ext_priv;
+	av7110->dev=(struct saa7146_dev *)dev;
 	(struct av7110*)dev->ext_priv = av7110;
 
-	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
-
-	av7110->dev=(struct saa7146_dev *)dev;
 	dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name);
 
 	/* the Siemens DVB needs this if you want to have the i2c chips
 	   get recognized before the main driver is fully loaded */
 	saa7146_write(dev, GPIO_CTRL, 0x500000);
 
-	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_3200);
+	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
 
 	av7110->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
 						av7110->dvb_adapter, 0);
@@ -4571,7 +4626,7 @@
 
 	/* set dd1 stream a & b */
       	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-	saa7146_write(dev, DD1_INIT, 0x02000000);
+	saa7146_write(dev, DD1_INIT, 0x03000000);
 	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
 	/* upload all */
@@ -4729,7 +4784,7 @@
 		memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
 		/* set dd1 stream a & b */
       		saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-		saa7146_write(dev, DD1_INIT, 0x02000700);
+		saa7146_write(dev, DD1_INIT, 0x03000700);
 		saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 	}
 	else if (dev->pci->subsystem_vendor == 0x110a) {
@@ -4747,7 +4802,8 @@
 		// switch DVB SCART on
 		outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
 		outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
-		//saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
+		if (rgb_on)
+			saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
 		//saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
 	}
 	
@@ -4786,6 +4842,7 @@
 	}	
 
 	printk(KERN_INFO "av7110: found av7110-%d.\n",av7110_num);
+	av7110->device_initialized = 1;
 	av7110_num++;
         return 0;
 
@@ -4809,12 +4866,22 @@
 	dvb_unregister_adapter (av7110->dvb_adapter);
 
 	return ret;
+fw_error:
+#ifndef CONFIG_DVB_AV7110_FIRMWARE_FILE 
+	vfree(av7110->bin_fw);
+#endif
+	kfree(av7110);
+	return -EINVAL;
 }
 
 static int av7110_detach (struct saa7146_dev* saa)
 {
 	struct av7110 *av7110 = (struct av7110*)saa->ext_priv;
 	DEB_EE(("av7110: %p\n",av7110));
+	
+	if( 0 == av7110->device_initialized ) {
+		return 0;
+	}
 
 	saa7146_unregister_device(&av7110->v4l_dev, saa);
 	if (2 == av7110->has_analog_tuner) {
@@ -4845,11 +4912,15 @@
 	dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id);
 	dvb_unregister_adapter (av7110->dvb_adapter);
 
+	av7110_num--;
+#ifndef CONFIG_DVB_AV7110_FIRMWARE_FILE 
+	if (NULL != av7110->bin_fw ) {
+		vfree(av7110->bin_fw);
+	}
+#endif
 	kfree (av7110);
-
 	saa->ext_priv = NULL;
-	av7110_num--;
-	
+
 	return 0;
 }
 
@@ -4858,7 +4929,7 @@
 {
 	struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
 
-	DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
+//	DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
 
 	if (*isr & MASK_19)
 		tasklet_schedule (&av7110->debi_tasklet);
@@ -4887,7 +4958,7 @@
 static struct saa7146_standard analog_standard[] = {
 	{
 		.name	= "PAL", 	.id		= V4L2_STD_PAL_BG,
-		.v_offset	= 0x18,	.v_field 	= 288,		.v_calc	= 576,
+		.v_offset	= 0x18 /* 0 */ ,	.v_field 	= 288,		.v_calc	= 576,
 		.h_offset	= 0x08,	.h_pixels 	= 708,		.h_calc	= 709,
 		.v_max_out	= 576,	.h_max_out	= 768,
 	}, {
@@ -4975,7 +5046,7 @@
 	.inputs		= 1,
 	.audios 	= 1,
 	.capabilities	= 0,
-	.flags		= SAA7146_EXT_SWAP_ODD_EVEN,
+	.flags		= 0, 
 
 	.stds		= &standard[0],
 	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
@@ -5002,6 +5073,7 @@
 
 static struct saa7146_extension av7110_extension = {
 	.name		= "dvb\0",
+	.flags		= SAA7146_I2C_SHORT_DELAY,
 
 	.module		= THIS_MODULE,
 	.pci_tbl	= &pci_tbl[0],
@@ -5054,4 +5126,6 @@
 MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
 MODULE_PARM(hw_sections, "i");
 MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
-
+MODULE_PARM(rgb_on, "i");
+MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
+		" signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
diff -Nru a/drivers/media/dvb/ttpci/av7110.h b/drivers/media/dvb/ttpci/av7110.h
--- a/drivers/media/dvb/ttpci/av7110.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/ttpci/av7110.h	Thu Jan  8 23:00:23 2004
@@ -1,8 +1,6 @@
 #ifndef _AV7110_H_
 #define _AV7110_H_
 
-#define DVB_FIRM_PATH "/lib/DVB/"
-
 #include <linux/interrupt.h>
 #include <linux/socket.h>
 #include <linux/netdevice.h>
@@ -169,7 +167,8 @@
 	DelPIDFilter,
 	Scan,
 	SetDescr,
-        SetIR
+        SetIR,
+        FlushTSQueue
 };
 			
 enum av7110_mpeg_command {
@@ -544,6 +543,18 @@
         int                 dsp_dev;
 
         u32                 ir_config;
+	
+	/* firmware stuff */
+	unsigned int device_initialized;
+
+	unsigned char *bin_fw;
+	unsigned long size_fw;
+
+	unsigned char *bin_dpram;
+	unsigned long size_dpram;
+
+	unsigned char *bin_root;
+	unsigned long size_root;
 };
 
 
diff -Nru a/drivers/media/dvb/ttpci/av7110_firm.h b/drivers/media/dvb/ttpci/av7110_firm.h
--- a/drivers/media/dvb/ttpci/av7110_firm.h	Thu Jan  8 23:00:23 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,28315 +0,0 @@
-
-#include <asm/types.h>
-
-static u8 Dpram [] = {
-	0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, 
-	0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, 
-	0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, 
-	0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x5c, 0xcc, 
-	0x2e, 0x01, 0xcb, 0x40, 0xa5, 0xa5, 0x5a, 0x5a, 
-	0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, 
-	0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x25, 
-	0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, 
-	0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, 
-	0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, 
-	0x0a, 0x00, 0x42, 0x08, 0xd0, 0x29, 0x32, 0x20, 
-	0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, 
-	0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, 
-	0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, 
-	0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, 
-	0x1d, 0x12, 0x48, 0x13, 0x68, 0x00, 0xb4, 0x01, 
-	0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x0f, 
-	0x60, 0x01, 0x48, 0x0d, 0x58, 0x82, 0x48, 0x01, 
-	0x46, 0x86, 0x47, 0x10, 0x2c, 0x00, 0x00, 0xb1, 
-	0xbc, 0x02, 0x48, 0x0b, 0x68, 0x02, 0x23, 0x20, 
-	0x05, 0x1b, 0x40, 0x1a, 0x43, 0x99, 0x43, 0x11, 
-	0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x2e, 0x08, 0x3a, 0xf4, 0x66, 0x00, 0x00, 0x14, 
-	0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x5d, 0xd4, 
-	0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-};
-
-
-static u8 Root [] = {
-	0xb4, 0x90, 0x49, 0x18, 0x1c, 0x0b, 0x4a, 0x18, 
-	0x1a, 0x50, 0x4f, 0x18, 0x1a, 0x79, 0x10, 0x8f, 
-	0x21, 0x00, 0x2f, 0x00, 0xdd, 0x04, 0xcb, 0x10, 
-	0xc2, 0x10, 0x31, 0x01, 0x42, 0xb9, 0xdb, 0xfa, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 
-	0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x01, 0xc8, 0x08, 
-	0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc9, 0x08, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x28, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x2c, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x30, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x34, 
-	0x2e, 0x01, 0xc8, 0x74, 0x2e, 0x01, 0xca, 0x38, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x3c, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x40, 
-	0x2e, 0x01, 0xc8, 0x08, 0x2e, 0x01, 0xca, 0x44, 
-	0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07, 
-	0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38, 
-	0x06, 0x00, 0x21, 0x0b, 0x06, 0x89, 0x4b, 0x43, 
-	0x93, 0x01, 0x42, 0x88, 0xd1, 0x32, 0x08, 0x78, 
-	0xd3, 0x05, 0x1e, 0x78, 0x88, 0x00, 0x70, 0x20, 
-	0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 0x08, 0xb8, 
-	0xd3, 0x0f, 0x2d, 0x02, 0xdb, 0x0d, 0x08, 0x60, 
-	0xd3, 0x06, 0x88, 0x39, 0x0a, 0x09, 0x70, 0x21, 
-	0x88, 0x38, 0x70, 0x60, 0x34, 0x02, 0xe0, 0x02, 
-	0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02, 
-	0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 
-	0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 
-	0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x6a, 
-	0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54, 
-	0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38, 
-	0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, 
-	0xd1, 0xf9, 0xe0, 0x4a, 0x0e, 0x20, 0x06, 0x00, 
-	0x42, 0x88, 0xd1, 0x3f, 0xe0, 0x14, 0x08, 0x60, 
-	0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, 
-	0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, 
-	0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, 
-	0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, 
-	0x80, 0x21, 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 
-	0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6, 
-	0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06, 
-	0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21, 
-	0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x33, 0x19, 0x7f, 
-	0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60, 
-	0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, 
-	0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, 
-	0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, 
-	0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, 
-	0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, 
-	0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b, 
-	0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 
-	0xfb, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfc, 0x50, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x4f, 0x10, 
-	0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, 
-	0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, 
-	0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x54, 
-	0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, 
-	0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, 
-	0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x49, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x1d, 
-	0x24, 0x10, 0x68, 0x3b, 0x2b, 0x00, 0xd1, 0x1a, 
-	0x28, 0x00, 0xd0, 0x18, 0x20, 0xa5, 0x01, 0xc0, 
-	0xf0, 0x05, 0xfb, 0x64, 0x60, 0x38, 0x8a, 0xbf, 
-	0x1c, 0x03, 0x2f, 0x00, 0xd0, 0x0c, 0x2b, 0x00, 
-	0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 
-	0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 0x1c, 0x39, 
-	0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xc7, 0xb0, 0x03, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2b, 0x00, 
-	0xd0, 0xfa, 0x28, 0x00, 0xd1, 0xf8, 0x8a, 0xbd, 
-	0x2d, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 
-	0x1c, 0x29, 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xb2, 
-	0xb0, 0x03, 0x68, 0x38, 0xf0, 0x05, 0xfb, 0x44, 
-	0x20, 0x00, 0x60, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 
-	0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, 
-	0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 
-	0x04, 0x19, 0x0c, 0x09, 0xb0, 0x82, 0x91, 0x00, 
-	0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0x89, 
-	0x4f, 0x89, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd, 
-	0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0x87, 
-	0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3, 
-	0x81, 0xbb, 0x4b, 0x84, 0x42, 0x9e, 0xd1, 0x02, 
-	0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01, 
-	0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01, 
-	0x8a, 0xbb, 0x99, 0x01, 0x42, 0x99, 0xd0, 0x20, 
-	0x68, 0x38, 0x90, 0x02, 0x28, 0x00, 0xd0, 0x1a, 
-	0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, 0x23, 0x10, 
-	0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0a, 0xfb, 0x6a, 
-	0xb0, 0x03, 0x99, 0x01, 0x29, 0x00, 0xd0, 0x0a, 
-	0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 
-	0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 0x68, 0x38, 
-	0xf0, 0x0a, 0xfb, 0x5c, 0xb0, 0x03, 0x99, 0x01, 
-	0x82, 0xb9, 0x4b, 0x6d, 0x42, 0x9c, 0xd0, 0x37, 
-	0xdc, 0x28, 0x2c, 0x00, 0xd0, 0x2e, 0x3b, 0x02, 
-	0x42, 0x9c, 0xd0, 0x29, 0x4b, 0x69, 0x42, 0x9c, 
-	0xd1, 0x00, 0x1c, 0x34, 0x22, 0x00, 0xb4, 0x04, 
-	0x23, 0x00, 0x49, 0x62, 0x20, 0x1c, 0xf0, 0x0a, 
-	0xfc, 0xe3, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, 
-	0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, 
-	0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0b, 0xf8, 0x1c, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfe, 0x94, 
-	0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, 
-	0x25, 0x00, 0xe0, 0x32, 0x4b, 0x55, 0x42, 0x9c, 
-	0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xd9, 
-	0x89, 0x3c, 0xe7, 0xd7, 0x2d, 0x00, 0xd0, 0x01, 
-	0x1c, 0x2c, 0xe7, 0xd3, 0x1c, 0x34, 0xe7, 0xd1, 
-	0x1c, 0x2c, 0xe7, 0xcf, 0x42, 0xac, 0xd1, 0x01, 
-	0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
-	0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29, 
-	0xf0, 0x0a, 0xfc, 0xaa, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 
-	0xf0, 0x0a, 0xfe, 0x66, 0x21, 0x00, 0x20, 0x1f, 
-	0xf0, 0x0b, 0xfb, 0x58, 0x20, 0x01, 0xf0, 0x0d, 
-	0xff, 0x47, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d, 
-	0xff, 0x43, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, 
-	0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, 
-	0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0e, 0xf8, 0x9a, 
-	0x20, 0x1e, 0xf0, 0x0b, 0xf8, 0x97, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x0a, 0xfe, 0x45, 0x82, 0x3e, 
-	0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, 
-	0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0xf0, 0x1c, 0xf9, 0x57, 0x23, 0x01, 
-	0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1c, 0xf9, 0x56, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfd, 0x78, 
-	0x20, 0xff, 0x49, 0x29, 0x68, 0x09, 0x70, 0x08, 
-	0x49, 0x28, 0x48, 0x29, 0x23, 0x1e, 0x22, 0x10, 
-	0xf0, 0x0e, 0xfe, 0xac, 0x48, 0x27, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x1c, 0xf9, 0x3c, 0x4b, 0x24, 0x40, 0x18, 
-	0xf0, 0x1c, 0xf9, 0x3c, 0x22, 0x00, 0xb4, 0x04, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
-	0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, 
-	0xf0, 0x0a, 0xfc, 0x4a, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 
-	0xf0, 0x0a, 0xfe, 0x06, 0x21, 0x00, 0x20, 0x1e, 
-	0xf0, 0x0b, 0xfa, 0xf8, 0x42, 0xac, 0xd0, 0x13, 
-	0x42, 0xb4, 0xd0, 0x11, 0x2c, 0x00, 0xd0, 0x0f, 
-	0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 
-	0x20, 0x1c, 0xf0, 0x0a, 0xfd, 0xf5, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, 
-	0x1c, 0x21, 0xf0, 0x0a, 0xfc, 0x29, 0xb0, 0x01, 
-	0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
-	0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, 
-	0x2e, 0x08, 0x5e, 0x2c, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x5e, 0x58, 
-	0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x04, 0x01, 0x0c, 0x09, 0x23, 0x00, 
-	0x4a, 0x03, 0x1e, 0x50, 0xf7, 0xff, 0xfe, 0xc0, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00, 
-	0xb4, 0x04, 0x04, 0x02, 0x0c, 0x12, 0x23, 0x00, 
-	0x49, 0x03, 0x1e, 0x48, 0xf7, 0xff, 0xfe, 0xb0, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x0b, 
-	0x28, 0x02, 0xd1, 0x02, 0x02, 0x00, 0xf0, 0x0d, 
-	0xff, 0xf1, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80, 
-	0xf0, 0x0d, 0xff, 0xec, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xff, 0xe6, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 
-	0x4c, 0x1b, 0x20, 0x01, 0x04, 0x80, 0x21, 0x00, 
-	0x22, 0x00, 0xc4, 0x86, 0xc4, 0x84, 0x3c, 0x14, 
-	0xf0, 0x05, 0xf9, 0x70, 0x61, 0x60, 0x28, 0x00, 
-	0xd0, 0x06, 0x21, 0x01, 0x04, 0x89, 0x61, 0xe1, 
-	0x18, 0x41, 0x62, 0x20, 0x61, 0xa1, 0xe0, 0x02, 
-	0x61, 0xe7, 0x61, 0xa7, 0x62, 0x27, 0x68, 0x21, 
-	0x00, 0xc9, 0x4a, 0x10, 0x18, 0x89, 0x60, 0x48, 
-	0x20, 0x00, 0x49, 0x0f, 0x4d, 0x0f, 0x00, 0x42, 
-	0x52, 0x8d, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x1d, 0xdb, 0xf8, 0x20, 0x00, 0x1c, 0x39, 
-	0x4c, 0x0b, 0x4f, 0x0c, 0x4b, 0x0c, 0x00, 0x42, 
-	0x52, 0xa5, 0x00, 0x82, 0x50, 0xb9, 0x50, 0x99, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 
-	0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, 
-	0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0xb4, 0xf0, 0xb0, 0x81, 
-	0x49, 0x25, 0xc9, 0x0c, 0x39, 0x08, 0x1a, 0xd2, 
-	0x60, 0x8a, 0xd5, 0x02, 0x32, 0xff, 0x32, 0x01, 
-	0x60, 0x8a, 0x6a, 0x0a, 0x62, 0x8a, 0x68, 0x8f, 
-	0x2f, 0xfe, 0xdb, 0x03, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0x47, 0x70, 0x30, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x4c, 0x1b, 0x69, 0xa6, 0x69, 0x64, 
-	0x2f, 0x3e, 0xdb, 0x24, 0x00, 0xdb, 0x4f, 0x19, 
-	0x19, 0xdb, 0x68, 0x5b, 0x62, 0x4b, 0x93, 0x00, 
-	0x1a, 0x9f, 0x4b, 0x15, 0x69, 0xdd, 0x2f, 0x00, 
-	0xdc, 0x00, 0x19, 0x7f, 0x23, 0x01, 0x03, 0x1b, 
-	0x18, 0xc3, 0x42, 0xbb, 0xdd, 0x0f, 0x18, 0x17, 
-	0x42, 0xb7, 0xdb, 0x09, 0x9a, 0x00, 0x1b, 0x12, 
-	0x2a, 0x00, 0xdc, 0x00, 0x19, 0x52, 0x42, 0x93, 
-	0xdd, 0x11, 0x18, 0x20, 0x62, 0x08, 0xe0, 0x0e, 
-	0x62, 0x0f, 0x1c, 0x14, 0xe0, 0x0b, 0x18, 0x10, 
-	0x62, 0x08, 0x1c, 0x14, 0xe0, 0x07, 0x18, 0x12, 
-	0x42, 0xb2, 0xdb, 0x00, 0x62, 0x0c, 0x6a, 0x0a, 
-	0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, 0x1c, 0x20, 
-	0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, 
-	0x48, 0x03, 0x6a, 0x81, 0x62, 0x01, 0x69, 0x01, 
-	0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x1c, 0xb5, 0xf7, 0x04, 0x05, 
-	0x0c, 0x2d, 0x04, 0x0e, 0x0c, 0x36, 0xb0, 0x81, 
-	0x23, 0x01, 0x03, 0x1b, 0x98, 0x03, 0x42, 0x9e, 
-	0xdd, 0x05, 0x20, 0xff, 0xb0, 0x01, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x24, 
-	0x68, 0xb9, 0x29, 0xff, 0xdb, 0x02, 0x20, 0xff, 
-	0xb0, 0x01, 0xe7, 0xf4, 0x00, 0x69, 0x19, 0x49, 
-	0x00, 0x89, 0x4a, 0x20, 0x18, 0x8c, 0x89, 0x21, 
-	0x29, 0x01, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe9, 0x79, 0x81, 0x91, 0x00, 0x88, 0xa0, 
-	0x08, 0x40, 0x07, 0x80, 0xd1, 0x02, 0x1c, 0x28, 
-	0xf0, 0x05, 0xfb, 0xca, 0x88, 0xa0, 0x23, 0x06, 
-	0x40, 0x18, 0x28, 0x02, 0xd1, 0x09, 0x88, 0xe0, 
-	0x99, 0x00, 0x42, 0x88, 0xd1, 0x05, 0x1c, 0x28, 
-	0xf0, 0x05, 0xfb, 0xbe, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xd1, 0x88, 0xe0, 0x4b, 0x10, 0x42, 0x98, 
-	0xd1, 0x01, 0x99, 0x00, 0x80, 0xe1, 0x68, 0x39, 
-	0x00, 0xc8, 0x4a, 0x0e, 0x52, 0x15, 0x18, 0x80, 
-	0x80, 0x46, 0x9a, 0x03, 0x31, 0x01, 0x60, 0x42, 
-	0x20, 0x00, 0x23, 0xff, 0x60, 0x39, 0x33, 0x01, 
-	0x42, 0x99, 0xd1, 0x00, 0x60, 0x38, 0x68, 0xb9, 
-	0x31, 0x01, 0x60, 0xb9, 0x68, 0xfb, 0x42, 0x99, 
-	0xdd, 0x00, 0x60, 0xf9, 0xb0, 0x01, 0xe7, 0xb2, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x47, 0x78, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x70, 
-	0xb5, 0xf0, 0x20, 0xff, 0xb0, 0x82, 0x49, 0x33, 
-	0x91, 0x01, 0x49, 0x33, 0x8e, 0x89, 0x29, 0x00, 
-	0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x4f, 0x30, 0xcf, 0x0a, 0x3f, 0x08, 
-	0x1a, 0xc9, 0x60, 0xb9, 0x1c, 0x0a, 0xd5, 0x02, 
-	0x1d, 0xd1, 0x31, 0xf9, 0x60, 0xb9, 0x68, 0xb9, 
-	0x29, 0x00, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xda, 0x49, 0x28, 
-	0x5a, 0x8d, 0x18, 0x51, 0x88, 0x4c, 0x68, 0x49, 
-	0x91, 0x00, 0x00, 0xa9, 0x4a, 0x25, 0x58, 0x56, 
-	0x2e, 0x00, 0xd0, 0x07, 0x48, 0x24, 0x58, 0x43, 
-	0x99, 0x00, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x17, 
-	0xff, 0xff, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29, 
-	0x06, 0xed, 0x0e, 0xed, 0x1c, 0xe0, 0x08, 0x82, 
-	0x00, 0x92, 0x98, 0x00, 0x99, 0x01, 0x6a, 0xfb, 
-	0xf0, 0x17, 0xff, 0xec, 0x00, 0x68, 0x19, 0x40, 
-	0x00, 0x80, 0x49, 0x1a, 0x18, 0x40, 0x88, 0x80, 
-	0x21, 0x0c, 0x40, 0x01, 0x29, 0x0c, 0xd1, 0x04, 
-	0x02, 0x29, 0x31, 0x02, 0x04, 0x09, 0x0c, 0x09, 
-	0xe0, 0x03, 0x02, 0x29, 0x31, 0x01, 0x04, 0x09, 
-	0x0c, 0x09, 0x08, 0x40, 0xd3, 0x04, 0x04, 0x08, 
-	0x0c, 0x00, 0x21, 0x01, 0x03, 0xc9, 0x43, 0x01, 
-	0x48, 0x09, 0x85, 0x01, 0x85, 0x44, 0x21, 0x01, 
-	0x02, 0x49, 0x86, 0x81, 0x68, 0x78, 0x28, 0xff, 
-	0xd1, 0x02, 0x20, 0x00, 0x60, 0x78, 0xe0, 0x01, 
-	0x30, 0x01, 0x60, 0x78, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x02, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x1c, 
-	0x2e, 0x08, 0x3b, 0x70, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x47, 0x78, 
-	0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14, 
-	0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05, 
-	0x4c, 0x10, 0x1d, 0x48, 0xd5, 0x00, 0x30, 0x01, 
-	0x10, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 
-	0x29, 0x02, 0xdb, 0xf2, 0x29, 0xe0, 0xdc, 0xf0, 
-	0x22, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x53, 
-	0x5a, 0xee, 0x52, 0xe6, 0x32, 0x01, 0x04, 0x12, 
-	0x0c, 0x12, 0x42, 0x8a, 0xdb, 0xf7, 0x22, 0x04, 
-	0x85, 0x3a, 0x00, 0x49, 0x85, 0x79, 0x21, 0x0f, 
-	0x02, 0x49, 0x86, 0xb9, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, 
-	0xb5, 0xb0, 0x27, 0x00, 0x4d, 0x13, 0x8e, 0xa9, 
-	0x29, 0x00, 0xd0, 0x03, 0x43, 0xf8, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x79, 0x04, 0x09, 
-	0x0c, 0x09, 0x1c, 0x3a, 0x1c, 0x0f, 0x56, 0x81, 
-	0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe, 
-	0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9, 
-	0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff, 
-	0xfb, 0xc3, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, 
-	0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f, 
-	0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x1e, 0x00, 0xb4, 0xf0, 0x4b, 0x1b, 
-	0x8e, 0x9b, 0x2b, 0x00, 0xd0, 0x03, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0xd4, 
-	0xd5, 0x00, 0x34, 0x01, 0x10, 0x64, 0x1c, 0x0d, 
-	0x4f, 0x15, 0x02, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x78, 0x4e, 0x0a, 0x33, 0xd3, 0x07, 0x06, 0x73, 
-	0x0e, 0x5b, 0x18, 0x59, 0x78, 0x89, 0x43, 0x08, 
-	0x04, 0x00, 0x0c, 0x00, 0xe0, 0x03, 0x78, 0x89, 
-	0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x80, 0x38, 
-	0x20, 0x00, 0x2c, 0x00, 0xdd, 0x06, 0x00, 0x41, 
-	0x5a, 0x6b, 0x19, 0xc9, 0x80, 0x4b, 0x30, 0x01, 
-	0x42, 0xa0, 0xdb, 0xf8, 0x20, 0x0b, 0x49, 0x05, 
-	0x85, 0x08, 0x1c, 0x90, 0x85, 0x48, 0x20, 0x01, 
-	0x02, 0x40, 0x86, 0x88, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x02, 0x00, 0x04, 0x02, 0x0c, 0x12, 
-	0x48, 0x0c, 0x6f, 0xc1, 0x20, 0x00, 0x43, 0xc0, 
-	0x29, 0x00, 0xd1, 0x12, 0x49, 0x0a, 0x8e, 0xcb, 
-	0x2b, 0x00, 0xd1, 0x0e, 0x8d, 0x8b, 0x2b, 0x00, 
-	0xd1, 0x0b, 0x48, 0x08, 0x86, 0xc2, 0x23, 0x07, 
-	0x86, 0x83, 0x85, 0x8b, 0x85, 0xca, 0x20, 0x09, 
-	0x02, 0x40, 0x86, 0xc8, 0x20, 0x01, 0x87, 0x88, 
-	0x20, 0x00, 0x47, 0x70, 0x2c, 0x00, 0x1f, 0x80, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
-	0xb5, 0x80, 0x1c, 0x01, 0x4a, 0x0d, 0x8e, 0xd3, 
-	0x20, 0x00, 0x43, 0xc0, 0x2b, 0x00, 0xd1, 0x12, 
-	0x8d, 0x93, 0x2b, 0x07, 0xd1, 0x0f, 0x8d, 0xd7, 
-	0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a, 
-	0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06, 
-	0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb, 
-	0xf0, 0x17, 0xfe, 0xdc, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c, 
-	0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x4e, 0x5f, 0x78, 0x30, 
-	0x49, 0x5f, 0x91, 0x02, 0x78, 0x09, 0x42, 0x88, 
-	0xd1, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x4d, 0x5b, 0x4b, 0x5c, 
-	0x93, 0x01, 0x1d, 0xd9, 0x31, 0x19, 0x7d, 0x0a, 
-	0x00, 0x53, 0x18, 0x9b, 0x01, 0x1b, 0x19, 0x5b, 
-	0x78, 0xdc, 0x1c, 0x1f, 0x79, 0x1b, 0x42, 0x9c, 
-	0xd1, 0x04, 0x79, 0x7b, 0x07, 0xdb, 0x0f, 0xdb, 
-	0x2b, 0x01, 0xd1, 0x06, 0x7d, 0x0b, 0x93, 0x00, 
-	0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 0x75, 0x0a, 
-	0xe0, 0x08, 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 
-	0x75, 0x0a, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x08, 0xdb, 0xe0, 0x28, 0x08, 0xd1, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x00, 0x00, 0x43, 0x18, 0x18, 0x01, 0x00, 
-	0x19, 0x47, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 
-	0x89, 0x84, 0x23, 0x01, 0x03, 0x1b, 0x42, 0x9c, 
-	0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0, 
-	0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92, 
-	0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x17, 
-	0xfe, 0x79, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, 
-	0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01, 
-	0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0, 
-	0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1, 
-	0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0x81, 
-	0x1b, 0x09, 0x81, 0x81, 0x78, 0xf8, 0x00, 0xc0, 
-	0x19, 0xc0, 0x89, 0x81, 0x29, 0x00, 0xd1, 0x4f, 
-	0x24, 0x00, 0x81, 0xc4, 0x78, 0xf9, 0x6a, 0xb8, 
-	0x18, 0x40, 0x73, 0x04, 0x78, 0xf8, 0x30, 0x01, 
-	0x07, 0x80, 0x0f, 0x80, 0x70, 0xf8, 0x78, 0x30, 
-	0x30, 0x01, 0x70, 0x30, 0x78, 0xf8, 0x79, 0x39, 
-	0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02, 
-	0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc, 
-	0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39, 
-	0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfe, 0xac, 
-	0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0xa9, 0x20, 0x00, 
-	0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, 
-	0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 
-	0x28, 0x08, 0xd1, 0x1d, 0x70, 0x34, 0x99, 0x02, 
-	0x70, 0x0c, 0xe0, 0x19, 0x07, 0xc0, 0x0f, 0xc0, 
-	0x28, 0x01, 0xd1, 0x15, 0x70, 0xfc, 0x71, 0x3c, 
-	0x21, 0x06, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x41, 
-	0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49, 
-	0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01, 
-	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
-	0x6a, 0xbb, 0xf0, 0x0a, 0xfb, 0x07, 0xb0, 0x02, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xbc, 
-	0x2e, 0x08, 0x03, 0xb8, 0x2e, 0x08, 0x44, 0x68, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, 
-	0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, 
-	0x02, 0x80, 0xf0, 0x04, 0xfe, 0x87, 0x60, 0x38, 
-	0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, 
-	0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, 
-	0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, 
-	0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, 
-	0x2e, 0x02, 0x5c, 0x9c, 0x2e, 0x02, 0x5c, 0xa0, 
-	0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, 
-	0xfe, 0x73, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x36, 0x8e, 0x90, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x48, 0x33, 0x68, 0x01, 
-	0x4e, 0x33, 0x68, 0x30, 0x1a, 0x0f, 0xd1, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2f, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, 
-	0x18, 0xff, 0x4c, 0x2e, 0x6b, 0xa1, 0x1c, 0x4a, 
-	0x49, 0x2d, 0x68, 0x09, 0x42, 0x8a, 0xd9, 0x13, 
-	0x23, 0x2f, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x4a, 0x23, 0x8e, 0xd2, 0x2a, 0x00, 0xd0, 0x07, 
-	0x23, 0xeb, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x63, 0xa1, 0x4b, 0x22, 0x42, 0x9f, 0xdd, 0x00, 
-	0x1c, 0x1f, 0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0d, 
-	0x49, 0x1f, 0x91, 0x01, 0x42, 0xaf, 0xdd, 0x14, 
-	0x1b, 0x7a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 
-	0x18, 0x08, 0x1c, 0x2a, 0x49, 0x1b, 0x6b, 0x23, 
-	0xf0, 0x17, 0xfd, 0x84, 0x4b, 0x19, 0x18, 0xe9, 
-	0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x23, 
-	0xf0, 0x17, 0xfd, 0x7c, 0x9a, 0x00, 0x60, 0x32, 
-	0xe0, 0x0e, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 
-	0x1c, 0x3a, 0x49, 0x12, 0x6b, 0x23, 0xf0, 0x17, 
-	0xfd, 0x71, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 
-	0x02, 0x80, 0xf0, 0x17, 0xfd, 0x75, 0x60, 0x31, 
-	0x20, 0x12, 0x4a, 0x05, 0x85, 0x10, 0x85, 0x57, 
-	0x20, 0x01, 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x5c, 0x98, 
-	0x2e, 0x02, 0x5c, 0x94, 0x2e, 0x08, 0x00, 0x1c, 
-	0x2e, 0x08, 0x05, 0xb0, 0x00, 0x00, 0x0f, 0x6c, 
-	0x2e, 0x02, 0x5c, 0x90, 0x2c, 0x00, 0x02, 0x00, 
-	0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x49, 0x03, 
-	0x60, 0x08, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70, 
-	0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, 
-	0x2e, 0x02, 0x5c, 0x9c, 0x2a, 0x00, 0xd0, 0x05, 
-	0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01, 
-	0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3, 
-	0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80, 
-	0x1c, 0x0f, 0x49, 0x3d, 0x58, 0x08, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x03, 
-	0x88, 0x45, 0x30, 0x04, 0xc8, 0x41, 0x1d, 0xf2, 
-	0x32, 0xb9, 0x1a, 0x14, 0x23, 0x01, 0x03, 0x1b, 
-	0x42, 0x9d, 0xdd, 0x03, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xec, 0x19, 0x79, 0x91, 0x00, 
-	0x4b, 0x30, 0x93, 0x02, 0x2c, 0xbc, 0xdc, 0x01, 
-	0x2c, 0x00, 0xda, 0x07, 0x9b, 0x02, 0x68, 0x18, 
-	0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
-	0xf0, 0x17, 0xfd, 0x00, 0xe0, 0x44, 0x2d, 0x00, 
-	0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, 
-	0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, 
-	0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, 
-	0xf0, 0x17, 0xfc, 0xe8, 0x68, 0x36, 0xe0, 0x05, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
-	0xf0, 0x17, 0xfc, 0xe0, 0x19, 0x3f, 0x1b, 0x2d, 
-	0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52, 
-	0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01, 
-	0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2, 
-	0x0e, 0xd2, 0x1d, 0x31, 0x2a, 0x12, 0xd1, 0x06, 
-	0x78, 0xca, 0x0a, 0x12, 0xd2, 0x03, 0x78, 0x89, 
-	0x29, 0x09, 0xd1, 0x00, 0x38, 0x01, 0x1d, 0xf1, 
-	0x31, 0xb9, 0x1a, 0x0c, 0x2c, 0xbc, 0xdc, 0x01, 
-	0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x00, 0x58, 
-	0x2e, 0x08, 0x5d, 0xc4, 0xb4, 0xf0, 0x68, 0x42, 
-	0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16, 
-	0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51, 
-	0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92, 
-	0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 
-	0xe0, 0x5b, 0x68, 0x21, 0x79, 0x8b, 0x93, 0x00, 
-	0x1d, 0x0f, 0x18, 0x59, 0x78, 0x45, 0x00, 0xeb, 
-	0x1b, 0x5b, 0x00, 0x9b, 0x4d, 0x2b, 0x68, 0x2d, 
-	0x19, 0x5b, 0x78, 0x9b, 0x06, 0xdb, 0x0e, 0xdb, 
-	0x2b, 0x12, 0xd1, 0x31, 0x1d, 0xe3, 0x33, 0xb9, 
-	0x1b, 0x9b, 0x06, 0x1d, 0x0e, 0x2d, 0x78, 0xfe, 
-	0x0a, 0x33, 0xd2, 0x29, 0x2d, 0x0e, 0xda, 0x27, 
-	0x9b, 0x00, 0x2b, 0x09, 0xdd, 0x06, 0x79, 0x3b, 
-	0x18, 0xfb, 0x33, 0x05, 0x42, 0x8b, 0xd0, 0x1f, 
-	0x39, 0x01, 0xe0, 0x1d, 0x9b, 0x00, 0x2b, 0x09, 
-	0xd1, 0x1a, 0x79, 0x3b, 0x2b, 0x00, 0xd0, 0x01, 
-	0x39, 0x01, 0xe0, 0x15, 0x39, 0x01, 0x1d, 0xe3, 
-	0x33, 0xb8, 0x42, 0x93, 0xd9, 0x09, 0x78, 0x53, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x33, 0x03, 0x04, 0x1b, 0x0c, 0x1b, 
-	0xe0, 0x03, 0x78, 0x4b, 0x33, 0x03, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x42, 0x9d, 0xda, 0x00, 0x31, 0x01, 
-	0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x0b, 
-	0x78, 0x52, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 
-	0x04, 0x12, 0x0c, 0x12, 0x78, 0x09, 0x18, 0x51, 
-	0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x08, 
-	0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 
-	0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 
-	0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, 
-	0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x43, 0x70, 0x48, 0x01, 0x68, 0x80, 
-	0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, 
-	0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 
-	0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82, 
-	0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf, 
-	0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64, 
-	0x49, 0x4f, 0x68, 0x09, 0xd1, 0x32, 0x1c, 0x1f, 
-	0xd5, 0x04, 0x42, 0x7f, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x42, 0x7f, 0xe0, 0x01, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x2f, 0x00, 0xd1, 0x27, 0x2b, 0x10, 0xd0, 0x16, 
-	0xdc, 0x05, 0x2b, 0x00, 0xd0, 0x5a, 0x2b, 0x08, 
-	0xd1, 0x59, 0x5c, 0x88, 0xe0, 0x81, 0x2b, 0x18, 
-	0xd0, 0x13, 0x2b, 0x20, 0xd1, 0x53, 0x5c, 0x88, 
-	0x06, 0x00, 0x18, 0x89, 0x78, 0x4a, 0x04, 0x12, 
-	0x18, 0x80, 0x78, 0x8a, 0x02, 0x12, 0x18, 0x80, 
-	0x78, 0xc9, 0x18, 0x40, 0xe0, 0x71, 0x5c, 0x88, 
-	0x02, 0x00, 0x18, 0x89, 0x78, 0x49, 0x18, 0x40, 
-	0xe0, 0x6b, 0x5c, 0x88, 0x04, 0x00, 0x18, 0x89, 
-	0x78, 0x4a, 0x02, 0x12, 0x18, 0x80, 0x78, 0x89, 
-	0x18, 0x40, 0xe0, 0x62, 0x2b, 0x00, 0xd1, 0x03, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x9f, 0x00, 0x08, 0xfd, 0x07, 0x7f, 0x0f, 0x7f, 
-	0x2b, 0x20, 0xdc, 0x56, 0x1a, 0xae, 0x4d, 0x2f, 
-	0x2e, 0x05, 0xd2, 0x52, 0xa3, 0x01, 0x5d, 0x9b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x02, 0x09, 0x14, 0x25, 
-	0x38, 0x00, 0x5c, 0x88, 0x5d, 0x29, 0x40, 0x08, 
-	0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x44, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 
-	0x02, 0x12, 0x5c, 0x08, 0x18, 0x80, 0x21, 0x08, 
-	0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x39, 0x1c, 0x50, 
-	0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, 
-	0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, 
-	0x5c, 0xc9, 0x18, 0x08, 0x21, 0x08, 0x1b, 0xc9, 
-	0x40, 0xc8, 0xe0, 0x2a, 0xe0, 0x29, 0xe0, 0x28, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 
-	0x02, 0x12, 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 
-	0x02, 0x00, 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 
-	0x02, 0x00, 0x5c, 0x89, 0x18, 0x08, 0x21, 0x08, 
-	0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x15, 0x1c, 0x50, 
-	0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, 
-	0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, 
-	0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 0x02, 0x03, 
-	0x1c, 0x50, 0x5c, 0x8a, 0x18, 0xd2, 0x40, 0xba, 
-	0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 
-	0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x43, 0x70, 0x2e, 0x08, 0x00, 0x60, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, 
-	0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, 
-	0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, 
-	0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, 
-	0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1b, 0xfb, 0x16, 
-	0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xde, 
-	0xf0, 0x1b, 0xfa, 0xd4, 0x4b, 0x23, 0x40, 0x18, 
-	0xf0, 0x1b, 0xfa, 0xd4, 0xf0, 0x1b, 0xfb, 0x40, 
-	0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, 
-	0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, 
-	0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0f, 
-	0xf8, 0xd5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, 
-	0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, 
-	0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0f, 0xf9, 0x36, 
-	0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, 
-	0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0f, 
-	0xf9, 0x37, 0xf0, 0x0f, 0xf9, 0x2b, 0x28, 0x00, 
-	0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0f, 
-	0xf8, 0xb9, 0xf0, 0x1b, 0xfa, 0xdf, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xa7, 0xf0, 0x1b, 
-	0xfa, 0x9d, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x9c, 0xf0, 0x1b, 0xfb, 0x08, 
-	0x46, 0x68, 0xf0, 0x0f, 0xf8, 0xf3, 0x98, 0x04, 
-	0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 
-	0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, 
-	0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1b, 0xfa, 0xba, 
-	0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x82, 
-	0xf0, 0x1b, 0xfa, 0x78, 0x4b, 0x2f, 0x40, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x78, 0xf0, 0x1b, 0xfa, 0xe4, 
-	0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, 
-	0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, 
-	0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0f, 
-	0xf8, 0x79, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, 
-	0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, 
-	0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, 
-	0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, 
-	0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0f, 0xf8, 0xd2, 
-	0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, 
-	0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 
-	0xa9, 0x0a, 0xf0, 0x0f, 0xf8, 0xd1, 0xe0, 0x03, 
-	0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0f, 0xf8, 0xcc, 
-	0xf0, 0x0f, 0xf8, 0xc0, 0x28, 0x00, 0xd1, 0xfb, 
-	0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0f, 
-	0xf8, 0x4d, 0xf0, 0x1b, 0xfa, 0x73, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x3b, 0xf0, 0x1b, 
-	0xfa, 0x31, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x1b, 0xfa, 0x30, 0xf0, 0x1b, 0xfa, 0x9c, 
-	0x46, 0x68, 0xf0, 0x0f, 0xf8, 0x87, 0x98, 0x01, 
-	0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, 
-	0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 
-	0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, 
-	0x6e, 0x00, 0x17, 0x00, 0xb5, 0xb0, 0x4f, 0x41, 
-	0x69, 0x38, 0x4c, 0x41, 0x28, 0x00, 0xd0, 0x07, 
-	0x20, 0x03, 0x60, 0x20, 0x69, 0x38, 0x38, 0x01, 
-	0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x02, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x04, 
-	0x60, 0x21, 0x69, 0x78, 0x38, 0x01, 0x61, 0x78, 
-	0xd1, 0xf3, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x20, 
-	0x38, 0x01, 0x60, 0xf8, 0x4a, 0x35, 0xd0, 0x08, 
-	0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 0x7f, 0xd2, 
-	0x1e, 0x45, 0x40, 0xea, 0x07, 0xd2, 0x0f, 0xd2, 
-	0xe0, 0x09, 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 
-	0x7f, 0xd2, 0x4b, 0x2f, 0x5c, 0x9a, 0x23, 0x01, 
-	0x40, 0x5a, 0x06, 0x12, 0x0e, 0x12, 0x23, 0x01, 
-	0x2a, 0x00, 0xd0, 0x02, 0x61, 0x79, 0x61, 0x3b, 
-	0xe0, 0x01, 0x61, 0x39, 0x61, 0x7b, 0x28, 0x00, 
-	0xd1, 0xcf, 0x68, 0xb8, 0x30, 0x01, 0x60, 0xb8, 
-	0x23, 0x09, 0x68, 0x7a, 0x1c, 0x01, 0x42, 0x90, 
-	0xdc, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x20, 0x1c, 0x55, 0x42, 0x8d, 
-	0xd1, 0x03, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x95, 0x42, 0x8d, 0xd1, 0x0d, 
-	0x7e, 0x3d, 0x2d, 0xff, 0xd0, 0x0a, 0x2d, 0x00, 
-	0xd0, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x19, 0x61, 0x38, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x32, 0x03, 0x42, 0x8a, 
-	0xd1, 0x04, 0x20, 0x22, 0x61, 0x78, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x69, 0xf9, 0x60, 0x21, 
-	0x68, 0x79, 0x68, 0xba, 0x31, 0x04, 0x42, 0x91, 
-	0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03, 
-	0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x04, 0xf8, 0xac, 0x20, 0x00, 0x60, 0x38, 
-	0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, 
-	0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x7c, 
-	0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b, 
-	0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14, 
-	0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a, 
-	0x2a, 0x00, 0xd1, 0xfc, 0x22, 0x01, 0x60, 0x0a, 
-	0x2b, 0x0a, 0xdd, 0x00, 0x23, 0x0a, 0x22, 0x00, 
-	0x4f, 0x0e, 0x2b, 0x00, 0xdd, 0x05, 0x00, 0x55, 
-	0x5b, 0x45, 0x54, 0xbd, 0x32, 0x01, 0x42, 0x9a, 
-	0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa, 
-	0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20, 
-	0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8, 
-	0x49, 0x05, 0x20, 0x32, 0xf0, 0x04, 0xf8, 0x48, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x7c, 
-	0x2e, 0x00, 0x17, 0x01, 0xb5, 0x80, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, 
-	0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, 
-	0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 
-	0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, 
-	0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, 
-	0xfb, 0x17, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, 
-	0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, 
-	0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, 
-	0x2e, 0x08, 0x47, 0x78, 0xb5, 0xf0, 0xb0, 0xb3, 
-	0xa8, 0x01, 0xf0, 0x0f, 0xfd, 0xc9, 0x49, 0x61, 
-	0x68, 0x0f, 0x68, 0x4d, 0x68, 0x8c, 0x03, 0x20, 
-	0x05, 0x2a, 0x0d, 0x12, 0x43, 0x10, 0x04, 0x00, 
-	0x0c, 0x00, 0x4b, 0x5d, 0x8e, 0x9a, 0x2a, 0x00, 
-	0xd1, 0x16, 0x89, 0xda, 0x42, 0x90, 0xd0, 0x01, 
-	0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x89, 0x9e, 
-	0x42, 0xb7, 0xd0, 0x01, 0x26, 0x01, 0xe0, 0x00, 
-	0x26, 0x00, 0x43, 0x32, 0xd0, 0x08, 0x81, 0x9f, 
-	0x81, 0xd8, 0x20, 0x00, 0x85, 0x58, 0x20, 0x0d, 
-	0x85, 0x18, 0x20, 0x01, 0x02, 0x40, 0x86, 0x98, 
-	0x68, 0xce, 0x69, 0x08, 0x90, 0x00, 0x1c, 0x38, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xfa, 0x72, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfb, 0x8d, 0xa0, 0x4b, 
-	0x22, 0x00, 0x21, 0x11, 0xf0, 0x04, 0xff, 0xc2, 
-	0x22, 0x0a, 0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05, 
-	0xf8, 0x1f, 0x22, 0x14, 0x21, 0x11, 0x1c, 0x38, 
-	0xf0, 0x05, 0xf8, 0x1a, 0x22, 0x1e, 0x21, 0x11, 
-	0x1c, 0x28, 0xf0, 0x05, 0xf8, 0x15, 0x22, 0x28, 
-	0x21, 0x11, 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x10, 
-	0x22, 0x32, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05, 
-	0xf8, 0x0b, 0x22, 0x3c, 0x21, 0x11, 0x98, 0x00, 
-	0xf0, 0x05, 0xf8, 0x06, 0xa0, 0x3b, 0x22, 0x00, 
-	0x21, 0x13, 0xf0, 0x04, 0xff, 0x9f, 0x22, 0x0a, 
-	0x21, 0x13, 0x4f, 0x35, 0x8d, 0x78, 0xf0, 0x04, 
-	0xff, 0xfb, 0xa0, 0x38, 0x22, 0x14, 0x21, 0x13, 
-	0xf0, 0x04, 0xff, 0x94, 0x22, 0x1e, 0x21, 0x13, 
-	0x8d, 0xf8, 0xf0, 0x04, 0xff, 0xf1, 0xa0, 0x35, 
-	0x22, 0x00, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x8a, 
-	0x22, 0x0a, 0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04, 
-	0xff, 0xe7, 0xa0, 0x32, 0x22, 0x14, 0x21, 0x14, 
-	0xf0, 0x04, 0xff, 0x80, 0x22, 0x1e, 0x21, 0x14, 
-	0x8e, 0xf8, 0xf0, 0x04, 0xff, 0xdd, 0xa0, 0x2f, 
-	0x22, 0x28, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x76, 
-	0x22, 0x32, 0x21, 0x14, 0x48, 0x2e, 0x6f, 0xc0, 
-	0xf0, 0x04, 0xff, 0xd2, 0xa0, 0x2d, 0x22, 0x00, 
-	0x21, 0x15, 0xf0, 0x04, 0xff, 0x6b, 0x22, 0x0a, 
-	0x21, 0x15, 0x8d, 0x38, 0xf0, 0x04, 0xff, 0xc8, 
-	0xa0, 0x2b, 0x22, 0x14, 0x21, 0x15, 0xf0, 0x04, 
-	0xff, 0x61, 0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8, 
-	0xf0, 0x04, 0xff, 0xbe, 0xa0, 0x29, 0x22, 0x00, 
-	0x21, 0x10, 0xf0, 0x04, 0xff, 0x57, 0xf0, 0x0f, 
-	0xfe, 0xf1, 0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04, 
-	0xff, 0xb3, 0xa0, 0x26, 0x22, 0x14, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x4c, 0x22, 0x1e, 0x21, 0x10, 
-	0x27, 0x33, 0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04, 
-	0xff, 0xa7, 0xa0, 0x22, 0x22, 0x28, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x40, 0xf0, 0x0f, 0xfe, 0xda, 
-	0x6d, 0x79, 0x1a, 0x08, 0x22, 0x32, 0x21, 0x10, 
-	0xf0, 0x04, 0xff, 0x9a, 0xb0, 0x33, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0c, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x73, 0x74, 0x61, 0x74, 
-	0x73, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x6c, 0x65, 
-	0x6e, 0x3a, 0x00, 0x00, 0x74, 0x78, 0x6c, 0x65, 
-	0x6e, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x62, 0x75, 
-	0x66, 0x66, 0x3a, 0x00, 0x74, 0x78, 0x62, 0x75, 
-	0x66, 0x66, 0x3a, 0x00, 0x69, 0x66, 0x5f, 0x75, 
-	0x73, 0x65, 0x64, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0x80, 0x72, 0x78, 0x73, 0x74, 
-	0x61, 0x74, 0x65, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x74, 0x78, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 
-	0x00, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x64, 0x63, 
-	0x75, 0x72, 0x3a, 0x00, 0x76, 0x69, 0x64, 0x62, 
-	0x75, 0x66, 0x3a, 0x00, 0x6f, 0x73, 0x64, 0x3a, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x25, 0x00, 
-	0x20, 0x00, 0x49, 0x19, 0x81, 0xc8, 0x81, 0x88, 
-	0x4e, 0x18, 0x4c, 0x19, 0x4f, 0x19, 0x68, 0x30, 
-	0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, 
-	0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x16, 
-	0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x15, 
-	0x64, 0x08, 0xf0, 0x01, 0xfc, 0x57, 0xf0, 0x02, 
-	0xf9, 0x6b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, 
-	0x48, 0x11, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, 
-	0x20, 0x0c, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x9a, 
-	0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xd6, 
-	0x20, 0x32, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x92, 
-	0x42, 0x85, 0xd0, 0xd8, 0x1c, 0x05, 0xf0, 0x00, 
-	0xfe, 0x39, 0x20, 0x00, 0x60, 0x38, 0xe7, 0xd2, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x5e, 0x38, 
-	0x2e, 0x08, 0x05, 0xb0, 0x2e, 0x08, 0x01, 0x88, 
-	0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, 
-	0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0xf0, 0x27, 0x00, 
-	0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e, 
-	0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28, 
-	0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01, 
-	0xf0, 0x08, 0xfa, 0x30, 0x22, 0xff, 0x21, 0x64, 
-	0x20, 0x01, 0x32, 0xf5, 0xf0, 0x08, 0xfa, 0xf2, 
-	0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41, 
-	0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11, 
-	0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00, 
-	0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01, 
-	0x1c, 0x23, 0xf0, 0x08, 0xfd, 0x50, 0x4e, 0x1e, 
-	0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x80, 
-	0xf0, 0x03, 0xff, 0x7e, 0x28, 0x28, 0xd9, 0x10, 
-	0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, 
-	0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, 
-	0xf0, 0x17, 0xf8, 0x40, 0x21, 0x64, 0x1d, 0xc2, 
-	0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x08, 
-	0xfa, 0xc5, 0xf0, 0x01, 0xfb, 0xe7, 0xf0, 0x02, 
-	0xf8, 0xfb, 0xf0, 0x03, 0xff, 0x65, 0x1c, 0x01, 
-	0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x17, 0xf8, 0x2e, 
-	0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, 
-	0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, 
-	0xd3, 0x06, 0x20, 0x01, 0xf0, 0x08, 0xf9, 0xce, 
-	0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xc7, 0x20, 0x00, 
-	0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0x5e, 0x00, 
-	0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48, 
-	0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00, 
-	0x48, 0x07, 0x81, 0x07, 0xf0, 0x03, 0xfd, 0x5e, 
-	0xf7, 0xff, 0xff, 0x88, 0xf0, 0x00, 0xf8, 0xce, 
-	0xf0, 0x05, 0xfe, 0xfe, 0xf7, 0xff, 0xff, 0x3e, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x4d, 0x29, 
-	0x68, 0x01, 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 
-	0x68, 0x41, 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 
-	0x00, 0x89, 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 
-	0x05, 0x89, 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 
-	0x49, 0x21, 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 
-	0x60, 0x0e, 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 
-	0xc8, 0x40, 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 
-	0xd3, 0xfa, 0x23, 0x00, 0x49, 0x1b, 0x65, 0x8b, 
-	0x20, 0x00, 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 
-	0x64, 0x8d, 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 
-	0x48, 0x17, 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 
-	0x60, 0x3b, 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 
-	0x4a, 0x14, 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 
-	0x33, 0x01, 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 
-	0x42, 0x91, 0xdb, 0xf6, 0x48, 0x10, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 
-	0x20, 0x33, 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 
-	0x65, 0x81, 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 
-	0x66, 0x41, 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0f, 0xf9, 0xc9, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 
-	0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, 
-	0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, 
-	0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
-	0xf0, 0x0f, 0xfe, 0x04, 0x48, 0x08, 0x21, 0x40, 
-	0xf0, 0x0f, 0xfa, 0xd4, 0x20, 0x01, 0x21, 0x35, 
-	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
-	0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, 
-	0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x01, 0xcc, 0x90, 0x72, 0x00, 0x01, 0x00, 
-	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, 
-	0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, 
-	0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, 
-	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x43, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, 
-	0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 
-	0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, 
-	0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, 
-	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x1f, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, 
-	0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0xb5, 0x80, 0x4b, 0x09, 
-	0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x10, 
-	0xf8, 0x53, 0x20, 0x0b, 0xf0, 0x10, 0xf9, 0x75, 
-	0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, 
-	0xff, 0x45, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc0, 
-	0x2e, 0x08, 0x01, 0xd0, 0xb5, 0xb0, 0x25, 0x00, 
-	0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30, 
-	0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29, 
-	0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x23, 0x2d, 
-	0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x13, 0x23, 0x0b, 
-	0x01, 0x9b, 0x42, 0x9f, 0xd0, 0x0f, 0x23, 0xff, 
-	0x33, 0xe1, 0x42, 0x9f, 0xd0, 0x0b, 0x23, 0xff, 
-	0x33, 0x61, 0x42, 0x9f, 0xd0, 0x07, 0x23, 0x21, 
-	0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x03, 0x23, 0x11, 
-	0x01, 0x5b, 0x42, 0x9f, 0xd1, 0x08, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x9c, 0xd0, 0x09, 0x08, 0x5b, 
-	0x42, 0x9c, 0xd0, 0x06, 0x2c, 0xf0, 0xd0, 0x04, 
-	0x25, 0x01, 0xe0, 0x02, 0x20, 0x01, 0xf0, 0x00, 
-	0xf8, 0x27, 0x4f, 0x12, 0x6c, 0x78, 0x42, 0x85, 
-	0xd0, 0x1c, 0x1d, 0xfb, 0x33, 0x35, 0x2d, 0x00, 
-	0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03, 
-	0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04, 
-	0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, 
-	0xf0, 0x0a, 0xfc, 0x4c, 0x6a, 0xb8, 0x1c, 0x29, 
-	0xb0, 0x04, 0xf0, 0x0b, 0xfd, 0x9b, 0xe0, 0x04, 
-	0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x0a, 
-	0xff, 0x51, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 
-	0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, 
-	0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, 
-	0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, 
-	0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, 
-	0x6a, 0xa8, 0xf0, 0x0a, 0xff, 0x33, 0x71, 0x37, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0f, 0xf8, 0xc4, 
-	0x20, 0x00, 0xf0, 0x0c, 0xfb, 0xc5, 0x20, 0x1f, 
-	0xf0, 0x09, 0xfc, 0x5a, 0x26, 0x03, 0x02, 0x76, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, 
-	0x1c, 0x33, 0xf0, 0x09, 0xfa, 0xd1, 0x20, 0x1e, 
-	0xf0, 0x09, 0xfd, 0x18, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x09, 
-	0xfa, 0xc7, 0x1c, 0x39, 0x27, 0x1c, 0x48, 0x3e, 
-	0x26, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, 
-	0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xc3, 0xab, 0x00, 
-	0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9f, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0f, 
-	0xfc, 0xe5, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, 
-	0xf0, 0x0f, 0xf9, 0xb4, 0xab, 0x00, 0x70, 0x1c, 
-	0x70, 0x5c, 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xfc, 0xd6, 
-	0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xa6, 
-	0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, 
-	0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x08, 0xf0, 0x0f, 0xfc, 0xc7, 0xe0, 0x0d, 
-	0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0f, 0xf9, 0x96, 
-	0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9e, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
-	0xf0, 0x0f, 0xfc, 0xb8, 0x20, 0x01, 0x21, 0x35, 
-	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
-	0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, 
-	0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, 
-	0x21, 0x1e, 0xf0, 0x0f, 0xfd, 0x0f, 0x48, 0x15, 
-	0xf0, 0x0c, 0xfa, 0xd0, 0x20, 0x00, 0xf0, 0x0c, 
-	0xfb, 0x41, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, 
-	0x20, 0x00, 0xf0, 0x03, 0xfb, 0x3f, 0x20, 0x01, 
-	0xf0, 0x0c, 0xfb, 0x46, 0x4a, 0x0e, 0xb4, 0x04, 
-	0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, 
-	0xf7, 0xfe, 0xfb, 0x4e, 0x21, 0x00, 0x20, 0x0d, 
-	0xb0, 0x01, 0xf0, 0x0f, 0xf8, 0x35, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xd0, 
-	0x2e, 0x02, 0x12, 0xfc, 0x2e, 0x01, 0xcc, 0x90, 
-	0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20, 
-	0x42, 0x87, 0xd0, 0x19, 0x20, 0x00, 0x2f, 0x03, 
-	0xd1, 0x02, 0x21, 0x01, 0x61, 0x61, 0xe0, 0x00, 
-	0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29, 
-	0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04, 
-	0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00, 
-	0xf0, 0x0f, 0xfb, 0x02, 0x69, 0x61, 0x1c, 0x28, 
-	0xb0, 0x01, 0xf0, 0x10, 0xfb, 0xa9, 0x62, 0x27, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 
-	0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, 
-	0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, 
-	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, 
-	0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, 
-	0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, 
-	0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xdc, 
-	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, 
-	0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, 
-	0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, 
-	0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, 
-	0xf0, 0x0f, 0xfa, 0xca, 0x69, 0x79, 0xb0, 0x01, 
-	0x48, 0x03, 0xf0, 0x10, 0xfb, 0x71, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x94, 
-	0x2e, 0x08, 0x01, 0xac, 0xb5, 0x80, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, 
-	0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, 
-	0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0f, 0xfa, 0xb0, 
-	0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x10, 
-	0xfb, 0x57, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 
-	0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, 
-	0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, 
-	0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, 
-	0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, 
-	0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x43, 0x88, 
-	0x2e, 0x08, 0x44, 0x08, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x44, 0x28, 0x06, 0x00, 0x0e, 0x00, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, 
-	0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, 
-	0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, 
-	0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe4, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, 
-	0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x23, 
-	0xfb, 0xc1, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xba, 
-	0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, 
-	0x20, 0x00, 0xf0, 0x23, 0xfb, 0xb3, 0x43, 0x2c, 
-	0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08, 
-	0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a, 
-	0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02, 
-	0x4a, 0x29, 0x92, 0x01, 0x4e, 0x29, 0x08, 0x68, 
-	0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, 
-	0xff, 0x69, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 
-	0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 
-	0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, 
-	0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01, 
-	0x50, 0x11, 0xe0, 0x1f, 0x20, 0x02, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x8e, 0x28, 0x00, 0xd1, 0x19, 
-	0x21, 0x00, 0x55, 0xf1, 0x20, 0x01, 0x40, 0xb8, 
-	0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 
-	0xe0, 0x10, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 
-	0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0xe0, 0x09, 
-	0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0xe0, 0x05, 
-	0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 
-	0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x01, 0xe4, 
-	0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26, 
-	0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25, 
-	0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03, 
-	0x4a, 0x25, 0x92, 0x02, 0x48, 0x25, 0x90, 0x01, 
-	0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00, 
-	0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, 
-	0xff, 0x05, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 
-	0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 
-	0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09, 
-	0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x2e, 0x28, 0x00, 0xd1, 0x16, 
-	0x21, 0x00, 0x98, 0x01, 0x55, 0xc1, 0x20, 0x01, 
-	0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 
-	0x60, 0x20, 0xe0, 0x0c, 0x20, 0x01, 0x40, 0xb8, 
-	0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 
-	0xe0, 0x05, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 
-	0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x44, 0x28, 
-	0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x5e, 0x5c, 
-	0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 
-	0xb4, 0xf0, 0x06, 0x03, 0x0e, 0x1b, 0xb0, 0x82, 
-	0x93, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa2, 
-	0xb0, 0x81, 0x48, 0x33, 0x58, 0x80, 0x90, 0x00, 
-	0x28, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, 
-	0xbc, 0xf0, 0x47, 0x70, 0x48, 0x2f, 0x68, 0x00, 
-	0x18, 0x17, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 
-	0x49, 0x2d, 0x68, 0x09, 0x18, 0x41, 0x9b, 0x01, 
-	0x48, 0x2c, 0x4d, 0x2d, 0x95, 0x02, 0x2b, 0x01, 
-	0xd0, 0x2a, 0x2b, 0x02, 0xd1, 0x47, 0x4d, 0x2b, 
-	0x58, 0xab, 0x2b, 0x00, 0xd1, 0x03, 0x20, 0xff, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4b, 
-	0x23, 0x00, 0x50, 0xab, 0x22, 0x00, 0x5c, 0x83, 
-	0x42, 0xa3, 0xd1, 0x07, 0x00, 0x93, 0x9d, 0x02, 
-	0x58, 0xeb, 0x78, 0x5e, 0x1c, 0x5d, 0x23, 0x80, 
-	0x43, 0x9e, 0x70, 0x2e, 0x32, 0x01, 0x06, 0x12, 
-	0x0e, 0x12, 0x2a, 0x20, 0xdb, 0xef, 0x88, 0x08, 
-	0x4b, 0x1d, 0x40, 0x18, 0x80, 0x08, 0x98, 0x00, 
-	0x9b, 0x01, 0x70, 0xc3, 0x68, 0x38, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x60, 0x38, 0xe0, 0x1a, 
-	0x68, 0x3a, 0x4b, 0x18, 0x40, 0x1a, 0x60, 0x3a, 
-	0x9a, 0x00, 0x9b, 0x01, 0x70, 0xd3, 0x23, 0x00, 
-	0x60, 0x8b, 0x70, 0xcb, 0x60, 0xcb, 0x21, 0x00, 
-	0x5c, 0x42, 0x42, 0xa2, 0xd1, 0x06, 0x00, 0x8a, 
-	0x9d, 0x02, 0x58, 0xaa, 0x78, 0x57, 0x23, 0x80, 
-	0x43, 0x3b, 0x70, 0x53, 0x31, 0x01, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x20, 0xdb, 0xf0, 0x20, 0x00, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xbc, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x43, 0x88, 
-	0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 
-	0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32, 
-	0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40, 
-	0x1d, 0xf9, 0x31, 0xb9, 0x1a, 0x09, 0x42, 0x91, 
-	0xda, 0x3d, 0x25, 0x00, 0x1c, 0x18, 0x00, 0xdb, 
-	0x1a, 0x18, 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 
-	0x18, 0xc0, 0x78, 0x80, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x28, 0x12, 0xd1, 0x02, 0x29, 0x0e, 0xda, 0x00, 
-	0x25, 0x01, 0x2a, 0x00, 0xdd, 0x2b, 0x42, 0x8a, 
-	0xdd, 0x05, 0x68, 0x3f, 0x2f, 0x00, 0xd1, 0x02, 
-	0x20, 0xba, 0xbc, 0xf0, 0x47, 0x70, 0x1a, 0x52, 
-	0x79, 0xb9, 0x23, 0xc0, 0x1a, 0x59, 0x79, 0xfb, 
-	0x1d, 0x38, 0x08, 0x5b, 0xd3, 0x01, 0x22, 0x00, 
-	0xe0, 0x16, 0x2d, 0x00, 0xd0, 0x14, 0x42, 0x91, 
-	0xdb, 0x01, 0x31, 0x01, 0xe0, 0x10, 0x1c, 0x4b, 
-	0x42, 0x93, 0xd1, 0x0d, 0x78, 0x85, 0x2d, 0x09, 
-	0xdd, 0x06, 0x79, 0x05, 0x78, 0x80, 0x35, 0x09, 
-	0x42, 0x85, 0xd0, 0x05, 0x1c, 0x19, 0xe0, 0x03, 
-	0x78, 0x80, 0x28, 0x09, 0xd1, 0x00, 0x1c, 0x19, 
-	0x25, 0x00, 0x2a, 0x00, 0xdc, 0xd3, 0x69, 0x21, 
-	0x20, 0x00, 0x1c, 0x0a, 0x42, 0xb9, 0xd0, 0xd4, 
-	0x68, 0x0b, 0x42, 0xbb, 0xd0, 0x08, 0x68, 0x09, 
-	0x29, 0x00, 0xd1, 0x02, 0x20, 0xba, 0xbc, 0xf0, 
-	0x47, 0x70, 0x68, 0x0b, 0x42, 0xbb, 0xd1, 0xf6, 
-	0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2, 
-	0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27, 
-	0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x43, 0x88, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15, 
-	0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09, 
-	0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12, 
-	0x18, 0x8a, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, 
-	0x4b, 0x29, 0x68, 0x1b, 0x18, 0xc9, 0x68, 0x16, 
-	0x23, 0x01, 0x03, 0x5b, 0x43, 0x9e, 0x60, 0x16, 
-	0x68, 0x06, 0x23, 0x03, 0x03, 0x9b, 0x43, 0x9e, 
-	0x60, 0x06, 0x4b, 0x24, 0x42, 0x9c, 0xd0, 0x36, 
-	0x68, 0x06, 0x23, 0x21, 0x43, 0x9e, 0x60, 0x06, 
-	0x68, 0x16, 0x23, 0x07, 0x03, 0x5b, 0x40, 0x33, 
-	0x60, 0x13, 0x23, 0x07, 0x03, 0x5b, 0x43, 0x9c, 
-	0x1c, 0x23, 0x68, 0x14, 0x43, 0x23, 0x60, 0x13, 
-	0x22, 0x00, 0x75, 0x0a, 0x88, 0x0c, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x9c, 0x80, 0x0c, 0x07, 0xab, 
-	0x0f, 0x9b, 0x2b, 0x01, 0xd1, 0x04, 0x88, 0x0c, 
-	0x23, 0x10, 0x43, 0x23, 0x80, 0x0b, 0xe0, 0x03, 
-	0x88, 0x0c, 0x23, 0x10, 0x43, 0x9c, 0x80, 0x0c, 
-	0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, 
-	0x60, 0x01, 0x00, 0xf9, 0x4b, 0x0e, 0x68, 0x1b, 
-	0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d, 
-	0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01, 
-	0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38, 
-	0xf0, 0x0d, 0xff, 0x1a, 0x28, 0x00, 0xd1, 0x00, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0xa0, 
-	0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, 
-	0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a, 
-	0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57, 
-	0x91, 0x03, 0x69, 0x41, 0x91, 0x02, 0x6a, 0x00, 
-	0x1e, 0x43, 0x93, 0x01, 0xe0, 0x0b, 0x29, 0x20, 
-	0xd1, 0x15, 0x4d, 0x53, 0x69, 0x81, 0x91, 0x04, 
-	0x49, 0x52, 0x91, 0x03, 0x69, 0xc1, 0x91, 0x02, 
-	0x6a, 0x40, 0x1e, 0x43, 0x93, 0x01, 0x24, 0x00, 
-	0x4b, 0x4f, 0x93, 0x09, 0x4a, 0x4f, 0x92, 0x08, 
-	0x4b, 0x4f, 0x93, 0x07, 0x4e, 0x4f, 0x96, 0x06, 
-	0x4a, 0x4f, 0x92, 0x05, 0xe0, 0x7a, 0x20, 0xb3, 
-	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x04, 0x00, 0x80, 0x19, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x98, 0x04, 
-	0x00, 0x80, 0x58, 0x28, 0x9a, 0x04, 0x18, 0xaa, 
-	0x00, 0x5b, 0x18, 0xd2, 0x78, 0x12, 0x92, 0x00, 
-	0x22, 0x00, 0x9b, 0x04, 0x18, 0xee, 0x23, 0x01, 
-	0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1a, 0x9a, 0x04, 
-	0x32, 0x01, 0x92, 0x04, 0x9b, 0x01, 0x40, 0x1a, 
-	0x92, 0x04, 0x29, 0x00, 0xd0, 0x56, 0xb0, 0x82, 
-	0x91, 0x01, 0x21, 0x01, 0x9a, 0x02, 0x2a, 0x80, 
-	0xd1, 0x19, 0x22, 0x00, 0x9b, 0x01, 0x40, 0x0b, 
-	0xd0, 0x10, 0x9b, 0x0b, 0x5c, 0x9b, 0x2b, 0xff, 
-	0xd0, 0x0c, 0x9b, 0x0b, 0x5c, 0x9b, 0x93, 0x00, 
-	0x00, 0x91, 0x9a, 0x0a, 0x58, 0x52, 0x00, 0xa1, 
-	0x19, 0xc9, 0x61, 0x0a, 0x1c, 0x61, 0x06, 0x0c, 
-	0x0e, 0x24, 0xe0, 0x1c, 0x00, 0x49, 0x32, 0x01, 
-	0x2a, 0x10, 0xd3, 0xe7, 0xe0, 0x17, 0x22, 0x00, 
-	0x9b, 0x01, 0x40, 0x0b, 0xd0, 0x0f, 0x9b, 0x09, 
-	0x5c, 0x9b, 0x2b, 0xff, 0xd0, 0x0b, 0x93, 0x00, 
-	0x00, 0x93, 0x9e, 0x08, 0x58, 0xf6, 0x00, 0xa3, 
-	0x19, 0xdb, 0x61, 0x1e, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x63, 0x06, 0x1c, 0x0e, 0x24, 0x00, 0x49, 
-	0x32, 0x01, 0x2a, 0x20, 0xd3, 0xe8, 0x2c, 0x00, 
-	0xd0, 0x1b, 0x9b, 0x00, 0x70, 0x7b, 0x60, 0x78, 
-	0x9b, 0x00, 0x00, 0x99, 0x9a, 0x07, 0x58, 0x52, 
-	0x69, 0x51, 0xe0, 0x07, 0x68, 0x09, 0x29, 0x00, 
-	0xd1, 0x04, 0x20, 0xba, 0xb0, 0x0c, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5, 
-	0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1, 
-	0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x0d, 
-	0xff, 0x24, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, 
-	0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, 
-	0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, 
-	0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x90, 
-	0x2e, 0x08, 0x69, 0x90, 0x9e, 0x00, 0x04, 0x98, 
-	0x2e, 0x08, 0x5f, 0xc4, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0x00, 0x20, 0xff, 
-	0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, 
-	0xf0, 0x1a, 0xf9, 0x9e, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xe4, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, 
-	0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, 
-	0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, 
-	0x49, 0x14, 0x1c, 0x38, 0xf0, 0x1a, 0xf9, 0x9a, 
-	0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, 
-	0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x1a, 
-	0xf9, 0x84, 0xf0, 0x1a, 0xf9, 0x87, 0x43, 0xa8, 
-	0xf0, 0x1a, 0xf9, 0x88, 0xf0, 0x1a, 0xf9, 0x82, 
-	0x43, 0xa0, 0xf0, 0x1a, 0xf9, 0x83, 0x1c, 0x38, 
-	0xf0, 0x10, 0xf8, 0x66, 0x1c, 0x04, 0xd1, 0x07, 
-	0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0xf0, 0x10, 0xff, 0x17, 0x1c, 0x04, 
-	0xf7, 0xff, 0xfc, 0x8e, 0x1c, 0x20, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2d, 0x43, 
-	0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, 
-	0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, 
-	0xb4, 0x07, 0x21, 0x10, 0x1c, 0x1a, 0xb4, 0x06, 
-	0x23, 0x10, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf8, 0x54, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, 
-	0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, 
-	0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00, 
-	0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x21, 0x18, 
-	0x1c, 0x1a, 0xb4, 0x06, 0x23, 0x11, 0x1c, 0x20, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xf8, 0x3a, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, 
-	0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, 
-	0xb4, 0x07, 0x21, 0x20, 0x1c, 0x1a, 0xb4, 0x06, 
-	0x23, 0x51, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf8, 0x20, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x03, 
-	0x0e, 0x1b, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, 
-	0x0e, 0x36, 0x9c, 0x09, 0x9f, 0x0a, 0x06, 0x20, 
-	0x0e, 0x00, 0x22, 0x00, 0x1c, 0x39, 0xb4, 0x07, 
-	0x21, 0x10, 0x9a, 0x06, 0xb4, 0x06, 0x1c, 0x18, 
-	0x23, 0x62, 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 
-	0xf8, 0x05, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9e, 0x09, 
-	0x9f, 0x0b, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x09, 
-	0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15, 
-	0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 
-	0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38, 
-	0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x1a, 
-	0xf8, 0xe9, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, 
-	0x90, 0x00, 0xf0, 0x1a, 0xf8, 0xe3, 0x23, 0x01, 
-	0x05, 0x1b, 0x43, 0x18, 0xf0, 0x1a, 0xf8, 0xe2, 
-	0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03, 
-	0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01, 
-	0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01, 
-	0x1c, 0x11, 0x40, 0xa9, 0x4b, 0x5f, 0x1c, 0x0f, 
-	0x68, 0x18, 0x40, 0x07, 0xd0, 0x01, 0x27, 0x11, 
-	0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18, 
-	0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c, 
-	0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00, 
-	0xf0, 0x10, 0xfb, 0xc4, 0x1c, 0x06, 0xe0, 0x0d, 
-	0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, 
-	0x20, 0xc8, 0xf0, 0x10, 0xfb, 0xbb, 0x1c, 0x06, 
-	0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x10, 
-	0xfb, 0xb5, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, 
-	0xf9, 0x6d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, 
-	0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, 
-	0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, 
-	0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x5e, 
-	0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, 
-	0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, 
-	0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, 
-	0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, 
-	0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, 
-	0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, 
-	0x1c, 0x22, 0xf0, 0x10, 0xfc, 0x13, 0xb0, 0x01, 
-	0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfd, 0x56, 0x22, 0x00, 0xb4, 0x04, 
-	0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfb, 0x8a, 0xb0, 0x01, 0x1c, 0x07, 
-	0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, 
-	0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, 
-	0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, 
-	0x98, 0x16, 0xf0, 0x10, 0xfb, 0x63, 0x1c, 0x07, 
-	0x00, 0x80, 0xf0, 0x03, 0xf9, 0x1b, 0x99, 0x07, 
-	0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, 
-	0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xfb, 0x77, 
-	0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, 
-	0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, 
-	0x20, 0x5c, 0xf0, 0x03, 0xf9, 0x07, 0x28, 0x00, 
-	0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, 
-	0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, 
-	0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, 
-	0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, 
-	0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, 
-	0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, 
-	0x1c, 0x21, 0xf0, 0x0c, 0xfd, 0xf7, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, 
-	0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x1a, 0xf8, 0x1b, 0x4b, 0x0c, 
-	0x40, 0x18, 0xf0, 0x1a, 0xf8, 0x1b, 0x1c, 0x38, 
-	0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xec, 
-	0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x02, 0x70, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x44, 0x48, 
-	0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x02, 0xf0, 
-	0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, 
-	0xf0, 0x19, 0xff, 0xf8, 0x0d, 0x40, 0xd2, 0x09, 
-	0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xff, 0xf2, 
-	0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, 
-	0xff, 0xf1, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 
-	0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02, 
-	0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03, 
-	0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae, 
-	0x60, 0x08, 0x4d, 0x3c, 0x59, 0xa8, 0x28, 0x00, 
-	0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49, 
-	0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01, 
-	0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x0c, 
-	0xfe, 0x11, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0xac, 
-	0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x03, 0xf8, 0xa6, 0x59, 0xa8, 0xf0, 0x03, 
-	0xf8, 0xa3, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, 
-	0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, 
-	0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x10, 0xf9, 0x36, 
-	0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, 
-	0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, 
-	0xf0, 0x10, 0xfa, 0xd1, 0x28, 0x00, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, 
-	0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x08, 0xfa, 0xb8, 
-	0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, 
-	0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0x48, 0x18, 0xf0, 0x10, 0xfb, 0x22, 
-	0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, 
-	0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0xc1, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, 
-	0xf8, 0x67, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, 
-	0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, 
-	0xf8, 0x5f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, 
-	0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x19, 0xff, 0x6f, 0x4b, 0x0b, 
-	0x40, 0x18, 0xf0, 0x19, 0xff, 0x6f, 0x1c, 0x20, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xec, 0x2e, 0x08, 0x01, 0xf0, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x44, 0x28, 
-	0x2e, 0x08, 0x02, 0x70, 0xff, 0xef, 0xff, 0xff, 
-	0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, 
-	0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, 
-	0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, 
-	0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, 
-	0xa9, 0x25, 0xf0, 0x0d, 0xf9, 0xd3, 0xab, 0x00, 
-	0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, 
-	0x21, 0x00, 0xf0, 0x0d, 0xf9, 0xf2, 0xe0, 0x0c, 
-	0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, 
-	0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, 
-	0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, 
-	0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, 
-	0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xea, 
-	0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, 
-	0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0d, 
-	0xf9, 0xd4, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, 
-	0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xf0, 0xb4, 0xf0, 0x06, 0x12, 
-	0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06, 
-	0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36, 
-	0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80, 
-	0x70, 0x05, 0xe0, 0x01, 0x25, 0x00, 0x70, 0x05, 
-	0x25, 0x00, 0x70, 0x45, 0x80, 0x85, 0x72, 0x05, 
-	0x70, 0xc6, 0x70, 0x83, 0x62, 0xc4, 0x63, 0x07, 
-	0x27, 0x00, 0x23, 0x00, 0x2a, 0x00, 0xdd, 0x10, 
-	0x5c, 0xcc, 0x19, 0xc5, 0x73, 0x2c, 0x18, 0xcc, 
-	0x78, 0x66, 0x1c, 0x7c, 0x06, 0x25, 0x0e, 0x2d, 
-	0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02, 
-	0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93, 
-	0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0, 
-	0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xf8, 0x59, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xfc, 0x20, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, 
-	0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, 
-	0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, 
-	0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x6f, 0x78, 0xb8, 
-	0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, 
-	0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x9c, 0xe0, 0x08, 
-	0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 
-	0xfe, 0xd9, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 
-	0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, 
-	0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x3a, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, 
-	0xf0, 0x0d, 0xfa, 0x92, 0x28, 0x00, 0xd1, 0x09, 
-	0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xfe, 0x89, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xfe, 0x7b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x78, 
-	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, 
-	0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0d, 
-	0xf8, 0xfb, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x58, 
-	0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x0c, 0xff, 0xfc, 0x22, 0x05, 0x21, 0x16, 
-	0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x76, 0x2c, 0xb2, 
-	0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x0c, 
-	0xff, 0xab, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x0d, 
-	0xfb, 0xb8, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, 
-	0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, 
-	0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 
-	0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x06, 
-	0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 
-	0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x33, 
-	0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 
-	0xf0, 0x10, 0xfe, 0x70, 0xe0, 0x02, 0x20, 0x40, 
-	0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 
-	0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, 
-	0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 
-	0xff, 0xcd, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, 
-	0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, 
-	0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0xd4, 
-	0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xbe, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, 
-	0xf0, 0x0d, 0xfa, 0x16, 0x28, 0x00, 0xd1, 0x09, 
-	0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xfe, 0x0d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xfd, 0xff, 0xe0, 0x01, 0xf7, 0xfd, 0xfd, 0xfc, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, 
-	0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0d, 0xf8, 0x7c, 
-	0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x0c, 0xff, 0x3e, 0xf7, 0xff, 0xf9, 0x58, 
-	0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, 
-	0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, 
-	0xf7, 0xff, 0xf9, 0xc6, 0xb0, 0x2d, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00, 
-	0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00, 
-	0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43, 
-	0x52, 0xd6, 0x52, 0xfe, 0x00, 0x83, 0x50, 0xce, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, 
-	0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43, 
-	0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6, 
-	0x20, 0x01, 0x02, 0x80, 0xf0, 0x19, 0xfd, 0xcd, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x4b, 0x1b, 0x40, 0x18, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x49, 0x1a, 0x20, 0x0a, 
-	0xf0, 0x19, 0xfd, 0xd0, 0x21, 0x00, 0x4f, 0x19, 
-	0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b, 
-	0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98, 
-	0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19, 
-	0x73, 0x26, 0x71, 0x5e, 0x1c, 0x1d, 0x23, 0x06, 
-	0x73, 0x63, 0x23, 0x00, 0x00, 0xdc, 0x19, 0x2c, 
-	0x81, 0xa6, 0x81, 0xe6, 0x33, 0x01, 0x06, 0x1b, 
-	0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5, 
-	0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, 
-	0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xb8, 
-	0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x45, 0xe8, 0xff, 0xff, 0xfb, 0xff, 
-	0x2e, 0x00, 0x31, 0x7d, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x44, 0x68, 0xb5, 0xf0, 0x06, 0x00, 
-	0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09, 
-	0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00, 
-	0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a, 
-	0x00, 0x7b, 0x19, 0xdb, 0x01, 0x1b, 0x5a, 0xcd, 
-	0x4b, 0x58, 0x42, 0x9d, 0xd1, 0x01, 0x1c, 0x3a, 
-	0xe0, 0x04, 0x1c, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 
-	0x2f, 0x08, 0xdb, 0xf1, 0x2f, 0x08, 0xd1, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x46, 0x4f, 0x50, 
-	0x97, 0x02, 0x5b, 0xbb, 0x2b, 0x00, 0xd0, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02, 
-	0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12, 
-	0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02, 
-	0xfe, 0x19, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, 
-	0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39, 
-	0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d, 
-	0x21, 0xff, 0x02, 0x09, 0x40, 0x21, 0x12, 0x08, 
-	0x28, 0x09, 0xd2, 0x1f, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x1b, 0x04, 0x06, 0x09, 
-	0x0c, 0x0f, 0x12, 0x15, 0x18, 0x00, 0x24, 0xb8, 
-	0xe0, 0x16, 0x24, 0xff, 0x34, 0x71, 0xe0, 0x13, 
-	0x24, 0x01, 0x02, 0xa4, 0xe0, 0x10, 0x24, 0x01, 
-	0x02, 0xe4, 0xe0, 0x0d, 0x24, 0x01, 0x03, 0x24, 
-	0xe0, 0x0a, 0x24, 0x01, 0x03, 0x64, 0xe0, 0x07, 
-	0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01, 
-	0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4, 
-	0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02, 
-	0xfd, 0xdd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, 
-	0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, 
-	0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xf4, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8, 
-	0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d, 
-	0x50, 0x0e, 0x20, 0x00, 0x1c, 0x01, 0x43, 0x61, 
-	0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a, 
-	0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21, 
-	0xf0, 0x15, 0xfd, 0x94, 0x1d, 0xfc, 0x34, 0x19, 
-	0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x08, 
-	0xf9, 0xc7, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, 
-	0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x07, 
-	0xff, 0xfb, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, 
-	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
-	0x6a, 0xbb, 0xf0, 0x08, 0xfa, 0x43, 0x1c, 0x30, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x44, 0x68, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x45, 0xe8, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x08, 
-	0xff, 0xd7, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, 
-	0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40, 
-	0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00, 
-	0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01, 
-	0xd1, 0x31, 0x6a, 0x83, 0x7a, 0x1c, 0x2c, 0xa4, 
-	0xd0, 0x01, 0x2c, 0xa5, 0xd1, 0x2b, 0x1d, 0xc4, 
-	0x34, 0x19, 0xe0, 0x0e, 0x79, 0x05, 0x73, 0x65, 
-	0x88, 0xde, 0x79, 0x05, 0x00, 0xed, 0x18, 0x2d, 
-	0x81, 0xae, 0x79, 0x05, 0x35, 0x01, 0x07, 0xad, 
-	0x0f, 0xad, 0x71, 0x05, 0x78, 0x15, 0x35, 0x01, 
-	0x70, 0x15, 0x7a, 0x9d, 0x7b, 0x66, 0x42, 0xb5, 
-	0xd0, 0x02, 0x79, 0x45, 0x2d, 0x00, 0xd0, 0xe9, 
-	0x7a, 0x1b, 0x2b, 0xa5, 0xd1, 0x0f, 0x79, 0x43, 
-	0x07, 0xdc, 0x0f, 0xe4, 0x2c, 0x01, 0xd0, 0x0a, 
-	0x1c, 0x1c, 0x23, 0x01, 0x43, 0x23, 0x71, 0x43, 
-	0x88, 0x00, 0x00, 0x80, 0x9b, 0x01, 0x18, 0xc0, 
-	0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x44, 0x68, 0x2e, 0x08, 0x45, 0xe8, 
-	0x2e, 0x08, 0x03, 0xb8, 0xb5, 0xf0, 0x04, 0x05, 
-	0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42, 
-	0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa, 
-	0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf2, 
-	0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48, 
-	0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8, 
-	0x49, 0x25, 0xf0, 0x08, 0xfa, 0x0f, 0x79, 0x78, 
-	0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe, 
-	0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8, 
-	0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41, 
-	0x78, 0xf8, 0x79, 0x39, 0x42, 0x88, 0xd1, 0x11, 
-	0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 
-	0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, 
-	0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8, 
-	0x68, 0x00, 0xf0, 0x02, 0xfd, 0x15, 0x6a, 0xb8, 
-	0xf0, 0x02, 0xfd, 0x12, 0x4f, 0x12, 0x00, 0x68, 
-	0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, 
-	0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, 
-	0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x03, 0xf8, 0x12, 
-	0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, 
-	0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 
-	0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, 
-	0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x68, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x03, 0xb8, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0xbb, 0x49, 0x07, 
-	0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, 
-	0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, 
-	0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa3, 0x49, 0x06, 
-	0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, 
-	0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0xb4, 0x80, 0x04, 0x09, 
-	0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18, 
-	0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04, 
-	0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01, 
-	0xd1, 0xfb, 0x88, 0x03, 0x42, 0x8b, 0xd0, 0x03, 
-	0x80, 0x01, 0x88, 0x03, 0x42, 0x8b, 0xd1, 0xfb, 
-	0x8f, 0x11, 0x1c, 0x10, 0x29, 0x00, 0xd0, 0x04, 
-	0x21, 0x00, 0x87, 0x01, 0x8f, 0x02, 0x2a, 0x00, 
-	0xd1, 0xfb, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x80, 0x48, 0x1f, 
-	0x8f, 0x40, 0x28, 0x00, 0xd1, 0x37, 0x4f, 0x1e, 
-	0x88, 0x38, 0x12, 0x00, 0x4a, 0x1d, 0x28, 0x06, 
-	0xd0, 0x1e, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x26, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x2a, 0x12, 0x12, 0x0d, 0x22, 0x12, 0x28, 0x07, 
-	0xd0, 0x15, 0x28, 0x09, 0xd0, 0x0b, 0x28, 0x0b, 
-	0xd0, 0x14, 0x28, 0x80, 0xd1, 0x17, 0xf0, 0x00, 
-	0xf9, 0x1f, 0xe0, 0x18, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xf8, 0x24, 0xe0, 0x13, 0x88, 0x79, 
-	0x88, 0x38, 0xf0, 0x00, 0xf8, 0xbd, 0xe0, 0x0e, 
-	0xf0, 0x00, 0xf9, 0x6a, 0xe0, 0x0b, 0xf0, 0x00, 
-	0xf9, 0xd5, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xfc, 0x9c, 0xe0, 0x03, 0x48, 0x08, 
-	0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x04, 0x00, 0xb5, 0xf0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 
-	0x2d, 0x10, 0xdd, 0x03, 0x20, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xfb, 0x92, 
-	0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, 
-	0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, 
-	0x48, 0x1c, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, 
-	0x4b, 0x1b, 0x42, 0xb5, 0xdd, 0x0a, 0x88, 0x19, 
-	0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, 
-	0xf0, 0x19, 0xfb, 0xb2, 0x20, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x64, 0x05, 0x35, 0x28, 
-	0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 
-	0x23, 0x10, 0x43, 0x33, 0x80, 0x2b, 0x6d, 0x03, 
-	0x80, 0x9c, 0x6d, 0x04, 0x80, 0xe2, 0x23, 0x00, 
-	0x29, 0x00, 0xdd, 0x08, 0x88, 0x3d, 0x00, 0x5c, 
-	0x6d, 0x06, 0x19, 0xa4, 0x81, 0x25, 0x33, 0x01, 
-	0x37, 0x02, 0x42, 0x8b, 0xdb, 0xf6, 0x6d, 0x01, 
-	0x18, 0x8a, 0x6c, 0xc3, 0x42, 0x9a, 0xd9, 0x00, 
-	0x6c, 0x82, 0x60, 0x0a, 0x65, 0x02, 0xf0, 0x19, 
-	0xfb, 0x8b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb4, 0xf0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x08, 0x0c, 0x00, 0x28, 0x10, 
-	0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x30, 0x01, 0x4f, 0x1c, 0x40, 0x07, 0x1c, 0xb8, 
-	0x00, 0x40, 0x1d, 0x01, 0x48, 0x1a, 0x6d, 0x83, 
-	0x18, 0x5d, 0x6d, 0xc6, 0x4b, 0x19, 0x42, 0xb5, 
-	0xdd, 0x07, 0x88, 0x19, 0x1c, 0x18, 0x23, 0x02, 
-	0x43, 0x19, 0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0, 
-	0x47, 0x70, 0x65, 0x85, 0x35, 0x28, 0x42, 0xb5, 
-	0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01, 
-	0x43, 0x33, 0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c, 
-	0x6e, 0x84, 0x80, 0xe1, 0x23, 0x00, 0x2f, 0x00, 
-	0xdd, 0x08, 0x88, 0x15, 0x00, 0x5c, 0x6e, 0x86, 
-	0x19, 0xa4, 0x81, 0x25, 0x32, 0x02, 0x33, 0x01, 
-	0x42, 0xbb, 0xdb, 0xf6, 0x6e, 0x82, 0x18, 0x51, 
-	0x6e, 0x43, 0x42, 0x99, 0xd3, 0x00, 0x6e, 0x01, 
-	0x60, 0x11, 0x66, 0x81, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 
-	0xb5, 0xb0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x19, 0xfa, 0xfa, 
-	0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x19, 0xfb, 0x28, 
-	0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x09, 
-	0x0c, 0x09, 0x29, 0x08, 0xdd, 0x02, 0x20, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x00, 0x88, 0x1d, 0xc7, 
-	0x37, 0x01, 0x48, 0x19, 0x6d, 0x83, 0x19, 0xdd, 
-	0x6d, 0xc6, 0x4b, 0x18, 0x42, 0xb5, 0xdd, 0x07, 
-	0x88, 0x19, 0x1c, 0x18, 0x23, 0x02, 0x43, 0x19, 
-	0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0, 0x47, 0x70, 
-	0x65, 0x85, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, 
-	0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01, 0x43, 0x33, 
-	0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c, 0x6e, 0x84, 
-	0x80, 0xe7, 0x23, 0x00, 0x6e, 0x84, 0x29, 0x00, 
-	0xdd, 0x06, 0xca, 0x40, 0x00, 0x9d, 0x19, 0x2d, 
-	0x60, 0xae, 0x33, 0x01, 0x42, 0x8b, 0xdb, 0xf8, 
-	0x6e, 0x81, 0x19, 0xca, 0x6e, 0x43, 0x42, 0x9a, 
-	0xd3, 0x00, 0x6e, 0x02, 0x60, 0x0a, 0x66, 0x82, 
-	0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 
-	0xb5, 0x80, 0x48, 0x28, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x4f, 0x27, 0x28, 0x01, 0xd0, 0x13, 
-	0x28, 0x02, 0xd0, 0x1a, 0x28, 0x03, 0xd1, 0x0c, 
-	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xdb, 0x02, 
-	0x88, 0x41, 0x29, 0x0f, 0xdd, 0x2f, 0x88, 0x01, 
-	0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0b, 
-	0xf9, 0x81, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0x38, 0x88, 0x82, 0x88, 0x41, 0x88, 0x00, 
-	0xf0, 0x0e, 0xf8, 0x60, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, 
-	0x88, 0xc2, 0x43, 0x11, 0x88, 0x02, 0x04, 0x12, 
-	0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xfd, 0x04, 
-	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xd1, 0x08, 
-	0x88, 0x81, 0x04, 0x09, 0x88, 0xc0, 0x43, 0x08, 
-	0xf0, 0x0a, 0xff, 0xfe, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xff, 0xf8, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x41, 
-	0x48, 0x08, 0x29, 0x0e, 0xd1, 0x02, 0x21, 0x00, 
-	0x60, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x60, 0x01, 
-	0x68, 0x00, 0xf0, 0x00, 0xfb, 0xe1, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x00, 0xfc, 
-	0x2e, 0x08, 0x03, 0xc0, 0x2e, 0x08, 0x04, 0xf4, 
-	0xb5, 0x90, 0x48, 0x31, 0x88, 0x00, 0x06, 0x04, 
-	0x0e, 0x24, 0x48, 0x30, 0x22, 0x03, 0x21, 0x02, 
-	0x4f, 0x2f, 0x2c, 0x08, 0xd2, 0x4f, 0xa3, 0x02, 
-	0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x4b, 0x10, 0x16, 0x1c, 0x28, 0x34, 0x3f, 
-	0x68, 0x39, 0x88, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x03, 
-	0xfa, 0xa7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x03, 0xf7, 0xfd, 0xff, 0xe1, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 0xf7, 0xfd, 
-	0xff, 0xdb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x88, 0x00, 0x4b, 0x1e, 0x28, 0x00, 0xd0, 0x03, 
-	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x88, 0x00, 0x4b, 0x19, 0x28, 0x00, 0xd0, 0x03, 
-	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x02, 0xfe, 0x72, 0x68, 0x39, 0x88, 0x4a, 
-	0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x52, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 
-	0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x18, 0x8a, 
-	0x88, 0x01, 0x04, 0x09, 0x88, 0x40, 0x50, 0x0a, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x1d, 0xf8, 
-	0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x6e, 0x00, 0x13, 0x00, 
-	0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x86, 
-	0x48, 0x80, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x4c, 0x7f, 0x4f, 0x80, 0x28, 0x0b, 0xd2, 0x61, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x05, 0x0f, 0x17, 0x3a, 0x5e, 0x86, 0x90, 0xbd, 
-	0xc5, 0xd3, 0xd8, 0x00, 0xf0, 0x0b, 0xfb, 0x38, 
-	0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0xe0, 
-	0x20, 0x1e, 0xa9, 0x05, 0xf0, 0x0b, 0xfa, 0x3a, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x08, 0xe0, 0xd8, 
-	0x1c, 0x20, 0xf0, 0x0d, 0xfe, 0x31, 0x20, 0x00, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x52, 0x99, 0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7, 
-	0x20, 0x07, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 
-	0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91, 
-	0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, 0x30, 0x01, 
-	0x28, 0x12, 0xdd, 0xf5, 0xe0, 0xb5, 0x20, 0x13, 
-	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, 0x30, 0x01, 
-	0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 
-	0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a, 
-	0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, 
-	0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, 0x28, 0x01, 
-	0xdd, 0xf4, 0xe0, 0x92, 0xe0, 0x8c, 0x20, 0x02, 
-	0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 
-	0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 
-	0x87, 0x91, 0x30, 0x01, 0x28, 0x05, 0xdd, 0xf3, 
-	0x20, 0x09, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 
-	0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
-	0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, 0x28, 0x0f, 
-	0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, 0x19, 0x09, 
-	0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 
-	0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, 0x30, 0x01, 
-	0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x69, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff, 
-	0xfe, 0x47, 0x6f, 0xb8, 0x49, 0x36, 0x80, 0x08, 
-	0xe0, 0x5f, 0xa8, 0x02, 0xf0, 0x10, 0xfc, 0x18, 
-	0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x02, 0x68, 0x39, 0x80, 0x48, 0x98, 0x03, 
-	0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x03, 
-	0x68, 0x39, 0x80, 0xc8, 0x98, 0x04, 0x0c, 0x00, 
-	0x68, 0x39, 0x81, 0x08, 0x98, 0x04, 0x68, 0x39, 
-	0x81, 0x48, 0x20, 0x00, 0x68, 0x39, 0x81, 0x88, 
-	0x68, 0x38, 0x89, 0x81, 0x23, 0x01, 0x03, 0xdb, 
-	0x43, 0x19, 0x81, 0x81, 0x48, 0x25, 0x68, 0x39, 
-	0x81, 0xc8, 0x48, 0x25, 0x68, 0x01, 0x14, 0x09, 
-	0x68, 0x3a, 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 
-	0x82, 0x48, 0xe0, 0x32, 0x20, 0x19, 0x06, 0x80, 
-	0x6b, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 
-	0x80, 0x08, 0xe0, 0x2a, 0x68, 0x38, 0x88, 0x01, 
-	0x04, 0x09, 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 
-	0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0x1c, 
-	0x48, 0x16, 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0xe0, 0x17, 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x08, 
-	0xfb, 0xb9, 0x98, 0x01, 0x68, 0x39, 0x80, 0x08, 
-	0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x48, 
-	0x98, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x00, 
-	0x0c, 0x00, 0x68, 0x39, 0x80, 0xc8, 0xe0, 0x04, 
-	0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 
-	0x86, 0x81, 0xb0, 0x06, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, 
-	0x2e, 0x08, 0x46, 0x68, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x1a, 
-	0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x00, 0x58, 
-	0xb5, 0xf0, 0x4f, 0x6e, 0x25, 0x00, 0x6f, 0xf8, 
-	0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, 0xff, 0x4a, 
-	0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, 0x20, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0x38, 
-	0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x6d, 0x38, 0x6d, 0x7c, 
-	0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x88, 0xa0, 0x06, 0x00, 
-	0x0e, 0x00, 0x28, 0x15, 0xd2, 0x56, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x0b, 0x12, 0x1c, 0x16, 0x22, 0x53, 0x26, 0x31, 
-	0x3c, 0x47, 0x57, 0x61, 0x68, 0x6d, 0x71, 0x75, 
-	0x7d, 0x84, 0x83, 0x83, 0x87, 0x00, 0x89, 0xe3, 
-	0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfa, 0xc5, 0xe0, 0x70, 0x89, 0x20, 0xf0, 0x06, 
-	0xfa, 0xa9, 0xe0, 0x6c, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfb, 0x83, 0xe0, 0x66, 
-	0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfb, 0x2b, 0xe0, 0x60, 0x89, 0x20, 0xf0, 0x06, 
-	0xfb, 0xc1, 0xe0, 0x5c, 0x8a, 0x62, 0x8a, 0x21, 
-	0xb4, 0x06, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfc, 0x45, 0xb0, 0x02, 
-	0xe0, 0x51, 0x8a, 0x62, 0x8a, 0x21, 0xb4, 0x06, 
-	0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 
-	0xf0, 0x06, 0xfc, 0x8c, 0xb0, 0x02, 0xe0, 0x46, 
-	0x89, 0xa3, 0x89, 0x62, 0x89, 0x20, 0x49, 0x3c, 
-	0xf0, 0x06, 0xfd, 0xcd, 0x21, 0x00, 0x48, 0x3a, 
-	0xf7, 0xff, 0xfc, 0x58, 0xe0, 0x3b, 0x89, 0xe0, 
-	0x04, 0x03, 0x14, 0x1b, 0x89, 0xa0, 0x04, 0x02, 
-	0x14, 0x12, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 
-	0xfd, 0xed, 0xe0, 0x30, 0xe0, 0x4c, 0x89, 0x20, 
-	0xf0, 0x06, 0xfb, 0xa0, 0xe0, 0x2b, 0x89, 0xe0, 
-	0x04, 0x00, 0x8a, 0x21, 0x18, 0x43, 0x89, 0xa2, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x40, 
-	0xe0, 0x21, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xfe, 0x71, 0xe0, 0x1a, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xc2, 
-	0xe0, 0x15, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xdc, 
-	0xe0, 0x11, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xec, 
-	0xe0, 0x0d, 0x20, 0x01, 0x67, 0xf8, 0x89, 0xa2, 
-	0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xff, 0x04, 
-	0xe0, 0x05, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 
-	0x89, 0x20, 0xf0, 0x06, 0xff, 0x67, 0xe0, 0x1b, 
-	0xf0, 0x06, 0xff, 0xfe, 0xe0, 0x18, 0x89, 0x20, 
-	0xb0, 0x82, 0x90, 0x01, 0x89, 0x61, 0x91, 0x00, 
-	0x89, 0xa5, 0x89, 0xe0, 0x1b, 0x40, 0x24, 0x00, 
-	0x1c, 0x46, 0x2e, 0x00, 0xdd, 0x0b, 0x00, 0xa0, 
-	0x4b, 0x12, 0x18, 0xc0, 0x19, 0x2a, 0x68, 0x03, 
-	0x98, 0x01, 0x99, 0x00, 0xf0, 0x06, 0xfe, 0x04, 
-	0x34, 0x01, 0x42, 0xb4, 0xdb, 0xf3, 0xb0, 0x02, 
-	0x6d, 0x78, 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 
-	0x64, 0x38, 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 
-	0xdb, 0x05, 0x48, 0x09, 0x88, 0x01, 0x23, 0x10, 
-	0x43, 0xdb, 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 
-	0x68, 0x00, 0x65, 0x78, 0x20, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x1a, 0x00, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x90, 0x4f, 0x66, 
-	0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x57, 
-	0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x5a, 
-	0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x93, 0x04, 0x50, 0x93, 0x93, 0x57, 0x93, 0x93, 
-	0x7c, 0x82, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, 
-	0x29, 0x0c, 0xd2, 0x4c, 0xa3, 0x01, 0x5c, 0x5b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x3c, 
-	0x85, 0x85, 0x85, 0x85, 0x85, 0x39, 0x85, 0x05, 
-	0x89, 0x00, 0xf0, 0x03, 0xf8, 0xc1, 0xe0, 0x7b, 
-	0x22, 0x00, 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 
-	0x4a, 0x52, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x5c, 
-	0xb0, 0x01, 0xe0, 0x71, 0x22, 0x00, 0xb4, 0x04, 
-	0x89, 0x02, 0x1c, 0x23, 0x49, 0x4d, 0x1e, 0x48, 
-	0xf7, 0xfc, 0xfd, 0x52, 0xb0, 0x01, 0xe0, 0x67, 
-	0x8a, 0x02, 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 
-	0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x48, 
-	0x6e, 0xf8, 0x89, 0x01, 0xb0, 0x01, 0x29, 0x00, 
-	0xd1, 0x5a, 0x89, 0x41, 0x29, 0x00, 0xd1, 0x57, 
-	0x89, 0x81, 0x29, 0x00, 0xd1, 0x54, 0x89, 0xc1, 
-	0x29, 0x00, 0xd1, 0x51, 0x8a, 0x00, 0x28, 0x00, 
-	0xd1, 0x4e, 0xf7, 0xfd, 0xfa, 0x85, 0xe0, 0x62, 
-	0xf7, 0xfc, 0xfc, 0xc6, 0xe0, 0x5f, 0x21, 0x18, 
-	0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xaf, 0xe0, 0x5a, 
-	0xe0, 0x6a, 0x06, 0x09, 0xd1, 0x40, 0x89, 0x00, 
-	0xf7, 0xfc, 0xfe, 0x7c, 0xe0, 0x53, 0xe0, 0x52, 
-	0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x4e, 
-	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf8, 0x6a, 0xe0, 0x43, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf8, 0x8c, 0xe0, 0x3f, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf9, 0x1a, 0xe0, 0x3b, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf9, 0xfe, 0xe0, 0x37, 0x89, 0x00, 
-	0xf7, 0xfe, 0xfa, 0x30, 0xe0, 0x33, 0x89, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfe, 0xfa, 0x0c, 
-	0xe0, 0x2d, 0x06, 0x08, 0xd1, 0x14, 0x6f, 0xb8, 
-	0x30, 0x01, 0x67, 0xb8, 0xe0, 0x27, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x08, 0xd2, 0x23, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x0d, 0x09, 0x10, 0x13, 0x17, 0x1a, 0x1d, 
-	0x89, 0x00, 0xf0, 0x01, 0xf9, 0x7f, 0xe0, 0x16, 
-	0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 0xf9, 0xa6, 
-	0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf1, 0xe0, 0x0e, 
-	0xf0, 0x01, 0xfa, 0x48, 0xe0, 0x0b, 0x89, 0x00, 
-	0xf0, 0x01, 0xfa, 0xcc, 0xe0, 0x07, 0xf0, 0x01, 
-	0xfb, 0x05, 0xe0, 0x04, 0xf0, 0x01, 0xfb, 0x1e, 
-	0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x7b, 0x6e, 0xf8, 
-	0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 0x65, 0xb8, 
-	0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x04, 
-	0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 0x00, 0x49, 
-	0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 0x66, 0xf8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc0, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, 
-	0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, 
-	0x88, 0x38, 0xf0, 0x02, 0xfa, 0x39, 0x80, 0x78, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x22, 
-	0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, 
-	0xf0, 0x02, 0xf8, 0xaa, 0x49, 0x01, 0x68, 0x09, 
-	0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc0, 
-	0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, 
-	0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83, 
-	0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, 
-	0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, 
-	0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, 
-	0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, 
-	0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x40, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
-	0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x71, 0xf7, 0xfd, 
-	0xf8, 0x37, 0xf7, 0xfc, 0xfe, 0xdd, 0xf7, 0xfd, 
-	0xf9, 0x37, 0xf0, 0x03, 0xf8, 0x71, 0xf7, 0xff, 
-	0xff, 0xcf, 0x48, 0x09, 0x8e, 0x80, 0x28, 0x00, 
-	0xd1, 0x0b, 0x48, 0x08, 0x6f, 0xc0, 0x28, 0x00, 
-	0xd1, 0x01, 0xf0, 0x03, 0xfd, 0xe3, 0xf7, 0xff, 
-	0xfd, 0xe7, 0x28, 0x00, 0xd1, 0x01, 0xf7, 0xff, 
-	0xfe, 0xc9, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1f, 0x80, 
-	0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b, 
-	0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a, 
-	0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0, 
-	0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00, 
-	0x2e, 0x08, 0x5e, 0x38, 0xb4, 0x90, 0x4b, 0x0c, 
-	0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07, 
-	0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47, 
-	0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84, 
-	0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b, 
-	0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0, 
-	0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x38, 0x00, 0x03, 0xfe, 0x00, 
-	0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00, 
-	0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02, 
-	0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19, 
-	0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d, 
-	0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, 
-	0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07, 
-	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
-	0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0x6a, 0x00, 0x00, 0x18, 
-	0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff, 
-	0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80, 
-	0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01, 
-	0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e, 
-	0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00, 
-	0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02, 
-	0xf0, 0x0a, 0xfd, 0x0c, 0x2f, 0x00, 0xd1, 0x04, 
-	0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01, 
-	0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x0a, 0xfc, 0xf6, 
-	0x20, 0x1e, 0xf0, 0x07, 0xfc, 0xf3, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x07, 0xfa, 0xa1, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1e, 0xf0, 0x07, 0xf8, 0xd5, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 
-	0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x91, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0d, 
-	0xf8, 0x6b, 0x20, 0x1f, 0xf0, 0x07, 0xfc, 0x04, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x07, 0xfa, 0x7c, 
-	0x20, 0x00, 0xf0, 0x0a, 0xfb, 0x61, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1f, 0xf0, 0x07, 0xf8, 0xad, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 
-	0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x69, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 
-	0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a, 
-	0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79, 
-	0xf0, 0x01, 0xfe, 0x3c, 0x1d, 0xf9, 0x31, 0x79, 
-	0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 
-	0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff, 
-	0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, 
-	0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x45, 0x20, 0x00, 
-	0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x4a, 0x0d, 
-	0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, 
-	0xf7, 0xfc, 0xfb, 0x2a, 0x21, 0x33, 0x06, 0x49, 
-	0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 
-	0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, 
-	0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, 
-	0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x00, 0x4a, 0x10, 
-	0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, 
-	0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x09, 0x21, 0x33, 
-	0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 
-	0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49, 
-	0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 
-	0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 
-	0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x00, 0x04, 
-	0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01, 
-	0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f, 
-	0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00, 
-	0xf7, 0xfc, 0xfc, 0x1c, 0x48, 0x0f, 0xf7, 0xfc, 
-	0xfc, 0x19, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59, 
-	0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79, 
-	0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6, 
-	0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 
-	0x01, 0x40, 0xf0, 0x01, 0xfd, 0xab, 0x61, 0x78, 
-	0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, 
-	0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xbc, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xa8, 
-	0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x0c, 
-	0xff, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00, 
-	0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x94, 
-	0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, 
-	0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, 
-	0xfa, 0x8b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 
-	0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f, 
-	0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01, 
-	0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87, 
-	0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28, 
-	0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0c, 0xff, 0x59, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x44, 
-	0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f, 
-	0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76, 
-	0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40, 
-	0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc, 
-	0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02, 
-	0x20, 0xff, 0xf7, 0xfd, 0xff, 0x59, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, 
-	0xf7, 0xfc, 0xfa, 0x46, 0x22, 0x01, 0x21, 0x01, 
-	0x20, 0x00, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0xcc, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 0xf8, 0x8c, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, 
-	0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0x34, 
-	0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, 
-	0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, 
-	0xf0, 0x01, 0xfd, 0x14, 0x61, 0x60, 0x69, 0x60, 
-	0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20, 
-	0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38, 
-	0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00, 
-	0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59, 
-	0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 
-	0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0c, 0xfe, 0xfa, 0x20, 0x00, 0x60, 0xf8, 
-	0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0, 
-	0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0xb0, 0x4f, 0x45, 0x25, 0x00, 0x6d, 0x38, 
-	0x4c, 0x44, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x10, 0x03, 0x2e, 0x65, 0x73, 0x00, 0x4d, 0x40, 
-	0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0, 
-	0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04, 
-	0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, 
-	0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6c, 
-	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, 
-	0xf9, 0x29, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, 
-	0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x4b, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 
-	0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x06, 0xd1, 0x15, 0x48, 0x27, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, 
-	0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 
-	0xfc, 0xcd, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2e, 
-	0x85, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc0, 0x6d, 0x78, 
-	0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, 0xd0, 0x0b, 
-	0x28, 0x05, 0xd1, 0xb9, 0xf0, 0x00, 0xfd, 0xe4, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 
-	0xfd, 0xb9, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x00, 0xfd, 0x88, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xa7, 
-	0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, 0x20, 0x09, 
-	0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, 0x65, 0x38, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 
-	0x28, 0x00, 0xd1, 0x99, 0x8d, 0xa0, 0x06, 0x00, 
-	0x0e, 0x00, 0x28, 0x06, 0xd1, 0x94, 0x85, 0xa5, 
-	0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x00, 0x04, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xb0, 0x48, 0x46, 0x6c, 0xc1, 0x4c, 0x46, 
-	0x64, 0x21, 0x69, 0x60, 0x1a, 0x09, 0x1d, 0xe7, 
-	0x37, 0x79, 0x63, 0xf9, 0x29, 0x00, 0xda, 0x02, 
-	0x69, 0x22, 0x18, 0x89, 0x63, 0xf9, 0x23, 0xff, 
-	0x6b, 0xf9, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x73, 
-	0x22, 0x01, 0x03, 0x12, 0x42, 0x91, 0xdd, 0x00, 
-	0x63, 0xfa, 0x6b, 0xf9, 0x08, 0x89, 0x00, 0x89, 
-	0x63, 0xf9, 0x7a, 0x3a, 0x2a, 0x00, 0xd0, 0x05, 
-	0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc2, 0x61, 0xe2, 
-	0x22, 0x00, 0x72, 0x3a, 0x18, 0x42, 0x49, 0x35, 
-	0x25, 0x12, 0x42, 0x8a, 0xdd, 0x2c, 0x1a, 0x08, 
-	0x64, 0x38, 0xf0, 0x18, 0xfb, 0x5f, 0x4b, 0x32, 
-	0x40, 0x18, 0xf0, 0x18, 0xfb, 0x5f, 0x22, 0x00, 
-	0x49, 0x30, 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 
-	0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x6c, 0x3a, 
-	0x1c, 0x2b, 0xf0, 0x0f, 0xf8, 0x67, 0x22, 0x00, 
-	0xb0, 0x02, 0x49, 0x28, 0xb4, 0x06, 0x6b, 0xf8, 
-	0x6c, 0x39, 0x1a, 0x42, 0x69, 0x39, 0x1c, 0x2b, 
-	0x48, 0x25, 0xf0, 0x0f, 0xf8, 0x5b, 0xb0, 0x02, 
-	0xf0, 0x18, 0xfb, 0x3c, 0x23, 0x01, 0x04, 0x9b, 
-	0x43, 0x18, 0xf0, 0x18, 0xfb, 0x3b, 0xe0, 0x1d, 
-	0xf0, 0x18, 0xfb, 0x34, 0x4b, 0x1c, 0x40, 0x18, 
-	0xf0, 0x18, 0xfb, 0x34, 0x22, 0x00, 0x49, 0x1b, 
-	0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 
-	0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x6b, 0xfa, 0x1c, 0x2b, 
-	0xf0, 0x0f, 0xf8, 0x3c, 0xb0, 0x02, 0xf0, 0x18, 
-	0xfb, 0x1d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 
-	0xf0, 0x18, 0xfb, 0x1c, 0x69, 0x60, 0x6b, 0xf9, 
-	0x18, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, 
-	0x61, 0x60, 0x4b, 0x0e, 0x42, 0x99, 0xd3, 0x02, 
-	0x69, 0x21, 0x1a, 0x40, 0x61, 0x60, 0x23, 0xff, 
-	0x03, 0x5b, 0x69, 0x60, 0x1a, 0xc0, 0xe0, 0x00, 
-	0xe0, 0x00, 0x62, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x04, 0x44, 0x00, 0x1f, 0xfe, 0x00, 
-	0xff, 0xfb, 0xff, 0xff, 0x9e, 0x00, 0x08, 0x00, 
-	0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, 
-	0x21, 0x00, 0x23, 0xff, 0x68, 0x02, 0x33, 0xc1, 
-	0x42, 0x9a, 0xd0, 0x01, 0x1c, 0x08, 0x47, 0x70, 
-	0x79, 0xc2, 0x0a, 0x12, 0xd2, 0x01, 0x1c, 0x08, 
-	0x47, 0x70, 0x7a, 0x41, 0x23, 0x0e, 0x40, 0x19, 
-	0x07, 0x49, 0x7a, 0x82, 0x05, 0x92, 0x43, 0x11, 
-	0x7a, 0xc2, 0x23, 0xfe, 0x40, 0x1a, 0x03, 0x92, 
-	0x43, 0x11, 0x7b, 0x02, 0x01, 0xd2, 0x43, 0x11, 
-	0x7b, 0x40, 0x40, 0x18, 0x08, 0x40, 0x43, 0x08, 
-	0x49, 0x01, 0x67, 0x08, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0xf0, 0xb0, 0x86, 
-	0x4c, 0x8c, 0x6c, 0xe0, 0x1d, 0xe7, 0x37, 0x79, 
-	0x1d, 0xfd, 0x35, 0x39, 0x28, 0x00, 0xd0, 0x04, 
-	0x28, 0x01, 0xd0, 0x3a, 0x28, 0x02, 0xd1, 0x73, 
-	0xe0, 0x74, 0x69, 0xe0, 0x6a, 0x21, 0x1a, 0x09, 
-	0x63, 0xf9, 0x1c, 0x0a, 0xd5, 0x02, 0x69, 0x21, 
-	0x18, 0x51, 0x63, 0xf9, 0x6b, 0xf9, 0x29, 0x04, 
-	0xdb, 0x67, 0x69, 0x3e, 0x5c, 0x31, 0x06, 0x0a, 
-	0x65, 0x7a, 0x92, 0x05, 0x1c, 0x41, 0x69, 0x20, 
-	0x90, 0x04, 0xf0, 0x14, 0xfb, 0x29, 0x61, 0xe1, 
-	0x5c, 0x70, 0x04, 0x00, 0x9a, 0x05, 0x18, 0x82, 
-	0x65, 0x7a, 0x92, 0x03, 0x98, 0x04, 0x31, 0x01, 
-	0xf0, 0x14, 0xfb, 0x1e, 0x61, 0xe1, 0x5c, 0x70, 
-	0x02, 0x00, 0x9a, 0x03, 0x18, 0x80, 0x65, 0x78, 
-	0x90, 0x02, 0x98, 0x04, 0x31, 0x01, 0xf0, 0x14, 
-	0xfb, 0x13, 0x61, 0xe1, 0x5c, 0x70, 0x9a, 0x02, 
-	0x18, 0x80, 0x65, 0x78, 0x98, 0x04, 0x31, 0x01, 
-	0xf0, 0x14, 0xfb, 0x0a, 0x20, 0x01, 0x64, 0xe0, 
-	0x61, 0xe1, 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 
-	0x63, 0xf8, 0x1c, 0x01, 0xd4, 0x05, 0x48, 0x67, 
-	0x69, 0x06, 0x30, 0x80, 0x69, 0x02, 0x92, 0x01, 
-	0xe0, 0x03, 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 
-	0xe7, 0xf5, 0x6b, 0xf8, 0x90, 0x00, 0x28, 0x02, 
-	0xdb, 0x22, 0x6d, 0x78, 0x09, 0x01, 0x01, 0x09, 
-	0x23, 0xff, 0x33, 0xc1, 0x42, 0x99, 0xd1, 0x31, 
-	0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x11, 0x02, 0x09, 
-	0x83, 0x29, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, 
-	0xfa, 0xe3, 0x61, 0xe1, 0x69, 0x38, 0x5c, 0x40, 
-	0x8b, 0x2a, 0x18, 0x80, 0x83, 0x28, 0x8b, 0x28, 
-	0x30, 0x06, 0x83, 0x28, 0x19, 0x88, 0x1f, 0x41, 
-	0x1c, 0x30, 0xf0, 0x14, 0xfa, 0xd5, 0x61, 0xe1, 
-	0x21, 0xff, 0x71, 0x39, 0x20, 0x02, 0x64, 0xe0, 
-	0x6c, 0xe0, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x01, 
-	0xe0, 0x94, 0xe0, 0x93, 0x6a, 0x20, 0x69, 0xe1, 
-	0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, 0xd5, 0x02, 
-	0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 0x79, 0x38, 
-	0x28, 0x00, 0xd0, 0x13, 0x20, 0x01, 0x02, 0xc0, 
-	0x83, 0xa8, 0xe0, 0x11, 0x02, 0x01, 0x65, 0x79, 
-	0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x12, 0x18, 0x51, 
-	0x65, 0x79, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, 
-	0xfa, 0xaf, 0x61, 0xe1, 0x98, 0x00, 0x38, 0x01, 
-	0x63, 0xf8, 0xe7, 0xb2, 0x48, 0x3c, 0x83, 0xa8, 
-	0x8b, 0x28, 0x6b, 0xf9, 0x42, 0x88, 0xda, 0x01, 
-	0x63, 0xf8, 0xe0, 0x02, 0x8b, 0xa8, 0x42, 0x81, 
-	0xdb, 0x68, 0x8b, 0xa8, 0x6b, 0xf9, 0x42, 0x81, 
-	0xdd, 0x00, 0x63, 0xf8, 0x48, 0x35, 0x21, 0x00, 
-	0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, 
-	0x31, 0xc1, 0x66, 0x78, 0x80, 0x01, 0x48, 0x32, 
-	0x66, 0x78, 0x79, 0x39, 0x29, 0x00, 0xd0, 0x21, 
-	0x21, 0x00, 0x71, 0x39, 0x69, 0x3b, 0x69, 0x20, 
-	0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, 
-	0x6b, 0xfa, 0x49, 0x2a, 0xf0, 0x00, 0xfe, 0xf4, 
-	0x6b, 0xf8, 0x38, 0x06, 0x6e, 0x79, 0x80, 0x08, 
-	0x31, 0x02, 0x66, 0x79, 0xb0, 0x01, 0x48, 0x25, 
-	0xf7, 0xff, 0xff, 0x02, 0x8b, 0x28, 0x6b, 0xf9, 
-	0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xf9, 
-	0x18, 0x41, 0x69, 0x20, 0xf0, 0x14, 0xfa, 0x6c, 
-	0x61, 0xe1, 0xe0, 0x26, 0x6b, 0xf9, 0x31, 0x03, 
-	0x80, 0x01, 0x48, 0x1e, 0x21, 0x01, 0x03, 0xc9, 
-	0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, 
-	0x66, 0x78, 0x80, 0x01, 0x48, 0x1a, 0x66, 0x78, 
-	0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, 
-	0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x17, 
-	0xf0, 0x00, 0xfe, 0xc6, 0x8b, 0x28, 0x6b, 0xf9, 
-	0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xfe, 
-	0x19, 0x81, 0x69, 0x20, 0xb0, 0x01, 0xf0, 0x14, 
-	0xfa, 0x47, 0x1d, 0xf0, 0x30, 0x02, 0x61, 0xe1, 
-	0x63, 0xf8, 0x8b, 0x28, 0x28, 0x00, 0xd1, 0x01, 
-	0x21, 0x00, 0x64, 0xe0, 0x21, 0x10, 0x48, 0x0c, 
-	0x85, 0x01, 0x6b, 0xf9, 0x85, 0x41, 0x21, 0x01, 
-	0x02, 0x49, 0x86, 0x81, 0xb0, 0x06, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, 
-	0x2c, 0x00, 0x02, 0x04, 0x2c, 0x00, 0x02, 0x06, 
-	0x2c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x09, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x40, 0xb0, 0x81, 0x4f, 0x77, 
-	0x63, 0xb8, 0x6a, 0xf9, 0x1a, 0x40, 0x1d, 0xfc, 
-	0x34, 0x79, 0x63, 0xe0, 0x28, 0x00, 0xda, 0x02, 
-	0x6a, 0x79, 0x18, 0x40, 0x63, 0xe0, 0x6b, 0xe0, 
-	0x4b, 0x71, 0x42, 0x98, 0xdc, 0x03, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0xb9, 
-	0x48, 0x6e, 0x1d, 0xc5, 0x35, 0x59, 0x29, 0x00, 
-	0xd1, 0x16, 0x7e, 0x01, 0x29, 0x00, 0xd1, 0x13, 
-	0x21, 0x01, 0x75, 0x01, 0x21, 0x05, 0x84, 0x29, 
-	0x23, 0x0d, 0x06, 0x9b, 0x6c, 0x79, 0x1a, 0xca, 
-	0x68, 0x52, 0x31, 0x08, 0x23, 0x05, 0x02, 0x5b, 
-	0x64, 0x79, 0x66, 0xba, 0x42, 0x99, 0xdb, 0x06, 
-	0x21, 0x01, 0x02, 0xc9, 0x64, 0x79, 0xe0, 0x02, 
-	0x21, 0x00, 0x75, 0x01, 0x84, 0x29, 0x8c, 0x29, 
-	0x1c, 0x4a, 0x6a, 0xfb, 0x1a, 0x9a, 0x07, 0x92, 
-	0x0f, 0x92, 0x18, 0x51, 0x84, 0x29, 0x7e, 0x01, 
-	0x29, 0x00, 0xd0, 0x03, 0x21, 0x00, 0x66, 0x39, 
-	0x66, 0x79, 0x76, 0x01, 0x6c, 0x79, 0x4a, 0x58, 
-	0x69, 0x52, 0x42, 0x91, 0xd0, 0x26, 0x6e, 0x7a, 
-	0x2a, 0x00, 0xd1, 0x10, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc9, 0x68, 0x09, 0x66, 0x79, 0x1c, 0x0a, 
-	0x6e, 0x3b, 0x18, 0x59, 0x66, 0x39, 0x4b, 0x51, 
-	0x42, 0x99, 0xdb, 0x04, 0x32, 0x01, 0x31, 0x01, 
-	0x40, 0x19, 0x66, 0x39, 0x66, 0x7a, 0x6e, 0x79, 
-	0x6d, 0xba, 0x1a, 0x89, 0x65, 0x21, 0x91, 0x00, 
-	0x8c, 0x2b, 0x4e, 0x4b, 0x1a, 0xf3, 0x42, 0x8b, 
-	0xd3, 0x04, 0x63, 0xe1, 0x21, 0x00, 0x65, 0xb9, 
-	0x66, 0x79, 0xe0, 0x0a, 0x18, 0xd1, 0x63, 0xe3, 
-	0x65, 0xb9, 0xe0, 0x06, 0x8c, 0x29, 0x4a, 0x44, 
-	0x1a, 0x51, 0x63, 0xe1, 0x6d, 0xba, 0x18, 0x51, 
-	0x65, 0xb9, 0x49, 0x42, 0x66, 0x61, 0x8c, 0x2a, 
-	0x6b, 0xe1, 0x18, 0x89, 0x31, 0x03, 0x83, 0xa9, 
-	0x22, 0x00, 0x6e, 0x61, 0x80, 0x0a, 0x31, 0x02, 
-	0x22, 0xff, 0x32, 0xe1, 0x66, 0x61, 0x80, 0x0a, 
-	0x31, 0x02, 0x66, 0x61, 0x8b, 0xaa, 0x80, 0x0a, 
-	0x31, 0x02, 0x66, 0x61, 0x7d, 0x00, 0x28, 0x00, 
-	0xd0, 0x1d, 0x4a, 0x37, 0x80, 0x0a, 0x1c, 0x88, 
-	0x66, 0x60, 0x8c, 0x29, 0x02, 0x09, 0x6e, 0xba, 
-	0x0f, 0x52, 0x23, 0x06, 0x40, 0x1a, 0x43, 0x11, 
-	0x23, 0x21, 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 
-	0x66, 0x60, 0x6e, 0xb9, 0x0b, 0x89, 0x23, 0x01, 
-	0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 
-	0x6e, 0xb9, 0x00, 0x49, 0x43, 0x19, 0x80, 0x01, 
-	0x30, 0x02, 0x66, 0x60, 0xe0, 0x0b, 0x20, 0x01, 
-	0x03, 0xc0, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 
-	0x8c, 0x28, 0x02, 0x00, 0x23, 0xff, 0x43, 0x18, 
-	0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 0x48, 0x23, 
-	0x6e, 0x61, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 
-	0x80, 0x08, 0x31, 0x02, 0x22, 0x33, 0x06, 0x52, 
-	0x66, 0x61, 0x00, 0x53, 0x6d, 0x90, 0x18, 0xc2, 
-	0xb4, 0x04, 0x08, 0x5a, 0x6d, 0x50, 0x18, 0xc6, 
-	0x8c, 0x28, 0x4b, 0x1b, 0x18, 0xc1, 0x00, 0x53, 
-	0x6a, 0xf8, 0x18, 0xc0, 0x6b, 0xe2, 0x1c, 0x33, 
-	0xf0, 0x00, 0xfd, 0xbe, 0x6a, 0xf8, 0x6b, 0xe1, 
-	0x18, 0x40, 0x22, 0x33, 0x06, 0x52, 0x62, 0xf8, 
-	0x6d, 0x92, 0xb0, 0x01, 0x42, 0x90, 0xdb, 0x02, 
-	0x6a, 0x79, 0x1a, 0x40, 0x62, 0xf8, 0x21, 0xff, 
-	0x31, 0x11, 0x48, 0x10, 0x85, 0x01, 0x8b, 0xa9, 
-	0x31, 0x06, 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 
-	0x86, 0x81, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0x00, 0x00, 0x0f, 0xee, 0x2e, 0x08, 0x04, 0xa4, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, 
-	0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, 
-	0xb5, 0xb0, 0x1c, 0x07, 0xb0, 0x83, 0x4d, 0x20, 
-	0x6b, 0x28, 0xf7, 0xff, 0xfa, 0x51, 0x48, 0x1f, 
-	0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x03, 
-	0x1f, 0xe9, 0x39, 0x79, 0x69, 0x09, 0x18, 0x40, 
-	0x6e, 0xa9, 0x29, 0x00, 0xd0, 0x22, 0x29, 0x10, 
-	0xd0, 0x20, 0x29, 0x20, 0xd0, 0x24, 0x29, 0x30, 
-	0xd1, 0x04, 0x24, 0x2d, 0x43, 0x44, 0xd5, 0x00, 
-	0x34, 0x3f, 0x11, 0xa4, 0x46, 0x6a, 0xa8, 0x01, 
-	0xa9, 0x02, 0xf7, 0xff, 0xfa, 0x17, 0x1b, 0x38, 
-	0x99, 0x02, 0x1a, 0x08, 0x22, 0x7d, 0x01, 0x52, 
-	0x42, 0x90, 0xdc, 0x01, 0x42, 0x90, 0xda, 0x05, 
-	0x1a, 0x09, 0x91, 0x02, 0x22, 0x00, 0x20, 0x00, 
-	0xf7, 0xff, 0xf9, 0xf2, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x01, 0x04, 0x1a, 0x24, 
-	0xd5, 0x00, 0x34, 0x1f, 0x11, 0x64, 0xe7, 0xe1, 
-	0x21, 0x4b, 0x43, 0x41, 0x20, 0x93, 0xf0, 0x14, 
-	0xf8, 0xd7, 0x1c, 0x04, 0xe7, 0xda, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x83, 0x4c, 0x18, 
-	0x6f, 0x60, 0x30, 0x01, 0x46, 0x6a, 0x67, 0x60, 
-	0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, 0xf9, 0xe6, 
-	0x4b, 0x14, 0x18, 0xf9, 0x98, 0x02, 0x1a, 0x40, 
-	0x4b, 0x13, 0x42, 0x98, 0xdc, 0x04, 0x42, 0xd8, 
-	0xdb, 0x02, 0x69, 0xe0, 0x28, 0x01, 0xd1, 0x07, 
-	0x91, 0x02, 0x20, 0x00, 0x90, 0x01, 0x22, 0x00, 
-	0xf7, 0xff, 0xf9, 0xbe, 0x20, 0x01, 0x61, 0xe0, 
-	0x69, 0xe0, 0x28, 0x00, 0xd0, 0x0b, 0x6b, 0x20, 
-	0xf7, 0xff, 0xf9, 0xea, 0x6f, 0x60, 0x67, 0xa0, 
-	0x48, 0x08, 0x60, 0x07, 0x6f, 0xe0, 0x30, 0x01, 
-	0x67, 0xe0, 0x20, 0x00, 0x61, 0xe0, 0xb0, 0x03, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc4, 0xff, 0xff, 0xec, 0x78, 
-	0x00, 0x02, 0xbf, 0x20, 0x2e, 0x08, 0x05, 0x44, 
-	0xb4, 0xf0, 0x1c, 0x1c, 0x23, 0x00, 0x9f, 0x04, 
-	0x60, 0x3b, 0x79, 0x85, 0x23, 0xc0, 0x40, 0x1d, 
-	0x4b, 0x33, 0x2d, 0x80, 0xd1, 0x16, 0x25, 0x02, 
-	0x60, 0x9d, 0x79, 0xc5, 0x0a, 0x2b, 0xd3, 0x06, 
-	0x7a, 0x45, 0x23, 0xe0, 0x40, 0x2b, 0x2b, 0x20, 
-	0xd1, 0x01, 0x23, 0x09, 0x60, 0x3b, 0x7a, 0x03, 
-	0x33, 0x09, 0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 
-	0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 
-	0x60, 0x22, 0xe0, 0x25, 0x25, 0x06, 0x26, 0x01, 
-	0x60, 0x9e, 0x79, 0x83, 0x2b, 0xff, 0xd1, 0x03, 
-	0x35, 0x01, 0x5d, 0x43, 0x2b, 0xff, 0xd0, 0xfb, 
-	0x5d, 0x46, 0x23, 0xc0, 0x40, 0x33, 0x2b, 0x40, 
-	0xd1, 0x00, 0x35, 0x02, 0x5d, 0x46, 0x09, 0x33, 
-	0x07, 0x9b, 0xd0, 0x08, 0x60, 0x3d, 0x5d, 0x46, 
-	0x09, 0x73, 0xd3, 0x02, 0x1d, 0xeb, 0x33, 0x03, 
-	0xe0, 0x02, 0x1d, 0x6b, 0xe0, 0x00, 0x1c, 0x6b, 
-	0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 
-	0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 
-	0x68, 0x3a, 0x2a, 0x00, 0xd0, 0x20, 0x5c, 0x82, 
-	0x23, 0x0e, 0x40, 0x1a, 0x07, 0x52, 0x60, 0x0a, 
-	0x68, 0x3b, 0x18, 0xc3, 0x78, 0x5b, 0x05, 0x9b, 
-	0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, 
-	0x78, 0x9c, 0x23, 0xfe, 0x40, 0x23, 0x03, 0x9b, 
-	0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, 
-	0x78, 0xdb, 0x01, 0xdb, 0x43, 0x1a, 0x60, 0x0a, 
-	0x68, 0x3b, 0x18, 0xc0, 0x79, 0x00, 0x23, 0xfe, 
-	0x40, 0x18, 0x08, 0x40, 0x43, 0x10, 0x60, 0x08, 
-	0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0xb0, 0xb0, 0x83, 
-	0x48, 0x43, 0x49, 0x44, 0x8d, 0xc9, 0x4c, 0x44, 
-	0x63, 0xe1, 0x29, 0x06, 0xda, 0x03, 0xb0, 0x03, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x01, 
-	0x09, 0x09, 0x01, 0x09, 0x23, 0xff, 0x33, 0xe1, 
-	0x42, 0x99, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, 
-	0xaa, 0x03, 0xab, 0x02, 0x49, 0x39, 0xf7, 0xff, 
-	0xff, 0x6f, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x6b, 0xe1, 
-	0x42, 0x88, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x4f, 0x30, 
-	0x28, 0x00, 0xd0, 0x2e, 0x6e, 0x38, 0x6d, 0xb9, 
-	0x18, 0x40, 0x23, 0x01, 0x06, 0x1b, 0x66, 0x38, 
-	0x42, 0x98, 0xdb, 0x04, 0x43, 0xdb, 0x18, 0xc0, 
-	0x66, 0x38, 0x1e, 0x48, 0x65, 0xb8, 0x23, 0x0d, 
-	0x06, 0x9b, 0x6d, 0xb8, 0x6c, 0xb9, 0x1a, 0xc9, 
-	0x60, 0x08, 0x6e, 0xe0, 0x6c, 0xb9, 0x1a, 0xc9, 
-	0x60, 0x48, 0x20, 0x00, 0x65, 0xb8, 0x6c, 0xb8, 
-	0x30, 0x08, 0x23, 0x05, 0x02, 0x5b, 0x64, 0xb8, 
-	0x42, 0x98, 0xd1, 0x02, 0x20, 0x01, 0x02, 0xc0, 
-	0x64, 0xb8, 0x6c, 0xb8, 0x49, 0x1d, 0x61, 0x48, 
-	0x6d, 0x78, 0x28, 0x04, 0xd1, 0x05, 0x68, 0xe0, 
-	0x28, 0x00, 0xd1, 0x02, 0x6e, 0xe0, 0xf7, 0xff, 
-	0xfe, 0xef, 0x24, 0x33, 0x06, 0x64, 0x00, 0x63, 
-	0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 0x6d, 0x60, 
-	0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 0x98, 0x03, 
-	0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x2b, 
-	0xf0, 0x00, 0xfc, 0x52, 0xb0, 0x01, 0x6d, 0xb8, 
-	0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 0x48, 0x0e, 
-	0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 0x6e, 0x60, 
-	0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 0x48, 0x0a, 
-	0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 0x60, 0x01, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x04, 0xc4, 0x2e, 0x08, 0x05, 0x30, 
-	0x2e, 0x08, 0x04, 0x44, 0xcc, 0x00, 0x0f, 0x00, 
-	0x66, 0x00, 0x00, 0x64, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4e, 0x65, 0x25, 0x00, 0x4f, 0x65, 0x6a, 0xf8, 
-	0xf7, 0xff, 0xf8, 0xc2, 0x48, 0x64, 0x8d, 0xc0, 
-	0x63, 0xf8, 0x28, 0x0a, 0xda, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x34, 
-	0x09, 0x60, 0x01, 0x40, 0x23, 0xff, 0x33, 0xc1, 
-	0x42, 0x98, 0xd0, 0x07, 0x23, 0xff, 0x33, 0xbe, 
-	0x42, 0x9c, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, 
-	0xaa, 0x03, 0xab, 0x02, 0x49, 0x57, 0x1c, 0x30, 
-	0xf7, 0xff, 0xfe, 0xce, 0xb0, 0x01, 0x28, 0x00, 
-	0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 0x18, 0x41, 
-	0x6b, 0xfa, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 
-	0x1c, 0x22, 0x4c, 0x4d, 0x23, 0xff, 0x33, 0xbe, 
-	0x42, 0x9a, 0xd1, 0x3c, 0x5c, 0x30, 0x28, 0xa0, 
-	0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xe0, 0x28, 0x00, 0xd1, 0x1b, 
-	0x20, 0x02, 0x63, 0x78, 0x60, 0xe1, 0x21, 0x00, 
-	0x20, 0x00, 0xf0, 0x09, 0xfd, 0x8d, 0x20, 0x00, 
-	0xf7, 0xfb, 0xfd, 0xd4, 0x98, 0x02, 0x4b, 0x3c, 
-	0x18, 0xc0, 0x79, 0x40, 0x23, 0x30, 0x40, 0x18, 
-	0x66, 0xb8, 0xd0, 0x16, 0x28, 0x10, 0xd0, 0x14, 
-	0x28, 0x20, 0xd0, 0x17, 0x28, 0x30, 0xd1, 0x03, 
-	0x21, 0x20, 0x20, 0x1e, 0xf0, 0x0a, 0xf8, 0xa7, 
-	0x98, 0x00, 0x28, 0x00, 0xd0, 0x2b, 0x6d, 0x60, 
-	0x28, 0x05, 0xd1, 0x28, 0x68, 0xf8, 0x28, 0x00, 
-	0xd1, 0x25, 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x00, 
-	0xe0, 0x21, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x0a, 
-	0xf8, 0x96, 0xe7, 0xed, 0x21, 0x08, 0x20, 0x1e, 
-	0xf0, 0x0a, 0xf8, 0x91, 0xe7, 0xe8, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x08, 0x20, 0x00, 0x63, 0x79, 
-	0x21, 0x00, 0x60, 0xe0, 0xf0, 0x09, 0xfd, 0x58, 
-	0x20, 0x02, 0xf0, 0x09, 0xfd, 0xab, 0x98, 0x00, 
-	0x28, 0x00, 0xd0, 0x08, 0x6d, 0x60, 0x28, 0x05, 
-	0xd1, 0x05, 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x25, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x01, 0x98, 0x02, 0x1d, 0xc5, 
-	0x6b, 0xf8, 0x1b, 0x42, 0x63, 0xfa, 0x7e, 0x39, 
-	0x69, 0x78, 0x18, 0x41, 0x4b, 0x16, 0x18, 0xe8, 
-	0xf7, 0xfb, 0xfb, 0x3a, 0x7e, 0x38, 0x6b, 0xf9, 
-	0x18, 0x40, 0x07, 0x81, 0x0f, 0x89, 0x76, 0x39, 
-	0x1a, 0x44, 0x20, 0x01, 0x06, 0x00, 0x49, 0x15, 
-	0x60, 0x08, 0xf0, 0x17, 0xfe, 0x57, 0x4b, 0x14, 
-	0x40, 0x18, 0xf0, 0x17, 0xfe, 0x57, 0x22, 0x04, 
-	0x49, 0x10, 0xb4, 0x06, 0x23, 0x12, 0x21, 0x1e, 
-	0x69, 0x78, 0x1c, 0x22, 0xf0, 0x0e, 0xfb, 0x66, 
-	0xb0, 0x02, 0xf0, 0x17, 0xfe, 0x47, 0x23, 0x01, 
-	0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xfe, 0x46, 
-	0x69, 0x78, 0x59, 0x01, 0x60, 0x01, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x34, 
-	0x2e, 0x08, 0x04, 0x44, 0x9e, 0x00, 0x08, 0x00, 
-	0xff, 0xfb, 0xff, 0xff, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x81, 0x6e, 0x40, 0x1a, 0x09, 0x48, 0x0f, 
-	0x63, 0xc1, 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc2, 
-	0x3a, 0x79, 0x6a, 0x52, 0x18, 0x89, 0x63, 0xc1, 
-	0x6b, 0xc1, 0x08, 0x89, 0x00, 0x89, 0x23, 0x01, 
-	0x02, 0xdb, 0x63, 0xc1, 0x42, 0x99, 0xdd, 0x0b, 
-	0x4a, 0x07, 0x42, 0x91, 0xdd, 0x00, 0x63, 0xc2, 
-	0x4a, 0x06, 0x49, 0x07, 0x85, 0x8a, 0x6b, 0xc0, 
-	0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x06, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x48, 0x0f, 0x78, 0x01, 
-	0x29, 0x00, 0xd0, 0x1a, 0x49, 0x0e, 0x6c, 0x8a, 
-	0x6c, 0xc9, 0x1a, 0x51, 0x63, 0xc1, 0x1c, 0x0a, 
-	0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc1, 0x39, 0x79, 
-	0x69, 0x09, 0x18, 0x51, 0x63, 0xc1, 0x23, 0x01, 
-	0x03, 0x1b, 0x6b, 0xc1, 0x42, 0x99, 0xdb, 0x08, 
-	0x22, 0xff, 0x32, 0x07, 0x49, 0x05, 0x85, 0x8a, 
-	0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 
-	0x86, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x04, 0xc4, 
-	0x66, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x1f, 0xc0, 
-	0xb4, 0x80, 0x20, 0x00, 0x49, 0x1e, 0x6c, 0x8a, 
-	0x6c, 0xc9, 0x1a, 0x52, 0x49, 0x1d, 0x2a, 0x00, 
-	0xdc, 0x01, 0x69, 0x0b, 0x18, 0xd2, 0x23, 0x01, 
-	0x02, 0xdb, 0x42, 0x9a, 0xdd, 0x00, 0x08, 0xd8, 
-	0x22, 0x33, 0x06, 0x52, 0x6e, 0x93, 0x6e, 0x52, 
-	0x1a, 0x9a, 0x2a, 0x00, 0xdc, 0x01, 0x6a, 0x4b, 
-	0x18, 0xd2, 0x08, 0x92, 0x00, 0x92, 0x4b, 0x14, 
-	0x68, 0xdb, 0x2b, 0x00, 0xd0, 0x06, 0x23, 0x01, 
-	0x03, 0x1b, 0x6a, 0x4f, 0x18, 0xfb, 0x6a, 0x89, 
-	0x1a, 0x59, 0xe0, 0x01, 0x21, 0x01, 0x03, 0x09, 
-	0x42, 0x8a, 0xdd, 0x04, 0x04, 0x00, 0x0c, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 0x28, 0x00, 
-	0xd0, 0x0b, 0x4b, 0x0a, 0x42, 0x9a, 0xdd, 0x00, 
-	0x1c, 0x1a, 0x21, 0x06, 0x43, 0x01, 0x48, 0x08, 
-	0x85, 0x81, 0x85, 0xc2, 0x21, 0x09, 0x02, 0x49, 
-	0x86, 0xc1, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x4f, 0x13, 0x6d, 0x39, 0x29, 0x00, 
-	0xd1, 0x10, 0x24, 0x01, 0x28, 0x01, 0xd0, 0x10, 
-	0x28, 0x04, 0xd0, 0x15, 0x28, 0x05, 0xd1, 0x09, 
-	0xf7, 0xff, 0xf8, 0x48, 0xf7, 0xfe, 0xff, 0xfc, 
-	0x20, 0x00, 0x66, 0xf8, 0x67, 0x38, 0x20, 0x05, 
-	0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf1, 0x65, 0x3c, 
-	0x65, 0x7c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x34, 0x20, 0x04, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x4f, 0x23, 0x6d, 0x39, 0x29, 0x00, 
-	0xd0, 0x0e, 0x29, 0x02, 0xd1, 0x09, 0x6d, 0x78, 
-	0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x27, 
-	0x28, 0x05, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0xff, 
-	0xf8, 0xc7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x24, 0x02, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 
-	0xd0, 0x12, 0x28, 0x05, 0xd1, 0xf5, 0x20, 0x00, 
-	0xf7, 0xff, 0xf8, 0xba, 0x20, 0x05, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x38, 0x20, 0x01, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xff, 0xf8, 0x70, 0x20, 0x04, 0x65, 0x78, 
-	0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0xf0, 
-	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0xec, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 
-	0xf0, 0x09, 0xfc, 0x4c, 0x20, 0xff, 0x49, 0x03, 
-	0x70, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xf0, 0x4f, 0x2b, 0x24, 0x00, 0x6d, 0x38, 
-	0x28, 0x01, 0xd0, 0x1e, 0x28, 0x02, 0xd1, 0x19, 
-	0x26, 0x03, 0x6d, 0x78, 0x1d, 0xfd, 0x35, 0x79, 
-	0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x3f, 
-	0x28, 0x05, 0xd1, 0x0f, 0x20, 0x02, 0x63, 0x6c, 
-	0xf0, 0x09, 0xfc, 0x2c, 0x20, 0x00, 0xf7, 0xfb, 
-	0xfc, 0x1d, 0xf7, 0xff, 0xf8, 0x21, 0x65, 0x3e, 
-	0x20, 0x00, 0x65, 0x78, 0xf7, 0xfe, 0xfe, 0xb8, 
-	0x20, 0x01, 0x61, 0xe8, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x0c, 
-	0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0xf5, 
-	0xf7, 0xfe, 0xff, 0x82, 0xf7, 0xfe, 0xff, 0xd8, 
-	0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xfe, 0xff, 0x79, 0x65, 0x3c, 
-	0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xfe, 0xff, 0xca, 0x65, 0x3c, 0x65, 0x7c, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x6c, 
-	0x20, 0x02, 0x60, 0xfc, 0xf0, 0x09, 0xfb, 0xfa, 
-	0x20, 0x00, 0xf7, 0xfb, 0xfb, 0xeb, 0x65, 0x7c, 
-	0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf7, 0xfe, 0xff, 0xea, 0x65, 0x7c, 0x65, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x4c, 0x1b, 
-	0x68, 0xe0, 0x28, 0x03, 0xd0, 0x1f, 0x1f, 0xe7, 
-	0x3f, 0x79, 0x6d, 0x38, 0x28, 0x02, 0xd1, 0x1a, 
-	0x6d, 0x78, 0x28, 0x01, 0xd0, 0x1a, 0x28, 0x04, 
-	0xd0, 0x20, 0x28, 0x05, 0xd1, 0x13, 0x4a, 0x14, 
-	0x49, 0x14, 0x48, 0x15, 0xf7, 0xfe, 0xfe, 0x4a, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0x68, 
-	0x20, 0x01, 0xf0, 0x09, 0xfb, 0xcb, 0x20, 0x03, 
-	0x60, 0xe0, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0x01, 0xf0, 0x09, 0xfb, 0xc3, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0xf0, 0x09, 
-	0xfb, 0xbd, 0x20, 0x00, 0x70, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0b, 
-	0xf0, 0x0b, 0xff, 0x4e, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x48, 
-	0x2e, 0x08, 0x05, 0x4c, 0xb5, 0xf0, 0x4c, 0x21, 
-	0x6d, 0x20, 0x28, 0x02, 0xd1, 0x24, 0x26, 0xff, 
-	0x6d, 0x60, 0x1d, 0xe7, 0x37, 0x79, 0x28, 0x01, 
-	0xd0, 0x1d, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x05, 
-	0xd1, 0x1a, 0x20, 0x01, 0xf0, 0x09, 0xfb, 0x96, 
-	0x25, 0x00, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x04, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xfb, 0x38, 
-	0x60, 0xe5, 0x70, 0x3e, 0x68, 0xf8, 0x28, 0x03, 
-	0xd1, 0x14, 0x48, 0x13, 0x22, 0x00, 0x68, 0x41, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xe5, 0x6b, 0x38, 
-	0xf7, 0xfe, 0xfe, 0x16, 0xe0, 0x0f, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x11, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x61, 0xf8, 
-	0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x05, 0x20, 0x02, 
-	0x60, 0xfd, 0xf0, 0x09, 0xfb, 0x6b, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x05, 0x44, 0xb5, 0xb0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x2f, 0x3f, 0xdd, 0x00, 0x27, 0x3f, 0x48, 0x17, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x13, 0x6d, 0x40, 
-	0x25, 0x02, 0x4c, 0x15, 0x28, 0x04, 0xd0, 0x11, 
-	0x28, 0x05, 0xd1, 0x0c, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x0b, 0xfe, 0xe2, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0b, 0xfe, 0xde, 0x20, 0x22, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xfe, 0xda, 0x60, 0xe5, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x0b, 0xfe, 0xd2, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x0b, 0xfe, 0xce, 0x20, 0x22, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xfe, 0xca, 0x20, 0x00, 0xf7, 0xfe, 
-	0xfd, 0xc3, 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, 
-	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, 
-	0x21, 0x00, 0x20, 0x16, 0xf0, 0x0b, 0xfe, 0xb0, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xa9, 0x21, 0x00, 
-	0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, 
-	0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, 
-	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, 
-	0x21, 0x00, 0x20, 0x1a, 0xf0, 0x0b, 0xfe, 0x94, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0x8d, 0x21, 0x00, 
-	0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
-	0x2e, 0x08, 0x04, 0xc4, 0x48, 0x03, 0x6d, 0x00, 
-	0x28, 0x00, 0xd1, 0x00, 0x47, 0x70, 0x20, 0xff, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x52, 
-	0x6d, 0x29, 0x48, 0x52, 0x26, 0x00, 0x29, 0x01, 
-	0xd0, 0x4c, 0x29, 0x02, 0xd1, 0x6e, 0x6d, 0x69, 
-	0x29, 0x01, 0xd0, 0x20, 0x29, 0x04, 0xd0, 0x2e, 
-	0x29, 0x05, 0xd1, 0x3e, 0x6c, 0xc1, 0x6c, 0x80, 
-	0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 
-	0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 
-	0xfc, 0x1b, 0x70, 0x20, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 
-	0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 
-	0x6a, 0x68, 0xf0, 0x13, 0xfc, 0x0d, 0x70, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0xc1, 
-	0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 
-	0xf0, 0x13, 0xfb, 0xfe, 0x70, 0x20, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 
-	0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xec, 
-	0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x6d, 0x69, 0x29, 0x01, 
-	0xd0, 0x21, 0x29, 0x04, 0xd0, 0x2f, 0x29, 0x05, 
-	0xd1, 0x3f, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, 
-	0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xfb, 0xd0, 
-	0x70, 0x20, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, 
-	0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 
-	0xf0, 0x13, 0xfb, 0xc2, 0x70, 0x38, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe0, 0x26, 0x69, 0x69, 
-	0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, 
-	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 
-	0xf0, 0x13, 0xfb, 0xb2, 0x70, 0x20, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, 
-	0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, 
-	0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 
-	0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xa0, 
-	0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, 
-	0x1c, 0x0d, 0x21, 0x00, 0x1c, 0x1c, 0x42, 0xba, 
-	0xda, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x42, 0xa0, 0xd3, 0x01, 0x42, 0xb0, 
-	0xd9, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x19, 0xc1, 0x42, 0xb1, 0xd9, 0x0c, 
-	0x1a, 0x32, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x29, 
-	0xf7, 0xfa, 0xff, 0xc2, 0x6c, 0x30, 0x1a, 0x3a, 
-	0x18, 0x29, 0x1c, 0x20, 0xf7, 0xfa, 0xff, 0xbc, 
-	0xe0, 0x03, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfa, 
-	0xff, 0xb7, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, 
-	0x1c, 0x05, 0x20, 0x00, 0x1c, 0x1c, 0x42, 0xba, 
-	0xdb, 0x18, 0x42, 0xa1, 0xd3, 0x16, 0x42, 0xb1, 
-	0xd2, 0x14, 0x19, 0xc8, 0x42, 0xb0, 0xd9, 0x0c, 
-	0x1a, 0x72, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x28, 
-	0xf7, 0xfa, 0xff, 0x9a, 0x6c, 0x30, 0x1a, 0x3a, 
-	0x18, 0x28, 0x1c, 0x21, 0xf7, 0xfa, 0xff, 0x94, 
-	0xe0, 0x03, 0x1c, 0x28, 0x1c, 0x3a, 0xf7, 0xfa, 
-	0xff, 0x8f, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, 
-	0x47, 0x70, 0xb5, 0x00, 0xb0, 0x82, 0x46, 0x6a, 
-	0x49, 0x06, 0xa8, 0x01, 0xf7, 0xfe, 0xfc, 0x4e, 
-	0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfd, 0x6c, 
-	0x20, 0x03, 0x49, 0x03, 0x61, 0x08, 0xb0, 0x02, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0x58, 
-	0x2e, 0x08, 0x05, 0x44, 0xb5, 0x80, 0x4f, 0x0b, 
-	0x22, 0x00, 0x20, 0x00, 0x69, 0x79, 0xf7, 0xfe, 
-	0xfc, 0x23, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 
-	0xfd, 0x57, 0x21, 0x01, 0x1f, 0xf8, 0x38, 0x79, 
-	0x61, 0xc1, 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x4c, 
-	0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x44, 
-	0xb5, 0x80, 0x4f, 0x06, 0x68, 0x38, 0x1d, 0xc1, 
-	0x31, 0xb5, 0x20, 0x2f, 0x02, 0x80, 0xf0, 0x13, 
-	0xfa, 0xfb, 0x60, 0x39, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5c, 0x9c, 
-	0x48, 0x05, 0x8f, 0xc1, 0x29, 0x00, 0xd0, 0x05, 
-	0x21, 0x00, 0x87, 0xc1, 0x48, 0x03, 0x69, 0x01, 
-	0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x5c, 
-	0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x48, 0x03, 
-	0x69, 0x41, 0x31, 0x01, 0x61, 0x41, 0x47, 0x70, 
-	0x2e, 0x08, 0x47, 0x50, 0x2e, 0x08, 0x05, 0x5c, 
-	0xb5, 0x00, 0xb0, 0x88, 0x46, 0x68, 0xf0, 0x0e, 
-	0xf8, 0xfd, 0x48, 0x07, 0x69, 0x81, 0x31, 0x01, 
-	0x23, 0x01, 0x22, 0x06, 0x61, 0x81, 0x21, 0x47, 
-	0x02, 0x49, 0x05, 0x48, 0xf0, 0x0d, 0xff, 0xea, 
-	0xb0, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0x5c, 0xb5, 0x80, 0x1c, 0x07, 
-	0x20, 0xff, 0x30, 0xcd, 0xb0, 0x85, 0x90, 0x00, 
-	0x20, 0x01, 0x02, 0x40, 0x90, 0x02, 0x48, 0x0e, 
-	0x90, 0x04, 0x20, 0x0e, 0xab, 0x03, 0x80, 0x18, 
-	0x46, 0x68, 0xf0, 0x0e, 0xf9, 0x0f, 0x2f, 0x00, 
-	0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc7, 0x98, 0x02, 
-	0x1e, 0x79, 0xf0, 0x00, 0xfb, 0x21, 0x98, 0x02, 
-	0x1a, 0x38, 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x5c, 
-	0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 
-	0xf0, 0x09, 0xfd, 0x76, 0x48, 0x04, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x00, 0xf9, 0xe4, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x58, 0xb5, 0xf0, 0x48, 0x53, 
-	0x4e, 0x53, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x53, 
-	0x86, 0xe7, 0x86, 0xa7, 0x48, 0x52, 0x60, 0x07, 
-	0xf0, 0x05, 0xfc, 0x76, 0x48, 0x51, 0xf0, 0x0e, 
-	0xfd, 0x23, 0xf7, 0xfa, 0xfe, 0x71, 0x21, 0xff, 
-	0x48, 0x4f, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, 
-	0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, 
-	0x4a, 0x4c, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, 
-	0xfa, 0xf7, 0x20, 0x01, 0xf7, 0xff, 0xff, 0xa2, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xf8, 0xb4, 
-	0xf0, 0x01, 0xfa, 0xac, 0x48, 0x46, 0x60, 0x07, 
-	0x25, 0x02, 0x48, 0x46, 0x60, 0x05, 0x20, 0x03, 
-	0x49, 0x45, 0x60, 0x08, 0x49, 0x45, 0x60, 0x08, 
-	0x49, 0x45, 0x60, 0x0d, 0x49, 0x45, 0x60, 0x08, 
-	0x48, 0x45, 0x60, 0x07, 0x48, 0x45, 0x65, 0x87, 
-	0xf0, 0x00, 0xf9, 0x84, 0xf0, 0x0e, 0xfd, 0x90, 
-	0x20, 0x00, 0xf0, 0x0c, 0xfa, 0xcd, 0x28, 0x00, 
-	0xd1, 0x60, 0x48, 0x41, 0xf0, 0x08, 0xff, 0x06, 
-	0x20, 0x00, 0xf0, 0x08, 0xff, 0x77, 0x87, 0xe7, 
-	0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, 
-	0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x0b, 
-	0xff, 0x73, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, 
-	0xfc, 0x53, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xab, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xbf, 0xf0, 0x04, 
-	0xfb, 0x8d, 0xf0, 0x04, 0xfb, 0xcb, 0xf7, 0xfb, 
-	0xf8, 0xe5, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfc, 
-	0xff, 0xf5, 0xf7, 0xfd, 0xfb, 0xa3, 0xf7, 0xfb, 
-	0xfc, 0x11, 0x20, 0xff, 0xf7, 0xfa, 0xff, 0x2c, 
-	0x05, 0xa8, 0xf0, 0x17, 0xf9, 0x8a, 0x49, 0x29, 
-	0x20, 0x17, 0xf0, 0x17, 0xf9, 0x93, 0x49, 0x28, 
-	0x20, 0x08, 0xf0, 0x17, 0xf9, 0x8f, 0xf0, 0x17, 
-	0xf9, 0x85, 0x4b, 0x26, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x85, 0x01, 0xe8, 0xf0, 0x17, 0xf9, 0x79, 
-	0x48, 0x23, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, 
-	0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, 0xfe, 0x84, 
-	0xf0, 0x01, 0xfa, 0xd2, 0x49, 0x1f, 0x20, 0x04, 
-	0xf0, 0x17, 0xf9, 0x78, 0xf0, 0x17, 0xf9, 0x6e, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x6d, 0x20, 0x10, 0xf0, 0x17, 0xf9, 0x61, 
-	0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, 
-	0xfd, 0x91, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x04, 0x94, 0x07, 0x77, 0x77, 0x20, 
-	0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x5c, 
-	0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 
-	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, 
-	0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, 
-	0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, 
-	0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x56, 0x25, 
-	0x2e, 0x00, 0x56, 0x45, 0xff, 0xff, 0xfe, 0xff, 
-	0x2e, 0x08, 0x47, 0x50, 0x2e, 0x00, 0x56, 0x05, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x69, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
-	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf9, 0x20, 0xf0, 0x17, 0xf9, 0x16, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf9, 0x15, 0xf0, 0x17, 0xf9, 0x81, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x03, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x3d, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
-	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0xf4, 0xf0, 0x17, 0xf8, 0xea, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0xe9, 0xf0, 0x17, 0xf9, 0x55, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf9, 0x15, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
-	0xf0, 0x17, 0xf8, 0xd4, 0x23, 0x02, 0x43, 0x18, 
-	0xf0, 0x17, 0xf8, 0xd4, 0xf0, 0x17, 0xf9, 0x40, 
-	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x03, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf9, 0x01, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
-	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0xb8, 0xf0, 0x17, 0xf8, 0xae, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0xad, 0xf0, 0x17, 0xf9, 0x19, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x04, 0x00, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, 
-	0xf8, 0xd5, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
-	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
-	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
-	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
-	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
-	0xf0, 0x17, 0xf8, 0x8c, 0xf0, 0x17, 0xf8, 0x82, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 
-	0xf8, 0x81, 0xf0, 0x17, 0xf8, 0xed, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
-	0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf8, 0xad, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
-	0xf0, 0x17, 0xf8, 0x6c, 0x23, 0x20, 0x43, 0x18, 
-	0xf0, 0x17, 0xf8, 0x6c, 0xf0, 0x17, 0xf8, 0xd8, 
-	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x04, 0x00, 
-	0xb5, 0x00, 0x48, 0x0b, 0x68, 0x41, 0x31, 0x14, 
-	0x60, 0x41, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, 
-	0x48, 0x08, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x58, 
-	0xbc, 0x08, 0x47, 0x18, 0x48, 0x04, 0x21, 0x10, 
-	0xf0, 0x09, 0xfc, 0x82, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x04, 0xf8, 
-	0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x00, 0xf0, 0x17, 
-	0xf8, 0x7d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41, 
-	0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x17, 
-	0xf8, 0x41, 0xf0, 0x17, 0xf8, 0x37, 0x23, 0x80, 
-	0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x36, 
-	0xf0, 0x17, 0xf8, 0xa2, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5a, 0x45, 
-	0x48, 0x01, 0x68, 0x40, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x90, 0x49, 0x0d, 
-	0x1c, 0x0f, 0x48, 0x0d, 0x24, 0x1e, 0x22, 0x10, 
-	0x1c, 0x23, 0xf0, 0x09, 0xfd, 0x83, 0x22, 0x02, 
-	0x21, 0x10, 0x1c, 0x38, 0x1c, 0x23, 0xf0, 0x05, 
-	0xff, 0xeb, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x17, 
-	0xf8, 0x19, 0xf0, 0x17, 0xf8, 0x0f, 0x4b, 0x06, 
-	0x40, 0x18, 0xf0, 0x17, 0xf8, 0x0f, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5b, 0x09, 
-	0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0xb0, 0x86, 
-	0x46, 0x68, 0x49, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
-	0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
-	0x48, 0x09, 0xab, 0x00, 0xcb, 0x0e, 0xb0, 0x03, 
-	0xf0, 0x09, 0xfd, 0x88, 0xb0, 0x03, 0x48, 0x07, 
-	0x68, 0x01, 0x08, 0x4a, 0xd3, 0x04, 0x08, 0x49, 
-	0x00, 0x49, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, 
-	0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x00, 0x04, 
-	0xb5, 0x80, 0x29, 0x0c, 0xd2, 0x00, 0x21, 0x0c, 
-	0x31, 0x07, 0x08, 0xc9, 0x00, 0xc9, 0x27, 0x00, 
-	0x68, 0x02, 0x42, 0x82, 0xd0, 0x03, 0x68, 0x93, 
-	0x42, 0x8b, 0xd3, 0x0d, 0x1c, 0x17, 0x2f, 0x00, 
-	0xd0, 0x1e, 0x68, 0xb8, 0x1a, 0x42, 0x2a, 0x0c, 
-	0xd2, 0x00, 0x1c, 0x01, 0x1a, 0x42, 0xd1, 0x05, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x76, 0xe0, 0x0c, 
-	0x68, 0x12, 0xe7, 0xea, 0x1d, 0xca, 0x32, 0x01, 
-	0x1a, 0x80, 0x60, 0xb8, 0x19, 0xc0, 0x1d, 0xc7, 
-	0x37, 0x01, 0x20, 0x00, 0x60, 0x38, 0x60, 0x78, 
-	0x60, 0xb9, 0x68, 0xb8, 0x60, 0x38, 0x1d, 0xf8, 
-	0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xb0, 0x1f, 0xcc, 0x3c, 0x01, 0x68, 0x21, 
-	0x19, 0x0a, 0x60, 0xa1, 0x68, 0x07, 0x32, 0x08, 
-	0x42, 0x87, 0xd1, 0x06, 0x68, 0x41, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x48, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x42, 0x97, 0xd1, 0x0f, 0x68, 0x7d, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x46, 0x68, 0xa0, 
-	0x68, 0xb9, 0x18, 0x40, 0x30, 0x08, 0x60, 0xa0, 
-	0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x36, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xbb, 
-	0x19, 0xdb, 0x33, 0x08, 0x42, 0xa3, 0xd1, 0x13, 
-	0x68, 0xb8, 0x18, 0x40, 0x30, 0x08, 0x60, 0xb8, 
-	0x19, 0xc0, 0x68, 0x3c, 0x30, 0x08, 0x42, 0xa0, 
-	0xd1, 0xdc, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x29, 
-	0x68, 0xb8, 0x68, 0xa1, 0x18, 0x40, 0x30, 0x08, 
-	0x60, 0xb8, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x42, 0xbc, 0xd2, 0x06, 0x68, 0x79, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x14, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x3f, 0xe7, 0xc0, 0xb5, 0x00, 
-	0x31, 0x10, 0x32, 0x01, 0x1c, 0x0b, 0x1a, 0x51, 
-	0x39, 0x08, 0x60, 0x99, 0x60, 0x00, 0x1c, 0x01, 
-	0x60, 0x40, 0x1c, 0x18, 0xf0, 0x00, 0xf8, 0x02, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0x0a, 0x60, 0x02, 
-	0x60, 0x08, 0x68, 0x02, 0x60, 0x50, 0x60, 0x41, 
-	0x47, 0x70, 0xc8, 0x06, 0x38, 0x08, 0x60, 0x11, 
-	0xc8, 0x03, 0x60, 0x41, 0x47, 0x70, 0xb5, 0x00, 
-	0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 
-	0xff, 0xde, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf0, 0x16, 0xff, 0x38, 0x23, 0x11, 0x05, 0x1b, 
-	0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xff, 0x36, 
-	0x1c, 0x39, 0x48, 0x05, 0xf7, 0xff, 0xff, 0x50, 
-	0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xff, 0x2e, 
-	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xff, 0x41, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 
-	0xb5, 0x90, 0x1c, 0x07, 0xd0, 0x0e, 0xf0, 0x16, 
-	0xff, 0x15, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 
-	0x43, 0x18, 0xf0, 0x16, 0xff, 0x13, 0x1c, 0x39, 
-	0x48, 0x04, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x20, 
-	0xf0, 0x16, 0xff, 0x0c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 
-	0xb5, 0x00, 0x4a, 0x04, 0xc2, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x97, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xff, 0x11, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, 
-	0xb5, 0x00, 0x49, 0x08, 0x68, 0x0a, 0x42, 0x90, 
-	0xd3, 0x02, 0x68, 0x49, 0x42, 0x88, 0xd9, 0x03, 
-	0xf7, 0xff, 0xff, 0xc6, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x30, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x4a, 0x05, 
-	0x60, 0x90, 0x60, 0xd1, 0x1c, 0x0a, 0x1c, 0x01, 
-	0x48, 0x03, 0xf7, 0xff, 0xff, 0x68, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01, 
-	0x48, 0x02, 0xf7, 0xff, 0xfe, 0xe1, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, 
-	0xb5, 0x00, 0x49, 0x08, 0x68, 0x8a, 0x42, 0x90, 
-	0xd3, 0x02, 0x68, 0xc9, 0x42, 0x88, 0xd9, 0x03, 
-	0xf7, 0xff, 0xff, 0x96, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, 
-	0x91, 0x00, 0x06, 0x16, 0x0e, 0x36, 0x00, 0xbd, 
-	0x4c, 0x15, 0x59, 0x60, 0x28, 0x00, 0xd1, 0x15, 
-	0xf7, 0xfb, 0xf9, 0x10, 0x22, 0x00, 0xb4, 0x04, 
-	0x23, 0x00, 0x22, 0x02, 0x99, 0x01, 0x1c, 0x38, 
-	0xf0, 0x05, 0xf9, 0xaa, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x1c, 0x38, 0xb0, 0x01, 
-	0xf0, 0x05, 0xfb, 0x66, 0x20, 0x03, 0x00, 0x71, 
-	0x4a, 0x0a, 0x52, 0x50, 0x59, 0x60, 0x30, 0x01, 
-	0x51, 0x60, 0x48, 0x09, 0x23, 0x14, 0x5e, 0xc1, 
-	0x29, 0x00, 0xd1, 0x02, 0x49, 0x07, 0x4a, 0x08, 
-	0x65, 0xd1, 0x8a, 0x81, 0x31, 0x01, 0x82, 0x81, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x02, 0x5c, 0x10, 0x2e, 0x08, 0x49, 0x70, 
-	0x2e, 0x08, 0x07, 0x5c, 0x2e, 0x02, 0x5a, 0x20, 
-	0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xb0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0x00, 0xb9, 
-	0x48, 0x1b, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42, 
-	0x24, 0x00, 0x2a, 0x00, 0xd1, 0x1f, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x05, 0xfb, 0x32, 0x22, 0x00, 0xb4, 0x04, 
-	0x1c, 0x38, 0x1c, 0x23, 0x49, 0x13, 0xf0, 0x05, 
-	0xf9, 0x67, 0x00, 0x69, 0xb0, 0x01, 0x48, 0x12, 
-	0x52, 0x44, 0x48, 0x10, 0x4a, 0x11, 0x52, 0x50, 
-	0x00, 0x79, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x6a, 
-	0x19, 0x52, 0x00, 0x92, 0x4b, 0x0f, 0x18, 0xd1, 
-	0x81, 0x0c, 0x52, 0x98, 0x80, 0x48, 0x48, 0x0e, 
-	0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, 0x23, 0x14, 
-	0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7, 
-	0x00, 0xc0, 0x49, 0x0a, 0x65, 0xc8, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0x5c, 0x10, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, 
-	0x2e, 0x08, 0x07, 0x5c, 0xa0, 0x00, 0x0d, 0x00, 
-	0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, 
-	0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, 
-	0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, 
-	0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, 
-	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, 
-	0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, 
-	0xff, 0x55, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, 
-	0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, 
-	0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x5a, 
-	0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69, 
-	0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09, 
-	0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00, 
-	0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00, 
-	0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13, 
-	0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b, 
-	0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00, 
-	0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, 
-	0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00, 
-	0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, 
-	0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21, 
-	0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09, 
-	0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e, 
-	0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 
-	0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 
-	0xfc, 0x37, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a, 
-	0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 
-	0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 
-	0xf7, 0xfc, 0xfc, 0x40, 0xb0, 0x01, 0xe0, 0x0d, 
-	0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 
-	0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 
-	0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 
-	0xfc, 0x4b, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00, 
-	0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92, 
-	0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46, 
-	0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01, 
-	0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, 
-	0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17, 
-	0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00, 
-	0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53, 
-	0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02, 
-	0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01, 
-	0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 
-	0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00, 
-	0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f, 
-	0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 
-	0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef, 
-	0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 
-	0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed, 
-	0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a, 
-	0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c, 
-	0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, 
-	0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f, 
-	0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, 
-	0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54, 
-	0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e, 
-	0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 
-	0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 
-	0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5, 
-	0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, 
-	0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f, 
-	0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00, 
-	0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, 
-	0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01, 
-	0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 
-	0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14, 
-	0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, 
-	0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01, 
-	0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, 
-	0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f, 
-	0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47, 
-	0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, 
-	0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec, 
-	0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00, 
-	0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, 
-	0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0xb0, 
-	0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xb9, 0x6a, 
-	0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, 
-	0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97, 
-	0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10, 
-	0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29, 
-	0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02, 
-	0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01, 
-	0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e, 
-	0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a, 
-	0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01, 
-	0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b, 
-	0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53, 
-	0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00, 
-	0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e, 
-	0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2, 
-	0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05, 
-	0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39, 
-	0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01, 
-	0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xce, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, 
-	0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcb, 0x04, 0x38, 
-	0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x48, 0xf8, 
-	0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, 
-	0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b, 
-	0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99, 
-	0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x47, 0x78, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, 
-	0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, 
-	0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x03, 0x20, 0x00, 
-	0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04, 
-	0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 
-	0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x47, 0x78, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42, 
-	0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12, 
-	0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03, 
-	0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x05, 0xfd, 0xec, 
-	0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09, 
-	0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00, 
-	0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12, 
-	0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c, 
-	0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e, 
-	0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 
-	0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10, 
-	0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04, 
-	0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00, 
-	0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81, 
-	0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05, 
-	0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, 
-	0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x49, 0xe8, 
-	0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4, 
-	0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50, 
-	0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a, 
-	0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xe8, 
-	0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 
-	0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20, 
-	0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x49, 0xe8, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, 
-	0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, 
-	0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x1d, 
-	0x1c, 0x0e, 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x58, 
-	0x1c, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x03, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, 
-	0x04, 0x09, 0x0c, 0x09, 0x88, 0x2a, 0x42, 0x91, 
-	0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a, 
-	0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00, 
-	0x7a, 0xb9, 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11, 
-	0x05, 0x0b, 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05, 
-	0x27, 0x00, 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x32, 
-	0x2b, 0x00, 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09, 
-	0xd1, 0x00, 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85, 
-	0x1b, 0x5b, 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00, 
-	0xdc, 0xf4, 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x26, 
-	0x88, 0x06, 0x96, 0x03, 0x88, 0x85, 0x95, 0x02, 
-	0x78, 0xc8, 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18, 
-	0x05, 0x00, 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01, 
-	0xd0, 0x01, 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d, 
-	0x02, 0x2d, 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed, 
-	0x0c, 0xed, 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01, 
-	0x2b, 0x03, 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b, 
-	0x78, 0x8d, 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb, 
-	0x9d, 0x02, 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01, 
-	0x1d, 0x43, 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00, 
-	0xdd, 0x0a, 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00, 
-	0x37, 0x01, 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40, 
-	0x18, 0x59, 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4, 
-	0x2a, 0x00, 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x09, 
-	0xf7, 0xff, 0xff, 0x62, 0x99, 0x00, 0x48, 0x09, 
-	0x80, 0x01, 0x2f, 0x00, 0xd1, 0x07, 0xf7, 0xfa, 
-	0xf8, 0x45, 0xe0, 0x04, 0x98, 0x01, 0xf7, 0xff, 
-	0xff, 0x37, 0xf0, 0x00, 0xf8, 0x23, 0x20, 0x00, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x00, 0x08, 
-	0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f, 
-	0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80, 
-	0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41, 
-	0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a, 
-	0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70, 
-	0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x4a, 0xe8, 
-	0x2e, 0x08, 0x4b, 0xe8, 0xb5, 0x90, 0x4f, 0x13, 
-	0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00, 
-	0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41, 
-	0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40, 
-	0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff, 
-	0x21, 0x02, 0xf7, 0xff, 0xfe, 0xbb, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01, 
-	0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x08, 0x4b, 0xe8, 0x2e, 0x08, 0x4a, 0xe8, 
-	0x2e, 0x00, 0x64, 0x57, 0xb5, 0xf0, 0x04, 0x05, 
-	0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, 
-	0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20, 
-	0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x77, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, 
-	0xf7, 0xff, 0xfe, 0xce, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21, 
-	0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0, 
-	0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xc0, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20, 
-	0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4, 
-	0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38, 
-	0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00, 
-	0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa, 
-	0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff, 
-	0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00, 
-	0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff, 
-	0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff, 
-	0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff, 
-	0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff, 
-	0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f, 
-	0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff, 
-	0xfe, 0x9b, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00, 
-	0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e, 
-	0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd, 
-	0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78, 
-	0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00, 
-	0xf7, 0xff, 0xfe, 0x28, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x74, 
-	0x2e, 0x00, 0x66, 0x19, 0x56, 0x47, 0x41, 0x38, 
-	0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81, 
-	0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x0d, 0xfe, 0x7a, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x27, 0x00, 
-	0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01, 
-	0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff, 
-	0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00, 
-	0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0, 
-	0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b, 
-	0xf0, 0x0e, 0xf8, 0xe2, 0xb0, 0x02, 0x97, 0x00, 
-	0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, 
-	0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, 
-	0x46, 0x69, 0xf0, 0x0e, 0xf8, 0x13, 0xf7, 0xff, 
-	0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x03, 
-	0xfb, 0xfd, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, 
-	0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, 
-	0xf0, 0x03, 0xfc, 0x0c, 0x27, 0x00, 0x22, 0x00, 
-	0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03, 
-	0xff, 0xcf, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, 
-	0x1c, 0x3b, 0xf0, 0x03, 0xff, 0x67, 0x22, 0x32, 
-	0x21, 0x32, 0x20, 0x07, 0xf0, 0x03, 0xfc, 0xc2, 
-	0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, 
-	0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, 
-	0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d, 
-	0xff, 0xdd, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x01, 0x00, 
-	0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb, 
-	0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09, 
-	0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a, 
-	0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a, 
-	0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a, 
-	0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a, 
-	0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a, 
-	0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff, 
-	0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb, 
-	0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2, 
-	0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, 
-	0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb, 
-	0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b, 
-	0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19, 
-	0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2, 
-	0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, 
-	0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb, 
-	0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b, 
-	0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23, 
-	0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0, 
-	0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x98, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x23, 0x00, 
-	0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, 
-	0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, 
-	0xf0, 0x12, 0xf9, 0x96, 0x19, 0x41, 0x23, 0x00, 
-	0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92, 
-	0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01, 
-	0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00, 
-	0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, 
-	0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4, 
-	0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00, 
-	0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98, 
-	0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xb0, 0xb5, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 
-	0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f, 
-	0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, 
-	0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00, 
-	0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00, 
-	0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, 
-	0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12, 
-	0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, 
-	0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, 
-	0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03, 
-	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, 
-	0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
-	0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00, 
-	0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00, 
-	0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff, 
-	0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00, 
-	0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36, 
-	0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85, 
-	0xf0, 0x12, 0xf9, 0x2a, 0xa3, 0x72, 0xcb, 0x0c, 
-	0xf0, 0x12, 0xf9, 0x36, 0xf0, 0x12, 0xf9, 0x38, 
-	0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, 
-	0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf9, 0x1b, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf9, 0x27, 0xf0, 0x12, 0xf9, 0x29, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf9, 0x0d, 0xa3, 0x64, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf9, 0x19, 0xf0, 0x12, 
-	0xf9, 0x1b, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, 
-	0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xff, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf9, 0x0b, 0xf0, 0x12, 0xf9, 0x0d, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xf1, 0xa3, 0x56, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xfd, 0xf0, 0x12, 
-	0xf8, 0xff, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, 
-	0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xe3, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xef, 0xf0, 0x12, 0xf8, 0xf1, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xd5, 0xa3, 0x48, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xe1, 0xf0, 0x12, 
-	0xf8, 0xe3, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, 
-	0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xc7, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xd3, 0xf0, 0x12, 0xf8, 0xd5, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xb9, 0xa3, 0x3a, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xc5, 0xf0, 0x12, 
-	0xf8, 0xc7, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, 
-	0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0xab, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0xb7, 0xf0, 0x12, 0xf8, 0xb9, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x9d, 0xa3, 0x2c, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xa9, 0xf0, 0x12, 
-	0xf8, 0xab, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, 
-	0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0x8f, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0x9b, 0xf0, 0x12, 0xf8, 0x9d, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x81, 0xa3, 0x1e, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x8d, 0xf0, 0x12, 
-	0xf8, 0x8f, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, 
-	0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, 
-	0xf8, 0x73, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x12, 
-	0xf8, 0x7f, 0xf0, 0x12, 0xf8, 0x81, 0x5c, 0x28, 
-	0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x65, 0xa3, 0x10, 
-	0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x71, 0xf0, 0x12, 
-	0xf8, 0x73, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, 
-	0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x12, 0xf8, 0x66, 0xf0, 0x12, 0xf8, 0x68, 
-	0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00, 
-	0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32, 
-	0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x17, 0xb0, 0x21, 0x00, 0xb0, 0x81, 
-	0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9, 
-	0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06, 
-	0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05, 
-	0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01, 
-	0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03, 
-	0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08, 
-	0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03, 
-	0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda, 
-	0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00, 
-	0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, 
-	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f, 
-	0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80, 
-	0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14, 
-	0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff, 
-	0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04, 
-	0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00, 
-	0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01, 
-	0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10, 
-	0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02, 
-	0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff, 
-	0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff, 
-	0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff, 
-	0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff, 
-	0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff, 
-	0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff, 
-	0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50, 
-	0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08, 
-	0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45, 
-	0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff, 
-	0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45, 
-	0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff, 
-	0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xeb, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xea, 
-	0xf0, 0x15, 0xfe, 0xe4, 0x23, 0x01, 0x03, 0x9b, 
-	0x43, 0x18, 0xf0, 0x15, 0xfe, 0xe3, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xda, 
-	0x4b, 0x05, 0x40, 0x18, 0xf0, 0x15, 0xfe, 0xda, 
-	0xf0, 0x15, 0xfe, 0xd4, 0x4b, 0x03, 0x40, 0x18, 
-	0xf0, 0x15, 0xfe, 0xd4, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 
-	0xb5, 0x80, 0x07, 0x01, 0x0f, 0x09, 0x29, 0x02, 
-	0xd2, 0x19, 0x00, 0x89, 0x4a, 0x0d, 0x58, 0x51, 
-	0x4f, 0x0d, 0x0c, 0x00, 0x60, 0x39, 0xd3, 0x05, 
-	0x23, 0x01, 0x02, 0x5b, 0x68, 0x08, 0x43, 0x18, 
-	0x60, 0x08, 0xe0, 0x03, 0x68, 0x08, 0x4b, 0x09, 
-	0x40, 0x18, 0x60, 0x08, 0xf7, 0xff, 0xff, 0xc4, 
-	0x68, 0x38, 0xf0, 0x0e, 0xfb, 0xb1, 0x20, 0x00, 
-	0x61, 0xb8, 0xf7, 0xff, 0xff, 0xce, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x3c, 
-	0x2e, 0x08, 0x17, 0xc0, 0xff, 0xff, 0xfd, 0xff, 
-	0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, 
-	0xf0, 0x0e, 0xfb, 0x58, 0x28, 0x00, 0xd1, 0x09, 
-	0x48, 0x06, 0xf0, 0x0e, 0xfb, 0x99, 0x49, 0x06, 
-	0x20, 0x0e, 0xf0, 0x15, 0xfe, 0x9b, 0xf7, 0xff, 
-	0xff, 0xb4, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xd8, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x00, 0x6e, 0x0b, 0xb5, 0x00, 0xf7, 0xff, 
-	0xff, 0x97, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x15, 
-	0xfe, 0x89, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x48, 0x04, 0x7d, 0x01, 0x29, 0x01, 0xd1, 0x02, 
-	0x69, 0x80, 0xf0, 0x00, 0xf8, 0x05, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0, 
-	0xb5, 0x90, 0x1c, 0x07, 0x4c, 0x12, 0x68, 0x20, 
-	0x49, 0x12, 0x42, 0x88, 0xd1, 0x01, 0x0b, 0x38, 
-	0xd1, 0x1a, 0xf7, 0xff, 0xff, 0x79, 0x60, 0x67, 
-	0x69, 0x21, 0x1c, 0x38, 0x29, 0x00, 0xd1, 0x11, 
-	0x68, 0xe1, 0x1c, 0x4a, 0x68, 0xe1, 0x60, 0xe2, 
-	0x00, 0x89, 0x4a, 0x0b, 0x50, 0x50, 0x68, 0xe0, 
-	0x28, 0x64, 0xd1, 0x01, 0x20, 0x00, 0x60, 0xe0, 
-	0x68, 0xe0, 0x68, 0xa1, 0x42, 0x88, 0xd1, 0x01, 
-	0x20, 0x01, 0x61, 0x20, 0xf7, 0xff, 0xff, 0x71, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x08, 0x4c, 0xe8, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x52, 0x48, 0x10, 0x69, 0x01, 
-	0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x81, 
-	0x68, 0xc2, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x81, 
-	0x1c, 0x4a, 0x68, 0x81, 0x60, 0x82, 0x00, 0x89, 
-	0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x81, 
-	0x29, 0x64, 0xd1, 0x00, 0x60, 0x84, 0x61, 0x04, 
-	0xf7, 0xff, 0xff, 0x4b, 0x20, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x45, 
-	0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x4c, 0xe8, 
-	0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8, 
-	0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff, 
-	0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x00, 0x49, 0x07, 0x60, 0x08, 
-	0x20, 0x08, 0x85, 0x38, 0x20, 0x04, 0x85, 0x78, 
-	0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01, 
-	0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, 
-	0x06, 0x00, 0x16, 0x00, 0x28, 0x30, 0xdb, 0x03, 
-	0x28, 0x39, 0xdc, 0x01, 0x20, 0x01, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0xb5, 0xff, 0x26, 0x00, 
-	0x1c, 0x07, 0x20, 0x00, 0x1c, 0x14, 0x22, 0x30, 
-	0x9d, 0x09, 0x54, 0x3a, 0x30, 0x01, 0x28, 0x1f, 
-	0xdb, 0xfb, 0x20, 0x00, 0x77, 0xf8, 0x29, 0x00, 
-	0xda, 0x02, 0x2d, 0x00, 0xd1, 0x00, 0x42, 0x49, 
-	0x25, 0x1e, 0x29, 0x00, 0xd0, 0x14, 0x1c, 0x20, 
-	0xf0, 0x11, 0xfe, 0x78, 0x31, 0x30, 0x55, 0x79, 
-	0x57, 0x79, 0x29, 0x39, 0xdd, 0x07, 0x31, 0x07, 
-	0x55, 0x79, 0x9b, 0x03, 0x2b, 0x00, 0xd0, 0x02, 
-	0x5d, 0x79, 0x31, 0x20, 0x55, 0x79, 0x1c, 0x01, 
-	0x3d, 0x01, 0x36, 0x01, 0x28, 0x00, 0xd1, 0xea, 
-	0x2e, 0x00, 0xd1, 0x00, 0x26, 0x01, 0x1c, 0x30, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0x9e, 0x09, 0x20, 0x01, 0x1c, 0x0f, 
-	0x21, 0x00, 0xb0, 0x94, 0x91, 0x12, 0x91, 0x11, 
-	0x91, 0x10, 0x91, 0x0f, 0x91, 0x0e, 0x25, 0x00, 
-	0x42, 0x41, 0x91, 0x0d, 0x21, 0x00, 0x91, 0x0c, 
-	0x1c, 0x14, 0x92, 0x00, 0x23, 0x00, 0x56, 0xe1, 
-	0x29, 0x2b, 0xd0, 0x10, 0xdc, 0x07, 0x29, 0x20, 
-	0xd0, 0x15, 0x29, 0x23, 0xd1, 0x17, 0x21, 0x01, 
-	0x91, 0x0f, 0x18, 0x64, 0xe0, 0x14, 0x29, 0x2d, 
-	0xd0, 0x09, 0x29, 0x30, 0xd1, 0x0f, 0x21, 0x01, 
-	0x91, 0x0e, 0x18, 0x64, 0xe0, 0x0c, 0x21, 0x01, 
-	0x91, 0x12, 0x18, 0x64, 0xe0, 0x08, 0x21, 0x01, 
-	0x91, 0x11, 0x18, 0x64, 0xe0, 0x04, 0x21, 0x01, 
-	0x91, 0x10, 0x18, 0x64, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd1, 0xdb, 0x23, 0x00, 0x56, 0xe0, 
-	0xf7, 0xff, 0xff, 0x8a, 0x28, 0x00, 0xd0, 0x15, 
-	0x25, 0x00, 0x23, 0x00, 0x56, 0xe0, 0xf7, 0xff, 
-	0xff, 0x83, 0x28, 0x00, 0xd0, 0x19, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 
-	0x18, 0x08, 0x34, 0x01, 0x1f, 0xc5, 0x3d, 0x29, 
-	0x56, 0xe0, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00, 
-	0xd1, 0xf1, 0xe0, 0x0a, 0x23, 0x00, 0x56, 0xe0, 
-	0x28, 0x2a, 0xd1, 0x06, 0x9b, 0x17, 0xcb, 0x20, 
-	0x93, 0x17, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 0x28, 0x2e, 
-	0xd1, 0x16, 0x20, 0x00, 0x90, 0x0d, 0x34, 0x01, 
-	0x56, 0xe0, 0xf7, 0xff, 0xff, 0x5d, 0x28, 0x00, 
-	0xd0, 0x0e, 0x98, 0x0d, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 0x18, 0x08, 
-	0x38, 0x30, 0x90, 0x0d, 0x34, 0x01, 0x56, 0xe0, 
-	0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0xf0, 
-	0x23, 0x00, 0x56, 0xe0, 0x28, 0x68, 0xd0, 0x01, 
-	0x28, 0x6c, 0xd1, 0x02, 0x90, 0x0c, 0x34, 0x01, 
-	0xe0, 0x04, 0x28, 0x46, 0xd0, 0x01, 0x28, 0x4e, 
-	0xd1, 0x00, 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 
-	0x21, 0x25, 0x34, 0x01, 0x28, 0x67, 0xd0, 0x12, 
-	0xdc, 0x1d, 0x28, 0x63, 0xd0, 0x54, 0xdc, 0x08, 
-	0x28, 0x25, 0xd0, 0x73, 0x28, 0x45, 0xd0, 0x0a, 
-	0x28, 0x47, 0xd0, 0x08, 0x28, 0x58, 0xd1, 0x6e, 
-	0xe0, 0x53, 0x28, 0x64, 0xd0, 0x6c, 0x28, 0x65, 
-	0xd0, 0x01, 0x28, 0x66, 0xd1, 0x67, 0x98, 0x0c, 
-	0x28, 0x6c, 0xd1, 0x66, 0x68, 0x30, 0x30, 0x03, 
-	0x60, 0x30, 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 
-	0xf0, 0x11, 0xfd, 0xe0, 0xe0, 0xe5, 0x28, 0x70, 
-	0xd0, 0x3d, 0xdc, 0x36, 0x28, 0x69, 0xd0, 0x57, 
-	0x28, 0x6e, 0xd0, 0x57, 0x28, 0x6f, 0xd1, 0x52, 
-	0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 0x9b, 0x17, 
-	0x68, 0x19, 0x91, 0x13, 0x98, 0x0c, 0x28, 0x68, 
-	0xd1, 0x09, 0x99, 0x13, 0x04, 0x09, 0x0c, 0x09, 
-	0x91, 0x13, 0x0c, 0x08, 0xd3, 0x03, 0x99, 0x13, 
-	0x4b, 0xeb, 0x43, 0x19, 0x91, 0x13, 0x22, 0x01, 
-	0xb4, 0x04, 0x23, 0x00, 0x22, 0x08, 0x99, 0x14, 
-	0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xff, 0xb0, 0x01, 
-	0x99, 0x0f, 0x1c, 0x06, 0x29, 0x00, 0xd0, 0x03, 
-	0x99, 0x13, 0x29, 0x00, 0xd0, 0x00, 0x3e, 0x01, 
-	0x99, 0x12, 0x29, 0x00, 0xd0, 0x55, 0x20, 0x2b, 
-	0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 
-	0x2d, 0x00, 0xd0, 0x73, 0x3d, 0x01, 0xe0, 0xe7, 
-	0xe0, 0x3f, 0x28, 0x73, 0xd0, 0x6f, 0x28, 0x75, 
-	0xd0, 0x6e, 0x28, 0x78, 0xd1, 0x1b, 0x23, 0x01, 
-	0x93, 0x0b, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x23, 0x1f, 0x1f, 0xe0, 0x38, 0x19, 0x56, 0xc0, 
-	0x28, 0x58, 0xd1, 0x01, 0x23, 0x00, 0x93, 0x0b, 
-	0x9b, 0x17, 0x68, 0x19, 0x98, 0x0c, 0x28, 0x68, 
-	0xd1, 0x05, 0x04, 0x09, 0x0c, 0x09, 0x0c, 0x08, 
-	0xd3, 0x01, 0x4b, 0xcd, 0x43, 0x19, 0x22, 0x01, 
-	0xb4, 0x04, 0xe0, 0x04, 0xe0, 0x16, 0xe1, 0x88, 
-	0xe0, 0x28, 0xe0, 0x7e, 0xe0, 0x91, 0x22, 0x10, 
-	0x9b, 0x0c, 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xbe, 
-	0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, 
-	0xd0, 0x52, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x57, 
-	0x3d, 0x01, 0xe1, 0x0a, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe1, 0x70, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x68, 0x01, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe1, 0x64, 0xe0, 0x74, 0x68, 0x30, 0x30, 0x01, 
-	0x60, 0x30, 0x98, 0x17, 0x68, 0x01, 0x91, 0x13, 
-	0x98, 0x0c, 0x28, 0x68, 0xd1, 0x09, 0x99, 0x13, 
-	0x04, 0x09, 0x0c, 0x09, 0x91, 0x13, 0x0c, 0x08, 
-	0xd3, 0x03, 0x99, 0x13, 0x4b, 0xac, 0x43, 0x19, 
-	0x91, 0x13, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 
-	0x22, 0x0a, 0x99, 0x14, 0xa8, 0x02, 0xf7, 0xff, 
-	0xfe, 0x81, 0xb0, 0x01, 0x1c, 0x06, 0x20, 0x2d, 
-	0x99, 0x12, 0x29, 0x00, 0xd0, 0x15, 0x99, 0x13, 
-	0x29, 0x00, 0xe0, 0x02, 0xe0, 0x87, 0xe0, 0x5a, 
-	0xe0, 0x97, 0xda, 0x04, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0xe0, 0x04, 0x20, 0x2b, 
-	0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 
-	0x2d, 0x00, 0xd0, 0x65, 0x3d, 0x01, 0xe0, 0x76, 
-	0xe0, 0xb4, 0x99, 0x10, 0x29, 0x00, 0xd0, 0x11, 
-	0x99, 0x13, 0x29, 0x00, 0xda, 0x05, 0x68, 0x39, 
-	0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 0xe0, 0x05, 
-	0xe0, 0xb3, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x4f, 
-	0x3d, 0x01, 0xe0, 0x60, 0x99, 0x13, 0x29, 0x00, 
-	0xda, 0x5d, 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 
-	0x60, 0x39, 0x2d, 0x00, 0xd0, 0x44, 0x3d, 0x01, 
-	0xe0, 0xab, 0x68, 0x30, 0x30, 0x02, 0x60, 0x30, 
-	0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 0xf0, 0x11, 
-	0xfc, 0xf9, 0x68, 0x38, 0xa1, 0x85, 0x22, 0x10, 
-	0xf0, 0x11, 0xfc, 0xf4, 0x68, 0x38, 0xf0, 0x11, 
-	0xfd, 0x35, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0xe0, 0xf8, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x68, 0x00, 0x68, 0x39, 0x9a, 0x14, 
-	0x1a, 0x89, 0x60, 0x01, 0xe0, 0xee, 0x99, 0x10, 
-	0x29, 0x00, 0xd0, 0x21, 0x21, 0x20, 0x68, 0x38, 
-	0x70, 0x01, 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 
-	0xd0, 0x1a, 0x3d, 0x01, 0xe0, 0x81, 0x68, 0x30, 
-	0x30, 0x01, 0x60, 0x30, 0x98, 0x17, 0xf0, 0x11, 
-	0xfd, 0x15, 0x1c, 0x06, 0x98, 0x0d, 0x28, 0x00, 
-	0xdd, 0x03, 0x98, 0x0d, 0x42, 0xb0, 0xda, 0x00, 
-	0x9e, 0x0d, 0x2d, 0x00, 0xd0, 0x09, 0x21, 0x20, 
-	0x68, 0x38, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0x28, 
-	0x23, 0x00, 0x68, 0x38, 0x55, 0x43, 0xe0, 0x03, 
-	0xe0, 0x67, 0x23, 0x00, 0x68, 0x38, 0x55, 0x83, 
-	0x2d, 0x00, 0xd0, 0x0d, 0x42, 0xae, 0xda, 0x0b, 
-	0x99, 0x11, 0x29, 0x00, 0xd1, 0x08, 0x68, 0x38, 
-	0x19, 0x40, 0x1b, 0x80, 0x99, 0x17, 0x1c, 0x32, 
-	0xf0, 0x11, 0xfd, 0x2c, 0xe0, 0x0a, 0xe0, 0x54, 
-	0x2d, 0x00, 0xd0, 0x02, 0x42, 0xae, 0xdb, 0x00, 
-	0x36, 0x01, 0x99, 0x17, 0x68, 0x38, 0x1c, 0x32, 
-	0xf0, 0x11, 0xfd, 0x20, 0x68, 0x38, 0xf0, 0x11, 
-	0xfc, 0xe1, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0xe0, 0xa4, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 
-	0x98, 0x17, 0x99, 0x0c, 0x29, 0x68, 0xd1, 0x02, 
-	0x23, 0x01, 0x03, 0xdb, 0x40, 0x18, 0x22, 0x01, 
-	0xb4, 0x04, 0x98, 0x18, 0x68, 0x01, 0x23, 0x00, 
-	0x22, 0x0a, 0xa8, 0x02, 0xf7, 0xff, 0xfd, 0xca, 
-	0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, 
-	0xd0, 0x08, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, 
-	0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x24, 
-	0x3d, 0x01, 0xe0, 0x22, 0x99, 0x10, 0x29, 0x00, 
-	0xd0, 0x1f, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x18, 
-	0x3d, 0x01, 0xe0, 0x16, 0x99, 0x10, 0x29, 0x00, 
-	0xd0, 0x07, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, 
-	0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x00, 
-	0x3d, 0x01, 0x99, 0x0f, 0x29, 0x00, 0xd0, 0x08, 
-	0x21, 0x30, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x21, 0x78, 0x60, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x60, 0x38, 0x2d, 0x00, 0xd0, 0x48, 0x42, 0xb5, 
-	0xdd, 0x46, 0x99, 0x11, 0x29, 0x00, 0xd0, 0x02, 
-	0x99, 0x0e, 0x29, 0x00, 0xd0, 0x2a, 0x99, 0x0e, 
-	0x29, 0x00, 0xd0, 0x0c, 0x20, 0x00, 0x1b, 0xa9, 
-	0x29, 0x00, 0xdd, 0x14, 0x22, 0x30, 0x68, 0x3b, 
-	0x70, 0x1a, 0x33, 0x01, 0x60, 0x3b, 0x30, 0x01, 
-	0x42, 0x81, 0xdc, 0xf8, 0xe0, 0x0b, 0x20, 0x00, 
-	0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 0x23, 0x20, 
-	0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 0x60, 0x3a, 
-	0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 0x21, 0x20, 
-	0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 0x1e, 0x41, 
-	0x68, 0x38, 0xf0, 0x11, 0xfc, 0xd3, 0x68, 0x38, 
-	0xf0, 0x11, 0xfc, 0x68, 0x68, 0x39, 0x18, 0x40, 
-	0x60, 0x38, 0xe0, 0x2b, 0x68, 0x38, 0xf0, 0x11, 
-	0xfc, 0x61, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, 
-	0x20, 0x00, 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 
-	0x23, 0x20, 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 
-	0x60, 0x3a, 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 
-	0x23, 0x00, 0x68, 0x38, 0x70, 0x03, 0xe0, 0x15, 
-	0x21, 0x20, 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 
-	0x1e, 0x41, 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xae, 
-	0x68, 0x38, 0xf0, 0x11, 0xfc, 0x43, 0x68, 0x39, 
-	0x18, 0x40, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, 
-	0xe0, 0x04, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, 
-	0x60, 0x38, 0x9c, 0x00, 0x1c, 0x20, 0xb0, 0x14, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0x00, 0x00, 0x28, 0x46, 0x50, 0x20, 
-	0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 
-	0x65, 0x64, 0x29, 0x00, 0xb5, 0x87, 0x23, 0x00, 
-	0x98, 0x01, 0x9f, 0x00, 0x56, 0xc0, 0x28, 0x00, 
-	0xd0, 0x2f, 0xe0, 0x05, 0x30, 0x01, 0x90, 0x01, 
-	0x98, 0x00, 0x70, 0x01, 0x30, 0x01, 0x90, 0x00, 
-	0x23, 0x00, 0x98, 0x01, 0x56, 0xc1, 0x29, 0x25, 
-	0xd0, 0x01, 0x29, 0x00, 0xd1, 0xf2, 0x23, 0x00, 
-	0x99, 0x01, 0x56, 0xc9, 0x29, 0x00, 0xd0, 0x17, 
-	0x23, 0x01, 0x56, 0xc0, 0x28, 0x00, 0xd0, 0x13, 
-	0x20, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x6a, 
-	0xb4, 0x04, 0x98, 0x03, 0x1c, 0x42, 0x9b, 0x04, 
-	0x1c, 0x38, 0xa9, 0x02, 0xf7, 0xff, 0xfd, 0x30, 
-	0xb0, 0x01, 0x90, 0x02, 0x98, 0x00, 0x00, 0x80, 
-	0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 0xb0, 0x01, 
-	0x23, 0x00, 0x98, 0x01, 0x56, 0xc0, 0x28, 0x00, 
-	0xd1, 0xd6, 0x20, 0x00, 0x99, 0x00, 0x70, 0x08, 
-	0x31, 0x01, 0x91, 0x00, 0x1c, 0x38, 0xf0, 0x11, 
-	0xfb, 0xe9, 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0x0f, 0xb5, 0x00, 0x98, 0x01, 
-	0x99, 0x02, 0xaa, 0x03, 0xf7, 0xff, 0xff, 0xb6, 
-	0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0xb4, 0x0f, 
-	0xb5, 0x00, 0xb0, 0xb8, 0x46, 0x68, 0x99, 0x39, 
-	0xaa, 0x3a, 0xf7, 0xff, 0xff, 0xab, 0x46, 0x68, 
-	0xf0, 0x11, 0xfb, 0xd0, 0x1c, 0x01, 0x46, 0x68, 
-	0xf7, 0xf9, 0xfb, 0x7e, 0xb0, 0x38, 0xbc, 0x08, 
-	0xb0, 0x04, 0x47, 0x18, 0x21, 0x00, 0xb0, 0x81, 
-	0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xd3, 0xf9, 
-	0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x0d, 
-	0x0e, 0x2d, 0xb0, 0x83, 0x49, 0x23, 0x68, 0x09, 
-	0x91, 0x01, 0x26, 0x09, 0x1d, 0xc4, 0x34, 0x19, 
-	0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 
-	0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 
-	0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 0xf8, 0x0c, 
-	0xb0, 0x01, 0xaf, 0x01, 0x78, 0x3f, 0xab, 0x02, 
-	0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 
-	0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 
-	0xab, 0x02, 0xf7, 0xf9, 0xff, 0xfd, 0xb0, 0x01, 
-	0xa9, 0x01, 0x78, 0x09, 0x91, 0x00, 0xab, 0x02, 
-	0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 
-	0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 
-	0xab, 0x02, 0xf7, 0xf9, 0xff, 0xed, 0xb0, 0x01, 
-	0xa8, 0x01, 0x78, 0x00, 0x99, 0x00, 0x42, 0x8f, 
-	0xd1, 0x06, 0x42, 0x87, 0xd1, 0x04, 0x1c, 0x38, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1e, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xd1, 0xc3, 
-	0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5e, 0x28, 
-	0xb5, 0xf0, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x16, 
-	0x0e, 0x36, 0x25, 0x0a, 0xb0, 0x82, 0xab, 0x00, 
-	0x70, 0x1c, 0x70, 0x5e, 0x1c, 0x07, 0x30, 0x20, 
-	0x90, 0x01, 0x98, 0x01, 0x7b, 0x00, 0x46, 0x69, 
-	0x22, 0x02, 0xf7, 0xf9, 0xff, 0x66, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9b, 0x1c, 0x01, 
-	0x2c, 0x00, 0xd0, 0x05, 0x2c, 0x09, 0xd0, 0x03, 
-	0x2c, 0x1f, 0xd1, 0x03, 0x20, 0x7f, 0xe0, 0x02, 
-	0x20, 0x5e, 0xe0, 0x00, 0x20, 0xff, 0x40, 0x71, 
-	0x40, 0x08, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1e, 0x68, 0x06, 0x05, 
-	0x0e, 0x2d, 0xd1, 0xde, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 
-	0x2a, 0x00, 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 
-	0x24, 0x00, 0x00, 0x90, 0x19, 0xc0, 0x6c, 0x02, 
-	0x42, 0x8a, 0xd0, 0x15, 0x64, 0x01, 0x20, 0x03, 
-	0x4a, 0x19, 0x29, 0x01, 0xd0, 0x13, 0x29, 0x02, 
-	0xd0, 0x1f, 0x29, 0x03, 0xd1, 0x0c, 0x60, 0x10, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x66, 
-	0x23, 0xf3, 0x40, 0x18, 0x22, 0x08, 0x43, 0x02, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xac, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x10, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x56, 
-	0x22, 0xf3, 0x40, 0x02, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf7, 0xff, 0xff, 0x9e, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0x49, 0x23, 0xf3, 0x40, 0x18, 0x22, 0x04, 
-	0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0x8f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x6e, 0x00, 0x11, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, 
-	0x68, 0x41, 0x68, 0x09, 0x68, 0x80, 0x1c, 0x1f, 
-	0x28, 0x00, 0xd0, 0x01, 0x6b, 0x8b, 0xe0, 0x00, 
-	0x23, 0x00, 0x6b, 0x0e, 0x43, 0x32, 0x6b, 0xcd, 
-	0x43, 0x2a, 0x43, 0x1a, 0x43, 0x1e, 0x1c, 0x15, 
-	0x1c, 0x02, 0x1c, 0x08, 0x21, 0x01, 0xf7, 0xff, 
-	0xff, 0xa5, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x07, 
-	0x88, 0x29, 0x54, 0x21, 0x88, 0x31, 0x54, 0x21, 
-	0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf7, 
-	0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0x68, 0x41, 0x68, 0x0c, 0x68, 0x80, 
-	0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, 0x6b, 0xa6, 
-	0xe0, 0x00, 0x26, 0x00, 0x6b, 0x21, 0x43, 0x11, 
-	0x6b, 0xe2, 0x43, 0x11, 0x43, 0x31, 0x1c, 0x02, 
-	0x1c, 0x0d, 0x21, 0x01, 0x1c, 0x20, 0xf7, 0xff, 
-	0xff, 0x81, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x09, 
-	0x99, 0x01, 0x5c, 0x09, 0x80, 0x29, 0x6b, 0x21, 
-	0x19, 0x89, 0x88, 0x09, 0x30, 0x01, 0x35, 0x02, 
-	0x42, 0xb8, 0xdb, 0xf5, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
-	0x68, 0x42, 0x68, 0x17, 0x68, 0x82, 0x2a, 0x00, 
-	0xd0, 0x01, 0x6b, 0xbc, 0xe0, 0x00, 0x24, 0x00, 
-	0x08, 0x48, 0xd3, 0x0a, 0x23, 0xfe, 0x40, 0x19, 
-	0x6b, 0x38, 0x43, 0x08, 0x6b, 0x79, 0x43, 0x08, 
-	0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 
-	0xe0, 0x05, 0x6b, 0x38, 0x43, 0x08, 0x6b, 0xf9, 
-	0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 0x21, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x4f, 0x6b, 0x38, 
-	0x43, 0x20, 0x88, 0x29, 0x88, 0x01, 0x88, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 
-	0x68, 0x42, 0x68, 0x13, 0x68, 0x82, 0x2a, 0x00, 
-	0xd0, 0x01, 0x6b, 0x98, 0xe0, 0x00, 0x20, 0x00, 
-	0x07, 0xcc, 0x0f, 0xe4, 0xd0, 0x08, 0x6b, 0x1f, 
-	0x43, 0x39, 0x6b, 0x5f, 0x43, 0x39, 0x6b, 0xdf, 
-	0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, 0xe0, 0x05, 
-	0x6b, 0x1f, 0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39, 
-	0x43, 0x01, 0x1c, 0x0f, 0x21, 0x02, 0x1c, 0x18, 
-	0xf7, 0xff, 0xff, 0x24, 0x80, 0x3d, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0xb5, 0x80, 
-	0x68, 0x41, 0x68, 0x0a, 0x68, 0x81, 0x29, 0x00, 
-	0xd0, 0x01, 0x21, 0x09, 0xe0, 0x00, 0x21, 0x00, 
-	0x27, 0x00, 0x69, 0x80, 0x28, 0x06, 0xd1, 0x03, 
-	0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x10, 0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xa8, 
-	0x08, 0x40, 0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x68, 0x42, 0x68, 0x17, 0x68, 0x80, 0x28, 0x00, 
-	0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 
-	0x29, 0x00, 0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21, 
-	0x29, 0x02, 0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x8e, 
-	0x48, 0x1e, 0xf7, 0xff, 0xfe, 0x5f, 0x22, 0x00, 
-	0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
-	0xf9, 0x85, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf0, 0x11, 0xf9, 0x7a, 0x22, 0x9f, 0x40, 0x02, 
-	0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
-	0xf9, 0x75, 0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x6d, 0x22, 0x20, 
-	0x43, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 
-	0xf0, 0x11, 0xf9, 0x68, 0x25, 0x00, 0x6c, 0xfa, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x60, 
-	0x1c, 0x06, 0x09, 0x80, 0xd2, 0x05, 0x20, 0x14, 
-	0xf7, 0xff, 0xfe, 0x30, 0x35, 0x01, 0x2d, 0x0a, 
-	0xdb, 0xf1, 0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x52, 
-	0xe7, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x86, 0xa0, 
-	0xb5, 0x80, 0x49, 0x0f, 0x4f, 0x0f, 0x8e, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x13, 
-	0x8d, 0xba, 0x06, 0x12, 0x0e, 0x12, 0x2a, 0x0c, 
-	0xd1, 0x0e, 0x8d, 0xf8, 0x28, 0x00, 0xd0, 0x09, 
-	0x8d, 0xf8, 0x1e, 0x82, 0xb4, 0x04, 0x78, 0x4a, 
-	0x1c, 0x8b, 0x78, 0x09, 0x48, 0x06, 0xf0, 0x00, 
-	0xfd, 0x5f, 0xb0, 0x01, 0x20, 0x00, 0x85, 0xb8, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x4e, 0x78, 0x48, 0x08, 0x8d, 0x81, 
-	0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, 
-	0x47, 0x70, 0x21, 0x0c, 0x85, 0x81, 0x21, 0x01, 
-	0x02, 0xc9, 0x85, 0xc1, 0x21, 0x09, 0x02, 0x49, 
-	0x86, 0xc1, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x4f, 0x15, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x23, 0xf7, 0xff, 
-	0xff, 0xbf, 0x48, 0x13, 0x68, 0x00, 0x68, 0x79, 
-	0x1a, 0x41, 0x29, 0x02, 0xd3, 0x1b, 0x60, 0x78, 
-	0x4c, 0x10, 0x8e, 0xa0, 0x4f, 0x10, 0x28, 0x00, 
-	0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0xd0, 
-	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x23, 0xc9, 
-	0x00, 0x9b, 0x18, 0xf8, 0xf0, 0x00, 0xfc, 0xc8, 
-	0x69, 0xb8, 0x28, 0x06, 0xd0, 0x05, 0x23, 0x03, 
-	0x02, 0x1b, 0x18, 0xf8, 0x6b, 0xc0, 0x28, 0x06, 
-	0xd1, 0x01, 0xf7, 0xff, 0xff, 0xc3, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x44, 
-	0x2e, 0x08, 0x05, 0xb0, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x4e, 0xc8, 0xb5, 0x00, 0x1c, 0x10, 
-	0x1c, 0x1a, 0x1c, 0x03, 0x1c, 0x08, 0x1c, 0x19, 
-	0xf7, 0xf9, 0xf9, 0x84, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x90, 0x4f, 0x23, 0x24, 0x02, 0x48, 0x23, 
-	0x60, 0x04, 0x22, 0x50, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf9, 0x8a, 0x20, 0x80, 0x1d, 0xf9, 
-	0x31, 0x19, 0x73, 0x08, 0x20, 0x03, 0x07, 0x00, 
-	0x63, 0x38, 0x02, 0xe0, 0x63, 0x78, 0x03, 0x20, 
-	0x63, 0xb8, 0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a, 
-	0x64, 0xb8, 0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f, 
-	0x48, 0x19, 0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00, 
-	0x60, 0xbc, 0x48, 0x18, 0x61, 0x78, 0x48, 0x18, 
-	0x61, 0xb8, 0x48, 0x18, 0x61, 0xf8, 0x48, 0x18, 
-	0x62, 0x38, 0x48, 0x18, 0x61, 0x38, 0x48, 0x18, 
-	0x62, 0x78, 0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xbc, 0x4f, 0x16, 0x28, 0x00, 
-	0xd0, 0x03, 0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x15, 
-	0xf8, 0x1c, 0x48, 0x12, 0xf7, 0xff, 0xfd, 0x6a, 
-	0x20, 0x01, 0x60, 0x38, 0x48, 0x10, 0x68, 0x00, 
-	0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4e, 0x78, 0x6e, 0x00, 0x11, 0x00, 
-	0x2e, 0x00, 0x76, 0x55, 0x2e, 0x00, 0x75, 0xb9, 
-	0x2e, 0x08, 0x4e, 0xc8, 0x2e, 0x00, 0x77, 0x41, 
-	0x2e, 0x00, 0x77, 0x8d, 0x2e, 0x00, 0x77, 0xdb, 
-	0x2e, 0x00, 0x78, 0x2f, 0x2e, 0x00, 0x7a, 0x39, 
-	0x2e, 0x00, 0x78, 0x7b, 0x2e, 0x00, 0x78, 0xb3, 
-	0x2e, 0x08, 0x1a, 0x44, 0x00, 0x06, 0x1a, 0x80, 
-	0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x80, 0x22, 0x80, 
-	0x21, 0x1f, 0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11, 
-	0xf8, 0x69, 0x48, 0x3f, 0xf7, 0xff, 0xfd, 0x3a, 
-	0x22, 0x55, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x60, 0x21, 0x02, 0x6c, 0xfa, 
-	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x28, 0x55, 
-	0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x22, 0x33, 0x21, 0x05, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4e, 
-	0x22, 0x33, 0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x48, 0x22, 0x21, 0x21, 0x17, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x42, 
-	0x22, 0x00, 0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x3c, 0x22, 0x00, 0x21, 0x0a, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x36, 
-	0x22, 0x01, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x30, 0x22, 0x01, 0x21, 0x0b, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x2a, 
-	0x22, 0x00, 0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x24, 0x22, 0x00, 0x21, 0x0c, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1e, 
-	0x22, 0x00, 0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x18, 0x22, 0x01, 0x21, 0x0d, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x12, 
-	0x22, 0x02, 0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x0c, 0x22, 0x04, 0x21, 0x1c, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x06, 
-	0x22, 0x03, 0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x11, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x1f, 
-	0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xfa, 
-	0x22, 0x01, 0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0xf4, 0x21, 0x1a, 0x6c, 0xfa, 
-	0x1c, 0x38, 0xf0, 0x10, 0xff, 0xed, 0x20, 0x00, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xc3, 0x50, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x74, 0x28, 0x00, 0xda, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x24, 0x00, 0x64, 0x3c, 0x64, 0x7c, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x2f, 0x1c, 0x20, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xb5, 0x00, 0x1c, 0x13, 0x1c, 0x0a, 0x1c, 0x01, 
-	0x1c, 0x18, 0xf0, 0x00, 0xf8, 0xeb, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x0b, 0x68, 0x54, 
-	0x69, 0x27, 0x1c, 0x11, 0x2f, 0x00, 0xd0, 0x07, 
-	0x68, 0x89, 0x1c, 0x02, 0x1c, 0x20, 0xf0, 0x10, 
-	0xff, 0xc5, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, 0x68, 0x44, 
-	0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, 0xb0, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0xff, 
-	0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, 0x22, 0x02, 
-	0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, 0x70, 0xd9, 
-	0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, 0x46, 0x6a, 
-	0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, 0xf0, 0x10, 
-	0xff, 0xa1, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x31, 0x19, 0x61, 0x01, 0x21, 0x00, 0xf7, 0xff, 
-	0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x68, 0x40, 0x69, 0x40, 0x25, 0x00, 0xb0, 0x9e, 
-	0x28, 0x00, 0xd1, 0x08, 0x21, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xc7, 0x1c, 0x28, 0xb0, 0x1e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0x11, 
-	0x01, 0x5b, 0x18, 0xfc, 0x70, 0x25, 0x23, 0xff, 
-	0x22, 0x00, 0x68, 0x7e, 0x69, 0x76, 0x1c, 0x38, 
-	0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x70, 
-	0x46, 0x68, 0x22, 0xff, 0x1c, 0x21, 0x32, 0x01, 
-	0xf0, 0x01, 0xfa, 0xea, 0x28, 0x00, 0xda, 0x11, 
-	0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 0x6a, 0x01, 
-	0x31, 0x01, 0x62, 0x01, 0x29, 0x64, 0xdd, 0x03, 
-	0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa1, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x1e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x46, 0x68, 0x1d, 0xc1, 
-	0x31, 0x6b, 0x23, 0x01, 0x9a, 0x16, 0x68, 0x7c, 
-	0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x48, 
-	0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8d, 
-	0x21, 0x01, 0x68, 0x7a, 0x6a, 0x92, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0x3a, 0x1c, 0x28, 0xb0, 0x1e, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x21, 0x01, 0x68, 0x42, 0x69, 0xd2, 0xf0, 0x10, 
-	0xff, 0x2f, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x1d, 0xc6, 0x36, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
-	0xff, 0xf2, 0x0a, 0x00, 0xd2, 0x03, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x02, 
-	0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 
-	0xff, 0x1b, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a, 
-	0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x14, 
-	0x02, 0x00, 0x43, 0x20, 0x04, 0x04, 0x0c, 0x24, 
-	0x69, 0xf8, 0x42, 0xa0, 0xda, 0x01, 0x04, 0x04, 
-	0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 0xdd, 0x09, 
-	0x21, 0x00, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 
-	0xf0, 0x10, 0xff, 0x02, 0x55, 0x70, 0x35, 0x01, 
-	0x42, 0xa5, 0xdb, 0xf5, 0x1c, 0x21, 0xa0, 0x07, 
-	0xf0, 0x11, 0xf8, 0x22, 0x69, 0xb8, 0x28, 0x06, 
-	0xd1, 0x04, 0x68, 0xf8, 0x1c, 0x31, 0x1c, 0x22, 
-	0xf0, 0x00, 0xff, 0x40, 0x1c, 0x20, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x63, 
-	0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x61, 
-	0x74, 0x61, 0x20, 0x6c, 0x65, 0x6e, 0x3d, 0x25, 
-	0x64, 0x0a, 0x00, 0x00, 0xb5, 0xf0, 0x1c, 0x14, 
-	0x1c, 0x0d, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xab, 
-	0x22, 0x01, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xd3, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x99, 0x09, 0xc0, 0xd3, 0x23, 
-	0x06, 0x22, 0x0e, 0x12, 0x21, 0x02, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xc6, 
-	0x12, 0x22, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xbf, 0x26, 0x00, 
-	0x2c, 0x00, 0xdd, 0x09, 0x5d, 0xaa, 0x21, 0x00, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfe, 0xb5, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x78, 0x08, 0x80, 
-	0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xd0, 
-	0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xa3, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x69, 0x08, 0x80, 0xd3, 0x02, 
-	0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xc1, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 
-	0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77, 
-	0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 
-	0x6f, 0x72, 0x20, 0x31, 0x0a, 0x00, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 
-	0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77, 
-	0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 
-	0x6f, 0x72, 0x20, 0x32, 0x0a, 0x00, 0x00, 0x00, 
-	0xb5, 0x00, 0x1c, 0x0a, 0x1d, 0xc1, 0x31, 0xff, 
-	0x31, 0x1a, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x0d, 
-	0xf0, 0x10, 0xff, 0x8e, 0x22, 0x08, 0x21, 0x01, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfe, 0x61, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0xa8, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05, 
-	0x61, 0x38, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b, 
-	0x18, 0xf9, 0x62, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73, 
-	0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0x90, 0x22, 0x00, 0x21, 0x01, 0x68, 0x43, 
-	0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x3e, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x04, 0x23, 0x40, 
-	0x40, 0x18, 0x4c, 0x14, 0xd1, 0x13, 0x68, 0x20, 
-	0x30, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x61, 0x38, 
-	0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01, 
-	0x29, 0x0a, 0xdd, 0x03, 0x21, 0x00, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x73, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x04, 
-	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfe, 0x1c, 0x21, 0x04, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x63, 0x68, 0x20, 0x30, 0x05, 
-	0x61, 0x38, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0xf0, 0x26, 0xff, 0x36, 0x01, 0x61, 0xc6, 
-	0x1d, 0xc5, 0x35, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
-	0xfe, 0xd6, 0x4c, 0x17, 0x28, 0x00, 0xd1, 0x0d, 
-	0xa0, 0x16, 0xf0, 0x10, 0xff, 0x25, 0x21, 0xfe, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x46, 0x68, 0x20, 
-	0x61, 0x78, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 0x02, 0x00, 
-	0x78, 0x69, 0x43, 0x01, 0x61, 0xf9, 0xa0, 0x19, 
-	0xf0, 0x10, 0xff, 0x12, 0x69, 0xf8, 0x42, 0xb0, 
-	0xdd, 0x00, 0x61, 0xfe, 0x22, 0x02, 0x21, 0x01, 
-	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfd, 0xe1, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, 
-	0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x25, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
-	0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 
-	0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x75, 
-	0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 
-	0x65, 0x0a, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 
-	0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 
-	0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, 
-	0xb5, 0xb0, 0x1c, 0x07, 0xf7, 0xff, 0xfe, 0x6f, 
-	0x23, 0x40, 0x40, 0x18, 0x25, 0x00, 0x43, 0xed, 
-	0x4c, 0x3d, 0x28, 0x00, 0xd1, 0x0c, 0xa0, 0x3d, 
-	0xf0, 0x10, 0xfe, 0xc2, 0x21, 0xff, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0xe3, 0x68, 0x20, 0x61, 0x78, 
-	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x03, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8b, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x51, 0x09, 0xc0, 0xd2, 0x0c, 
-	0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0xa9, 0x21, 0xff, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xca, 0x68, 0x20, 
-	0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x22, 0x02, 0x21, 0x02, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x72, 
-	0x22, 0x00, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x6b, 0x69, 0xf8, 
-	0x12, 0x02, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b, 
-	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x63, 0x69, 0xf8, 
-	0x06, 0x02, 0x0e, 0x12, 0x21, 0x00, 0x68, 0x7b, 
-	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x5a, 
-	0xa0, 0x34, 0xf0, 0x10, 0xfe, 0x7d, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x1d, 0x08, 0x80, 0xd3, 0x02, 
-	0xa0, 0x3e, 0xf0, 0x10, 0xfe, 0x75, 0x22, 0x00, 
-	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfd, 0x48, 0x68, 0xf8, 0x69, 0xf9, 
-	0xf0, 0x00, 0xfa, 0x3e, 0x48, 0x42, 0x68, 0xf9, 
-	0x4b, 0x42, 0x18, 0xc9, 0x61, 0x48, 0x68, 0xf8, 
-	0x18, 0xc0, 0x61, 0x07, 0x48, 0x40, 0x68, 0xf9, 
-	0x18, 0xc9, 0x61, 0x88, 0x68, 0xf8, 0x18, 0xc0, 
-	0x60, 0xc7, 0x69, 0xf9, 0xa0, 0x3d, 0xf0, 0x10, 
-	0xfe, 0x57, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x76, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 
-	0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
-	0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 
-	0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
-	0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 
-	0x73, 0x69, 0x7a, 0x65, 0x0a, 0x00, 0x00, 0x00, 
-	0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 
-	0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 
-	0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 
-	0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 
-	0x65, 0x69, 0x76, 0x65, 0x20, 0x62, 0x75, 0x66, 
-	0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 
-	0x20, 0x32, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x73, 0x65, 0x6e, 
-	0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x67, 
-	0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 
-	0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 
-	0x69, 0x7a, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 
-	0x20, 0x74, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 
-	0x6c, 0x65, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x5f, 0x6e, 0x65, 0x67, 0x6f, 
-	0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x62, 
-	0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 
-	0x7a, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 
-	0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x00, 
-	0x2e, 0x00, 0x7c, 0x55, 0x00, 0x01, 0x3b, 0x80, 
-	0x2e, 0x00, 0x7c, 0x67, 0x63, 0x69, 0x5f, 0x73, 
-	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x62, 0x75, 0x66, 
-	0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 
-	0x20, 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x20, 0xff, 0x30, 0x01, 0x61, 0xf8, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xea, 0x48, 0x05, 
-	0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfd, 
-	0xfc, 0xe5, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0x00, 0x01, 0x3b, 0x9c, 0xb5, 0x00, 0x68, 0xc0, 
-	0xf7, 0xfd, 0xfc, 0xfa, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x80, 0x1c, 0x1f, 0x06, 0x0b, 0x0e, 0x1b, 
-	0x69, 0x81, 0x29, 0x06, 0xd0, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0x11, 0x29, 0xff, 0xd1, 0x05, 0xf7, 0xff, 
-	0xfc, 0xe4, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x1c, 0x11, 0x1c, 0x3a, 
-	0xf0, 0x00, 0xfb, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x1a, 0x40, 0x4b, 0x04, 0x42, 0x98, 0xd2, 0x01, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 
-	0x2e, 0x08, 0x05, 0xb0, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0x90, 0x68, 0x44, 0x6a, 0x61, 0x1c, 0x07, 
-	0x29, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x10, 
-	0xfc, 0x51, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40, 
-	0xd2, 0x06, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfc, 0x98, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x69, 0xb8, 0x28, 0x00, 0xd1, 0xf9, 0x6a, 0xa2, 
-	0x2a, 0x00, 0xd0, 0x03, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x10, 0xfc, 0x3e, 0x21, 0x01, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0x87, 0x20, 0x00, 0x23, 0x03, 
-	0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0x48, 0x03, 
-	0x68, 0x00, 0x30, 0x19, 0x61, 0x38, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xcc, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 
-	0xd1, 0x03, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0xb8, 0x4c, 0x23, 0x28, 0x05, 
-	0xd0, 0x30, 0xdc, 0x0b, 0x28, 0x01, 0xd0, 0x1e, 
-	0x28, 0x02, 0xd0, 0x23, 0x28, 0x03, 0xd0, 0x25, 
-	0x28, 0x04, 0xd1, 0x14, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x03, 0xe0, 0x10, 0x28, 0x06, 0xd0, 0x25, 
-	0x28, 0xfe, 0xd0, 0x01, 0x28, 0xff, 0xd1, 0x0a, 
-	0x69, 0x78, 0x68, 0x21, 0x1a, 0x08, 0x23, 0xff, 
-	0x33, 0xf5, 0x42, 0x98, 0xd9, 0x03, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x4a, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x20, 
-	0x30, 0x05, 0x61, 0x38, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfc, 0x6d, 0xe7, 0xf4, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0x84, 0xe7, 0xf0, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0xa7, 0xe7, 0xec, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x3f, 0xe7, 0xe8, 0x68, 0xf8, 0xf0, 0x00, 
-	0xfc, 0x53, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0xb1, 0x68, 0xf8, 0xf0, 0x00, 
-	0xfb, 0xd9, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38, 
-	0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 
-	0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 0x9f, 0x04, 
-	0x68, 0x42, 0x1c, 0x1c, 0x42, 0x8a, 0xdc, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x23, 0xc9, 0x00, 0x9b, 
-	0x43, 0x59, 0x18, 0x40, 0x1c, 0x29, 0x1c, 0x22, 
-	0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x35, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00, 
-	0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0a, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8, 
-	0x18, 0x40, 0xf7, 0xff, 0xff, 0x81, 0x68, 0x78, 
-	0x34, 0x01, 0x42, 0xa0, 0xdc, 0xf4, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00, 
-	0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0f, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8, 
-	0x18, 0x40, 0x60, 0x84, 0x68, 0x3a, 0xc0, 0x84, 
-	0x68, 0xf8, 0x18, 0x40, 0xf7, 0xff, 0xfe, 0xee, 
-	0x68, 0x78, 0x34, 0x01, 0x42, 0xa0, 0xdc, 0xef, 
-	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x25, 0x00, 0x1c, 0x07, 0x68, 0x40, 
-	0x1c, 0x0c, 0x28, 0x00, 0xdd, 0x0f, 0x26, 0x01, 
-	0x1c, 0x30, 0x40, 0xa8, 0x40, 0x20, 0xd0, 0x06, 
-	0x21, 0xc9, 0x00, 0x89, 0x43, 0x69, 0x68, 0xf8, 
-	0x18, 0x40, 0xf7, 0xff, 0xfb, 0xe6, 0x68, 0x78, 
-	0x35, 0x01, 0x42, 0xa8, 0xdc, 0xf0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x21, 0x00, 
-	0x78, 0x07, 0x22, 0x80, 0x43, 0xd2, 0x40, 0x3a, 
-	0x1c, 0x04, 0x0a, 0x3b, 0xd3, 0x0f, 0x27, 0x00, 
-	0x30, 0x01, 0x2a, 0x00, 0xdd, 0x0d, 0x1b, 0xd3, 
-	0x00, 0xdb, 0x78, 0x06, 0x1f, 0xdd, 0x3d, 0x01, 
-	0x40, 0xae, 0x43, 0x31, 0x30, 0x01, 0x37, 0x01, 
-	0x42, 0x97, 0xdb, 0xf4, 0xe0, 0x01, 0x30, 0x01, 
-	0x1c, 0x11, 0x1b, 0x00, 0x18, 0x40, 0xbc, 0xf0, 
-	0x47, 0x70, 0xb4, 0xb0, 0x22, 0x01, 0x28, 0x80, 
-	0xda, 0x02, 0x70, 0x08, 0xbc, 0xb0, 0x47, 0x70, 
-	0x27, 0x03, 0x25, 0xff, 0x00, 0xfc, 0x1c, 0x2b, 
-	0x40, 0xa3, 0x40, 0x03, 0xd0, 0x03, 0x1c, 0x03, 
-	0x41, 0x23, 0x54, 0x8b, 0x32, 0x01, 0x37, 0x01, 
-	0xd5, 0xf4, 0x20, 0x80, 0x43, 0x10, 0x70, 0x08, 
-	0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, 0x22, 0x00, 
-	0x78, 0x41, 0x1c, 0x47, 0x20, 0x80, 0x43, 0xc0, 
-	0x40, 0x08, 0x0a, 0x09, 0xd3, 0x0f, 0x21, 0x00, 
-	0x37, 0x01, 0x28, 0x00, 0xdd, 0x0d, 0x1a, 0x43, 
-	0x00, 0xdb, 0x78, 0x3d, 0x1f, 0xdc, 0x3c, 0x01, 
-	0x40, 0xa5, 0x43, 0x2a, 0x31, 0x01, 0x37, 0x01, 
-	0x42, 0x81, 0xdb, 0xf4, 0xe0, 0x01, 0x1c, 0x02, 
-	0x37, 0x01, 0x78, 0x3b, 0xa1, 0x03, 0xa0, 0x04, 
-	0xf0, 0x10, 0xfc, 0x42, 0x78, 0x38, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x3a, 0x00, 
-	0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
-	0x3a, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x65, 
-	0x6e, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x69, 0x64, 
-	0x3d, 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 
-	0xb5, 0xb0, 0x25, 0x00, 0x60, 0x01, 0x1c, 0x07, 
-	0x4b, 0x2f, 0x18, 0xc4, 0x72, 0x25, 0x72, 0x65, 
-	0x72, 0xa5, 0x72, 0xe5, 0x1c, 0x08, 0x21, 0x01, 
-	0x04, 0x09, 0xf0, 0x10, 0xfb, 0x01, 0x21, 0x01, 
-	0x02, 0x49, 0x42, 0x88, 0xdd, 0x01, 0x60, 0x79, 
-	0xe0, 0x00, 0x60, 0x78, 0x22, 0x01, 0x04, 0x12, 
-	0x21, 0x00, 0x1d, 0xf8, 0x30, 0x01, 0xf0, 0x10, 
-	0xfb, 0xa7, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82, 
-	0x19, 0xd2, 0x4b, 0x22, 0x18, 0xd3, 0x60, 0x9d, 
-	0x4b, 0x21, 0x18, 0xd3, 0x60, 0x9d, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xd3, 0x60, 0x9d, 0x4b, 0x1f, 
-	0x18, 0xd2, 0x60, 0x95, 0x00, 0x42, 0x19, 0xd2, 
-	0x4b, 0x1d, 0x18, 0xd3, 0x81, 0x19, 0x4b, 0x1d, 
-	0x18, 0xd2, 0x81, 0x11, 0x30, 0x01, 0x28, 0x20, 
-	0xdb, 0xe5, 0x20, 0x00, 0x68, 0x79, 0x29, 0x00, 
-	0xdd, 0x11, 0x00, 0x41, 0x18, 0x09, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc9, 
-	0x72, 0x0d, 0x60, 0xcd, 0x61, 0x0d, 0x61, 0x4d, 
-	0x76, 0x0d, 0x76, 0x4d, 0x61, 0xc8, 0x68, 0x79, 
-	0x30, 0x01, 0x42, 0x81, 0xdc, 0xed, 0x4b, 0x10, 
-	0x18, 0xf8, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x00, 
-	0xf0, 0x10, 0xfb, 0x6e, 0x4b, 0x0d, 0x18, 0xf8, 
-	0x22, 0xff, 0x21, 0x00, 0x32, 0x01, 0xf0, 0x10, 
-	0xfb, 0x67, 0x60, 0xe5, 0x61, 0x25, 0x61, 0x65, 
-	0x61, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x39, 0x00, 
-	0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3a, 0x80, 
-	0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x3b, 0x40, 
-	0x00, 0x01, 0x30, 0x08, 0x00, 0x01, 0x38, 0x08, 
-	0x21, 0x00, 0x70, 0x01, 0x60, 0x41, 0x60, 0x81, 
-	0x60, 0xc1, 0x74, 0x01, 0x74, 0x41, 0x47, 0x70, 
-	0xb4, 0x80, 0x21, 0x00, 0x68, 0x42, 0x2a, 0x00, 
-	0xdd, 0x18, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0xdb, 
-	0x18, 0x1f, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xfb, 
-	0x7a, 0x1b, 0x2b, 0x00, 0xd1, 0x0b, 0x22, 0x01, 
-	0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, 0x18, 0x08, 
-	0x04, 0x13, 0x18, 0xc1, 0x72, 0x0a, 0x4b, 0x05, 
-	0x18, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x31, 0x01, 
-	0x42, 0x8a, 0xdc, 0xe6, 0x20, 0x00, 0xbc, 0x80, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 
-	0xb5, 0xb0, 0x06, 0x1d, 0x0e, 0x2d, 0x1c, 0x14, 
-	0x68, 0x0a, 0x21, 0x00, 0x1c, 0x07, 0xf0, 0x10, 
-	0xfb, 0x1b, 0x70, 0x3d, 0x2c, 0x00, 0xd0, 0x04, 
-	0x20, 0x80, 0x70, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x70, 0x78, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x99, 0x01, 
-	0x1c, 0x1c, 0x1c, 0x15, 0x1c, 0x07, 0x29, 0x00, 
-	0xd1, 0x04, 0x20, 0x00, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xf7, 0xff, 
-	0xff, 0xb7, 0x1c, 0x06, 0xd1, 0x01, 0x20, 0x00, 
-	0xe7, 0xf4, 0x69, 0x70, 0x68, 0x29, 0x43, 0x48, 
-	0x19, 0x01, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 
-	0xdd, 0x01, 0x20, 0x00, 0xe7, 0xea, 0x18, 0x2d, 
-	0x99, 0x01, 0x1d, 0xe8, 0x30, 0x01, 0x1c, 0x22, 
-	0xf0, 0x10, 0xfa, 0x84, 0x74, 0x34, 0x7a, 0x68, 
-	0x74, 0x70, 0x2f, 0x00, 0xd0, 0x04, 0x68, 0xb8, 
-	0x60, 0xb0, 0x60, 0xf7, 0x60, 0xbe, 0xe0, 0x02, 
-	0x20, 0x00, 0x60, 0xb0, 0x60, 0xf0, 0x1c, 0x30, 
-	0xe7, 0xd4, 0xb5, 0xff, 0x9c, 0x09, 0x06, 0x25, 
-	0x0e, 0x2d, 0x24, 0x00, 0x43, 0xe4, 0x1c, 0x07, 
-	0x98, 0x02, 0x1c, 0x21, 0x4b, 0x4c, 0x18, 0xfa, 
-	0x28, 0x00, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x6a, 
-	0x20, 0x00, 0xe0, 0x2d, 0x20, 0x00, 0x00, 0x43, 
-	0x19, 0xde, 0x4b, 0x48, 0x18, 0xf6, 0x23, 0x08, 
-	0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00, 0x1c, 0x04, 
-	0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e, 0x23, 0x01, 
-	0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01, 0x30, 0x01, 
-	0x28, 0x20, 0xdb, 0xec, 0x20, 0x00, 0x43, 0xc0, 
-	0x42, 0x84, 0xd1, 0x05, 0x42, 0x81, 0xd0, 0x03, 
-	0x7a, 0x13, 0x33, 0x01, 0x72, 0x13, 0x1c, 0x0c, 
-	0x2c, 0x00, 0xdb, 0x44, 0x00, 0x60, 0x19, 0xc0, 
-	0x4b, 0x38, 0x18, 0xc0, 0x81, 0x05, 0x00, 0xa0, 
-	0x19, 0xc1, 0x4b, 0x37, 0x18, 0xc8, 0x68, 0x80, 
-	0x4b, 0x36, 0x18, 0xc9, 0x68, 0x8d, 0xe0, 0x2c, 
-	0x00, 0x43, 0x19, 0xde, 0x4b, 0x34, 0x18, 0xf6, 
-	0x23, 0x08, 0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00, 
-	0x1c, 0x04, 0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e, 
-	0x23, 0x01, 0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01, 
-	0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, 0x20, 0x00, 
-	0x43, 0xc0, 0x42, 0x84, 0xd1, 0x05, 0x42, 0x81, 
-	0xd0, 0x03, 0x7a, 0x93, 0x33, 0x01, 0x72, 0x93, 
-	0x1c, 0x0c, 0x2c, 0x00, 0xdb, 0x17, 0x00, 0x60, 
-	0x19, 0xc0, 0x4b, 0x25, 0x18, 0xc0, 0x81, 0x05, 
-	0x00, 0xa0, 0x19, 0xc1, 0x23, 0x9d, 0x02, 0x5b, 
-	0x18, 0xc8, 0x68, 0x80, 0x4b, 0x21, 0x18, 0xc9, 
-	0x68, 0x8d, 0x28, 0x00, 0xd0, 0x0f, 0x99, 0x01, 
-	0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x5a, 
-	0x28, 0x00, 0xd1, 0x12, 0x43, 0xc0, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 
-	0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf7, 0x99, 0x01, 
-	0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x4a, 
-	0x1c, 0x05, 0xd1, 0x01, 0x43, 0xe8, 0xe7, 0xee, 
-	0x1c, 0x28, 0x60, 0x44, 0x9a, 0x02, 0x2a, 0x00, 
-	0xd0, 0x0c, 0x2a, 0x01, 0xd1, 0x08, 0x00, 0xa1, 
-	0x19, 0xc9, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xca, 
-	0x60, 0x90, 0x4b, 0x0c, 0x18, 0xc8, 0x60, 0x85, 
-	0x1c, 0x20, 0xe7, 0xdc, 0x00, 0xa1, 0x19, 0xc9, 
-	0x4b, 0x05, 0x18, 0xca, 0x60, 0x90, 0x4b, 0x05, 
-	0x18, 0xc8, 0x60, 0x85, 0xe7, 0xf4, 0x00, 0x00, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00, 
-	0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3a, 0x80, 
-	0xb5, 0x80, 0x27, 0x00, 0x28, 0x00, 0xd1, 0x03, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0x68, 0x81, 0x29, 0x00, 0xd0, 0x0b, 
-	0x68, 0xc3, 0x2b, 0x00, 0xd0, 0x05, 0x60, 0x99, 
-	0x68, 0xc1, 0x68, 0x82, 0x60, 0xd1, 0x68, 0xc7, 
-	0xe0, 0x07, 0x60, 0xca, 0x68, 0x87, 0xe0, 0x04, 
-	0x68, 0xc1, 0x29, 0x00, 0xd0, 0x01, 0x60, 0x8a, 
-	0x68, 0xc7, 0xf7, 0xff, 0xfe, 0xbd, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 
-	0x1c, 0x07, 0x98, 0x01, 0x68, 0x46, 0x99, 0x02, 
-	0x29, 0x00, 0xd0, 0x0b, 0x29, 0x01, 0xd1, 0x12, 
-	0x00, 0xb0, 0x19, 0xc0, 0x23, 0x9d, 0x02, 0x5b, 
-	0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2c, 0x18, 0xc0, 
-	0x68, 0x84, 0xe0, 0x0a, 0x00, 0xb0, 0x19, 0xc0, 
-	0x4b, 0x2a, 0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2a, 
-	0x18, 0xc0, 0x68, 0x84, 0xe0, 0x01, 0x25, 0x00, 
-	0x24, 0x00, 0x99, 0x01, 0x42, 0xa9, 0xd1, 0x08, 
-	0x98, 0x01, 0xf7, 0xff, 0xff, 0xb9, 0x99, 0x01, 
-	0x1c, 0x05, 0x42, 0xa1, 0xd1, 0x08, 0x24, 0x00, 
-	0xe0, 0x06, 0x99, 0x01, 0x42, 0xa1, 0xd1, 0x03, 
-	0x98, 0x01, 0xf7, 0xff, 0xff, 0xad, 0x1c, 0x04, 
-	0x22, 0x00, 0x43, 0xd2, 0x99, 0x02, 0x4b, 0x1d, 
-	0x18, 0xf8, 0x29, 0x00, 0xd0, 0x1a, 0x29, 0x01, 
-	0xd1, 0x14, 0x00, 0xb1, 0x19, 0xc9, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x14, 
-	0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0x09, 
-	0x2c, 0x00, 0xd1, 0x07, 0x7a, 0x81, 0x39, 0x01, 
-	0x72, 0x81, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x12, 
-	0x18, 0xc0, 0x81, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xb1, 0x19, 0xc9, 
-	0x4b, 0x0a, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x0a, 
-	0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0xf1, 
-	0x2c, 0x00, 0xd1, 0xef, 0x7a, 0x01, 0x39, 0x01, 
-	0x72, 0x01, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x07, 
-	0x18, 0xc0, 0x81, 0x02, 0xe7, 0xe6, 0x00, 0x00, 
-	0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x39, 0x00, 
-	0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3b, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x1a, 0x0e, 0x12, 
-	0xb0, 0x82, 0x92, 0x00, 0x1c, 0x04, 0x1c, 0x08, 
-	0x1c, 0x0d, 0xb0, 0x81, 0xf7, 0xff, 0xfd, 0x8e, 
-	0x90, 0x00, 0x1c, 0x3a, 0x1c, 0x03, 0xa1, 0x27, 
-	0x48, 0x27, 0xf0, 0x10, 0xf9, 0xe9, 0x2f, 0x00, 
-	0xdd, 0x42, 0x4b, 0x26, 0x18, 0xe0, 0x90, 0x02, 
-	0x68, 0x20, 0x38, 0x02, 0x42, 0xb8, 0xda, 0x01, 
-	0x1c, 0x06, 0xe0, 0x00, 0x1c, 0x3e, 0x42, 0xbe, 
-	0xda, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 
-	0x98, 0x02, 0x9b, 0x00, 0x1c, 0x21, 0xf7, 0xff, 
-	0xfe, 0x47, 0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00, 
-	0x99, 0x03, 0x1c, 0x20, 0x1c, 0xb3, 0xf7, 0xff, 
-	0xfe, 0x88, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, 0x19, 0x00, 
-	0x4b, 0x13, 0x18, 0xc0, 0x68, 0x80, 0x69, 0x40, 
-	0x68, 0x21, 0x43, 0x48, 0x30, 0x02, 0x19, 0x81, 
-	0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x20, 0x30, 0x08, 
-	0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x10, 0xf8, 0xda, 
-	0x1b, 0xbf, 0x19, 0xad, 0x2f, 0x00, 0xdc, 0xbf, 
-	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x3a, 0x00, 
-	0x2e, 0x00, 0x85, 0xcc, 0x00, 0x01, 0x38, 0x08, 
-	0x00, 0x01, 0x39, 0x00, 0xb5, 0xf3, 0xb0, 0x83, 
-	0x1c, 0x07, 0x99, 0x04, 0x00, 0x88, 0x19, 0xc0, 
-	0x4b, 0x2f, 0x18, 0xc0, 0x90, 0x02, 0x68, 0x84, 
-	0x4b, 0x2e, 0x18, 0xfb, 0x93, 0x01, 0x2c, 0x00, 
-	0xd0, 0x46, 0x25, 0x00, 0x7c, 0x26, 0x69, 0x60, 
-	0x68, 0x39, 0x43, 0x48, 0x7c, 0x61, 0x23, 0x80, 
-	0x40, 0x19, 0x91, 0x00, 0x30, 0x02, 0x19, 0x81, 
-	0x02, 0x5b, 0x39, 0x02, 0x42, 0x99, 0xdd, 0x04, 
-	0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x18, 0x38, 0x1d, 0xc1, 0x31, 0x01, 
-	0x19, 0x78, 0x1e, 0xb2, 0x4b, 0x20, 0x18, 0xc0, 
-	0xf0, 0x10, 0xf8, 0x9c, 0x19, 0xa8, 0x1e, 0x85, 
-	0x68, 0xa0, 0x42, 0xa0, 0xd0, 0x04, 0x1c, 0x04, 
-	0xd0, 0x02, 0x99, 0x00, 0x29, 0x00, 0xd1, 0xd9, 
-	0x23, 0x01, 0x02, 0xdb, 0x42, 0x9d, 0xda, 0x1b, 
-	0x9b, 0x01, 0x68, 0xda, 0x4b, 0x16, 0x18, 0xf8, 
-	0x9b, 0x01, 0x69, 0x9b, 0x1c, 0x29, 0xf0, 0x10, 
-	0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x18, 0x98, 0x02, 
-	0x68, 0x81, 0x29, 0x00, 0xd0, 0x0c, 0x7c, 0x48, 
-	0x24, 0x80, 0x40, 0x04, 0x22, 0x01, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0xd5, 0x98, 0x02, 0x68, 0x81, 
-	0x29, 0x00, 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0xf2, 
-	0x99, 0x04, 0x1c, 0x48, 0xd5, 0x06, 0x42, 0x40, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x03, 
-	0xb0, 0x03, 0xe7, 0xbe, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, 0xe7, 0xb8, 
-	0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x30, 0x08, 0xb5, 0xf0, 0x21, 0x00, 
-	0x4b, 0x24, 0x18, 0xc4, 0x7a, 0xe7, 0x7a, 0xa2, 
-	0x25, 0x00, 0x2a, 0x00, 0xd1, 0x03, 0x1c, 0x28, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00, 
-	0xe0, 0x1e, 0x00, 0x7b, 0x18, 0x1e, 0x4b, 0x1e, 
-	0x18, 0xf6, 0x23, 0x08, 0x5e, 0xf3, 0x2b, 0x00, 
-	0xdb, 0x0c, 0x00, 0xbb, 0x18, 0x1e, 0x23, 0x9d, 
-	0x02, 0x5b, 0x18, 0xf3, 0x68, 0x9b, 0x2b, 0x00, 
-	0xd0, 0x04, 0x7c, 0x5e, 0x0a, 0x33, 0xd2, 0x01, 
-	0x21, 0x01, 0xe0, 0x09, 0x37, 0x01, 0xd5, 0x04, 
-	0x42, 0x7f, 0x06, 0xff, 0x0e, 0xff, 0x42, 0x7f, 
-	0xe0, 0x01, 0x06, 0xff, 0x0e, 0xff, 0x32, 0x01, 
-	0x2a, 0x20, 0xda, 0x01, 0x29, 0x00, 0xd0, 0xdc, 
-	0x29, 0x00, 0xd1, 0x04, 0x72, 0xe5, 0x1c, 0x28, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x72, 0xe7, 
-	0x1c, 0x39, 0xf7, 0xff, 0xff, 0x57, 0x1c, 0x78, 
-	0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x72, 0xe0, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x01, 0x3b, 0x80, 
-	0x00, 0x01, 0x3b, 0x40, 0xb5, 0xb0, 0x78, 0x0b, 
-	0x1c, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0xa1, 0x0c, 
-	0x48, 0x0c, 0xf0, 0x10, 0xf8, 0xd1, 0x78, 0x3a, 
-	0xb4, 0x04, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0x39, 
-	0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x86, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x85, 0xcc, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x4b, 0x2a, 0x18, 0xc4, 
-	0x7a, 0x65, 0x7a, 0x20, 0x28, 0x00, 0xd1, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x43, 0xc1, 0xe0, 0x09, 0x35, 0x01, 0xd5, 0x04, 
-	0x42, 0x6d, 0x06, 0xed, 0x0e, 0xed, 0x42, 0x6d, 
-	0xe0, 0x01, 0x06, 0xed, 0x0e, 0xed, 0x30, 0x01, 
-	0x28, 0x20, 0xda, 0x07, 0x00, 0x6a, 0x19, 0xd2, 
-	0x4b, 0x1e, 0x18, 0xd2, 0x23, 0x08, 0x5e, 0xd2, 
-	0x42, 0x8a, 0xd0, 0xeb, 0x00, 0xa8, 0x19, 0xc0, 
-	0x4b, 0x1b, 0x18, 0xc1, 0x68, 0x89, 0x29, 0x00, 
-	0xd0, 0x10, 0x72, 0x65, 0x4b, 0x19, 0x18, 0xc6, 
-	0x68, 0xb1, 0x69, 0x48, 0x68, 0x3a, 0x43, 0x50, 
-	0x7c, 0x09, 0x18, 0x0a, 0x23, 0x01, 0x04, 0x1b, 
-	0x42, 0x9a, 0xdd, 0x08, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x72, 0x60, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38, 
-	0x69, 0x22, 0x69, 0x63, 0x30, 0x08, 0xf0, 0x0f, 
-	0xff, 0x4d, 0x22, 0x00, 0x68, 0xb1, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0xfd, 0x1c, 0x68, 0xd5, 0x04, 
-	0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 
-	0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 0x72, 0x60, 
-	0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00, 
-	0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 
-	0xb5, 0xff, 0xb0, 0x8b, 0x9a, 0x0d, 0x1c, 0x1c, 
-	0x1c, 0x0f, 0x2a, 0x02, 0xda, 0x06, 0x20, 0x00, 
-	0x43, 0xc0, 0xb0, 0x0b, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x79, 0x91, 0x04, 
-	0x31, 0x02, 0x78, 0x3b, 0x1c, 0x0d, 0x42, 0x83, 
-	0xd0, 0x07, 0x1c, 0x19, 0x1c, 0x02, 0xa0, 0xf9, 
-	0xf0, 0x10, 0xf8, 0x3e, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe7, 0xec, 0x9a, 0x0d, 0x42, 0x91, 0xdd, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xe6, 0x1d, 0x39, 
-	0x91, 0x0a, 0x1d, 0xe2, 0x32, 0x59, 0x92, 0x09, 
-	0x1d, 0xe6, 0x36, 0x39, 0x28, 0x1d, 0xd0, 0x63, 
-	0xdc, 0x08, 0x28, 0x15, 0xd0, 0x13, 0x28, 0x1a, 
-	0xd0, 0x5f, 0x28, 0x1b, 0xd0, 0x5e, 0x28, 0x1c, 
-	0xd0, 0x5a, 0xe0, 0x7a, 0x28, 0x20, 0xd0, 0x41, 
-	0x1c, 0xbe, 0x28, 0xc0, 0xd0, 0x74, 0x28, 0xc1, 
-	0xd1, 0x73, 0x98, 0x14, 0x28, 0x1b, 0xd0, 0x71, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc6, 0x78, 0xb8, 
-	0x28, 0x05, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe7, 0xc0, 0x78, 0xf8, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xba, 0x98, 0x04, 
-	0x1e, 0x82, 0x2a, 0x4f, 0xda, 0x04, 0x99, 0x0a, 
-	0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x33, 0xe0, 0x04, 
-	0x22, 0x4f, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f, 
-	0xff, 0x2d, 0x78, 0xfa, 0x78, 0xb9, 0x9c, 0x0a, 
-	0xa0, 0xe0, 0x1c, 0x23, 0xf0, 0x0f, 0xff, 0xf4, 
-	0x98, 0x04, 0x18, 0x38, 0x1c, 0x47, 0x42, 0xa7, 
-	0xd9, 0x0c, 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x62, 
-	0x19, 0x00, 0x1c, 0x44, 0x42, 0xa7, 0xd9, 0x03, 
-	0x1c, 0x21, 0xa0, 0xdd, 0xf0, 0x0f, 0xff, 0xe4, 
-	0x42, 0xa7, 0xd8, 0xf2, 0xa0, 0xd4, 0xf0, 0x0f, 
-	0xff, 0xdf, 0xe0, 0xe3, 0x98, 0x04, 0x28, 0x04, 
-	0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x89, 
-	0x78, 0xf8, 0x02, 0x00, 0x78, 0xb9, 0x43, 0x08, 
-	0x82, 0x30, 0x79, 0x78, 0x02, 0x00, 0x79, 0x39, 
-	0x43, 0x08, 0x82, 0x70, 0x8a, 0x72, 0x8a, 0x31, 
-	0xa0, 0xd1, 0xf0, 0x0f, 0xff, 0xc9, 0xe0, 0xcd, 
-	0xe2, 0x17, 0xe0, 0x00, 0xe0, 0x62, 0x78, 0xb8, 
-	0x07, 0x80, 0x0f, 0x80, 0x30, 0x01, 0x75, 0x30, 
-	0x78, 0xb8, 0x08, 0x80, 0x07, 0x00, 0x0f, 0x00, 
-	0x30, 0x01, 0x75, 0x70, 0x78, 0xf8, 0x9a, 0x09, 
-	0x73, 0x10, 0x20, 0x00, 0x65, 0xa0, 0x7d, 0x31, 
-	0x29, 0x00, 0xdd, 0x0e, 0x18, 0x39, 0x79, 0x09, 
-	0x00, 0xc2, 0x40, 0x91, 0x6d, 0xa2, 0x43, 0x11, 
-	0x65, 0xa1, 0x7d, 0x31, 0x30, 0x01, 0xe0, 0x02, 
-	0xe1, 0x02, 0xe1, 0xf9, 0xe1, 0x4b, 0x42, 0x81, 
-	0xdc, 0xf0, 0x7d, 0x30, 0x30, 0x04, 0x90, 0x03, 
-	0x7d, 0x72, 0x18, 0x39, 0x1d, 0xe0, 0x30, 0x55, 
-	0xf0, 0x0f, 0xfe, 0xcc, 0x7d, 0x70, 0x99, 0x03, 
-	0x18, 0x40, 0x90, 0x03, 0x6d, 0xa1, 0xa0, 0xbc, 
-	0xf0, 0x0f, 0xff, 0x92, 0x7d, 0x70, 0x28, 0x00, 
-	0xd0, 0x17, 0xa0, 0xbf, 0xf0, 0x0f, 0xff, 0x8c, 
-	0x21, 0x00, 0x91, 0x02, 0x7d, 0x70, 0x28, 0x00, 
-	0xdd, 0x0c, 0x99, 0x02, 0x18, 0x60, 0x30, 0x40, 
-	0x7f, 0x01, 0xa0, 0xbc, 0xf0, 0x0f, 0xff, 0x80, 
-	0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 0x7d, 0x70, 
-	0x42, 0x88, 0xdc, 0xf2, 0xa0, 0xb9, 0xf0, 0x0f, 
-	0xff, 0x77, 0x9a, 0x09, 0x7b, 0x11, 0xa0, 0xb8, 
-	0xf0, 0x0f, 0xff, 0x72, 0x22, 0x1a, 0xb4, 0x04, 
-	0x98, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39, 
-	0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 0xff, 0x10, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x6a, 0x42, 0x68, 
-	0xb0, 0x0b, 0xe7, 0x13, 0x78, 0xb8, 0x06, 0x86, 
-	0x0e, 0xb6, 0x1c, 0x31, 0xa0, 0xb1, 0xf0, 0x0f, 
-	0xff, 0x5b, 0x9a, 0x09, 0x7b, 0x10, 0x42, 0xb0, 
-	0xd1, 0x01, 0x22, 0x01, 0x67, 0x62, 0x78, 0xb8, 
-	0x23, 0xc0, 0x40, 0x18, 0x28, 0xc0, 0xd0, 0x02, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xfe, 0x2e, 0x00, 
-	0xd1, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf9, 
-	0x78, 0xf8, 0x28, 0x04, 0xd0, 0x02, 0x1c, 0x28, 
-	0xb0, 0x0b, 0xe6, 0xf3, 0x79, 0x38, 0x90, 0x08, 
-	0x23, 0x0b, 0x40, 0x18, 0x28, 0x09, 0xda, 0x02, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xea, 0x20, 0x00, 
-	0x21, 0x00, 0x79, 0x7a, 0x92, 0x07, 0x9a, 0x07, 
-	0x40, 0xca, 0x08, 0x52, 0xd3, 0x05, 0x30, 0x01, 
-	0x18, 0x3a, 0x79, 0x52, 0x0a, 0x12, 0xd3, 0x00, 
-	0x30, 0x01, 0x31, 0x01, 0x29, 0x08, 0xdb, 0xf2, 
-	0x1c, 0x41, 0x98, 0x08, 0x08, 0xc0, 0xd3, 0x22, 
-	0x20, 0x00, 0x18, 0x7a, 0x79, 0x52, 0x92, 0x06, 
-	0x07, 0x92, 0xd0, 0x0a, 0x19, 0xca, 0x79, 0x92, 
-	0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, 
-	0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, 
-	0x30, 0x01, 0x9a, 0x06, 0x08, 0x92, 0x07, 0x52, 
-	0xd0, 0x0b, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, 
-	0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, 
-	0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, 
-	0x30, 0x01, 0x18, 0x08, 0x1c, 0x41, 0x18, 0x78, 
-	0x79, 0x40, 0x28, 0x22, 0xd0, 0x03, 0x1c, 0x28, 
-	0xb0, 0x0b, 0xe6, 0xab, 0xe1, 0x49, 0x1c, 0x48, 
-	0x99, 0x08, 0x09, 0x49, 0xd3, 0x05, 0x18, 0x39, 
-	0x79, 0x49, 0x09, 0x49, 0xd3, 0x00, 0x30, 0x02, 
-	0x30, 0x01, 0x99, 0x08, 0x09, 0x49, 0x07, 0x49, 
-	0xd0, 0x1b, 0x22, 0x00, 0x92, 0x01, 0x92, 0x00, 
-	0x18, 0x39, 0x79, 0x49, 0x91, 0x05, 0x08, 0xc9, 
-	0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01, 
-	0x39, 0x01, 0x40, 0x8a, 0x92, 0x01, 0x99, 0x05, 
-	0x09, 0x49, 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 
-	0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, 0x92, 0x00, 
-	0x99, 0x00, 0x9a, 0x01, 0x18, 0x51, 0x18, 0x08, 
-	0x30, 0x01, 0x1d, 0x41, 0x91, 0x03, 0x22, 0x1b, 
-	0xb4, 0x04, 0x99, 0x04, 0x9a, 0x0e, 0x1a, 0x52, 
-	0x18, 0x79, 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 
-	0xfe, 0x6b, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x6e, 0x99, 0x03, 
-	0x18, 0x08, 0x22, 0x1b, 0xb4, 0x04, 0x9a, 0x0e, 
-	0x1a, 0x12, 0x18, 0x39, 0x20, 0xc1, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfe, 0x5a, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x5d, 
-	0x9a, 0x09, 0x74, 0x96, 0x9a, 0x09, 0x7c, 0x91, 
-	0xa0, 0x5d, 0xf0, 0x0f, 0xfe, 0xa5, 0xe0, 0xf4, 
-	0x98, 0x14, 0x28, 0x1a, 0xd1, 0x2f, 0x98, 0x04, 
-	0x28, 0x0e, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
-	0xe6, 0x4c, 0x78, 0xb8, 0x28, 0x41, 0xd1, 0x02, 
-	0x78, 0xf8, 0x28, 0x02, 0xd0, 0x02, 0x42, 0x68, 
-	0xb0, 0x0b, 0xe6, 0x43, 0xa0, 0x5a, 0xf0, 0x0f, 
-	0xfe, 0x05, 0x99, 0x0a, 0x1c, 0x02, 0xa0, 0x58, 
-	0xf0, 0x0f, 0xfe, 0xba, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x36, 0xa0, 0x54, 
-	0xf0, 0x0f, 0xfd, 0xf8, 0x19, 0xc0, 0x1d, 0x01, 
-	0x1d, 0xe0, 0x30, 0x66, 0x22, 0x04, 0x1c, 0x07, 
-	0xf0, 0x0f, 0xfe, 0x2c, 0x20, 0x00, 0x9a, 0x09, 
-	0x74, 0x50, 0x1c, 0x3a, 0xa1, 0x4c, 0xa0, 0x4f, 
-	0xf0, 0x0f, 0xfe, 0x72, 0xe0, 0xc1, 0x98, 0x14, 
-	0x28, 0x1b, 0xd1, 0x11, 0xa0, 0x4f, 0xf0, 0x0f, 
-	0xfd, 0xe1, 0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x4d, 
-	0xf0, 0x0f, 0xfe, 0x96, 0x28, 0x00, 0xd0, 0x02, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x12, 0xa1, 0x49, 
-	0xa0, 0x4b, 0xf0, 0x0f, 0xfe, 0x5d, 0xe0, 0xac, 
-	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x0a, 0xa0, 0x4c, 
-	0xf0, 0x0f, 0xfd, 0xcc, 0x1c, 0x31, 0x1c, 0x02, 
-	0xa0, 0x49, 0xf0, 0x0f, 0xfe, 0x81, 0x28, 0x00, 
-	0xe0, 0x96, 0x00, 0x00, 0x74, 0x75, 0x70, 0x6c, 
-	0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 
-	0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x74, 
-	0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, 
-	0x78, 0x25, 0x30, 0x32, 0x78, 0x20, 0x6e, 0x6f, 
-	0x74, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 
-	0x0a, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, 
-	0x5f, 0x31, 0x3a, 0x20, 0x25, 0x64, 0x2e, 0x25, 
-	0x64, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 
-	0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x61, 0x6e, 0x66, 0x69, 0x64, 0x3a, 0x20, 
-	0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, 0x20, 
-	0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, 
-	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x62, 
-	0x61, 0x73, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x34, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x61, 0x73, 0x6b, 0x3a, 0x20, 0x30, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
-	0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 
-	0x65, 0x78, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, 
-	0x32, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66, 
-	0x69, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 
-	0x20, 0x6e, 0x62, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0x63, 0x66, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 
-	0x65, 0x20, 0x63, 0x6f, 0x72, 0x20, 0x76, 0x61, 
-	0x6c, 0x75, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, 
-	0x30, 0x32, 0x78, 0x20, 0x0a, 0x00, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, 
-	0x00, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, 
-	0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x25, 
-	0x73, 0x0a, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, 
-	0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 
-	0x73, 0x74, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x3a, 
-	0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, 
-	0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, 
-	0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe5, 0x65, 
-	0x46, 0x79, 0x39, 0x1c, 0xa0, 0x04, 0xf0, 0x0f, 
-	0xfd, 0xaf, 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5d, 
-	0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5a, 0x00, 0x00, 
-	0x73, 0x74, 0x63, 0x65, 0x5f, 0x70, 0x64, 0x3a, 
-	0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, 
-	0xb5, 0xf0, 0x26, 0x00, 0x1c, 0x04, 0x20, 0x00, 
-	0x67, 0x60, 0x1c, 0x0d, 0x1c, 0x17, 0xe0, 0x00, 
-	0x36, 0x01, 0x42, 0xbe, 0xda, 0x02, 0x5d, 0xa8, 
-	0x28, 0x1d, 0xd1, 0xf9, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1d, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfd, 0x32, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 
-	0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1c, 
-	0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x21, 0xb0, 0x01, 
-	0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 
-	0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 
-	0x20, 0x15, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x10, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 
-	0x19, 0xa9, 0x20, 0x20, 0x1c, 0x23, 0xf7, 0xff, 
-	0xfc, 0xff, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1a, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfc, 0xee, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0xe0, 0x10, 
-	0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 
-	0x20, 0x1b, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xdc, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x18, 0x36, 0x42, 0xbe, 0xda, 0x02, 0x6f, 0x60, 
-	0x28, 0x00, 0xd0, 0xe9, 0x22, 0x00, 0xb4, 0x04, 
-	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x14, 0x1c, 0x23, 
-	0xf7, 0xff, 0xfc, 0xc6, 0xb0, 0x01, 0x28, 0x00, 
-	0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 0x06, 0x0e, 
-	0x0e, 0x36, 0xb0, 0x83, 0xf0, 0x0c, 0xfc, 0x40, 
-	0x1c, 0x05, 0xd0, 0x05, 0x00, 0xa8, 0x30, 0x0c, 
-	0xf7, 0xfc, 0xfc, 0x2c, 0x1c, 0x04, 0xd1, 0x01, 
-	0x20, 0x00, 0xe0, 0x22, 0x95, 0x01, 0x1d, 0xe0, 
-	0x30, 0x05, 0x90, 0x02, 0x46, 0x6a, 0xb4, 0x04, 
-	0x25, 0x00, 0x98, 0x04, 0x1c, 0x31, 0xaa, 0x02, 
-	0x1c, 0x2b, 0x1c, 0x27, 0xf0, 0x0c, 0xf9, 0xe6, 
-	0xb0, 0x01, 0x98, 0x00, 0x60, 0x38, 0x28, 0x00, 
-	0xd0, 0x0b, 0x99, 0x05, 0xf0, 0x0c, 0xfb, 0xbc, 
-	0x28, 0x00, 0xd1, 0x02, 0x60, 0x7d, 0x1c, 0x38, 
-	0xe0, 0x07, 0x68, 0x38, 0xa9, 0x01, 0xf0, 0x0c, 
-	0xfa, 0x05, 0x1c, 0x20, 0xf7, 0xfc, 0xfc, 0x28, 
-	0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x0b, 
-	0x9e, 0x09, 0xb0, 0x8b, 0x4a, 0x7c, 0x92, 0x0a, 
-	0x4d, 0x7c, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
-	0x00, 0x81, 0x9a, 0x0a, 0x58, 0x51, 0x29, 0x00, 
-	0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x16, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x12, 0x2c, 0x08, 
-	0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0a, 
-	0x58, 0x10, 0x28, 0x00, 0xd0, 0x0a, 0x20, 0x00, 
-	0xe0, 0xd8, 0x23, 0x20, 0x5e, 0xec, 0x1c, 0x60, 
-	0x84, 0x28, 0x5e, 0xe8, 0x28, 0x00, 0xd1, 0x01, 
-	0x20, 0x64, 0x84, 0x28, 0x98, 0x15, 0x28, 0x00, 
-	0xd0, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x22, 0x01, 
-	0xe0, 0x02, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x03, 
-	0x92, 0x01, 0x1c, 0x30, 0xf0, 0x08, 0xfd, 0xf5, 
-	0x90, 0x00, 0x00, 0x80, 0x30, 0x80, 0xf7, 0xfc, 
-	0xfb, 0xc5, 0x1c, 0x07, 0xd0, 0xdf, 0x98, 0x00, 
-	0x1d, 0xc2, 0x32, 0x79, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x0f, 0xfc, 0x2e, 0x98, 0x00, 0x60, 0xf8, 
-	0x1d, 0xf8, 0x30, 0x79, 0x61, 0x38, 0x98, 0x0d, 
-	0x86, 0x78, 0x98, 0x0e, 0x86, 0xb8, 0x98, 0x0b, 
-	0x90, 0x02, 0x99, 0x0c, 0x91, 0x03, 0x9a, 0x0d, 
-	0x18, 0x80, 0x38, 0x01, 0x90, 0x04, 0x98, 0x0e, 
-	0x18, 0x08, 0x38, 0x01, 0x90, 0x05, 0xa8, 0x02, 
-	0x1c, 0x31, 0xf0, 0x08, 0xfd, 0xd5, 0x61, 0x78, 
-	0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x0e, 0x2a, 0x01, 
-	0xd1, 0x27, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x9a, 
-	0x61, 0xb8, 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 
-	0x00, 0x8a, 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x04, 
-	0x20, 0x01, 0xe0, 0x14, 0x23, 0x28, 0x5e, 0xe8, 
-	0x1c, 0x41, 0x85, 0x29, 0x28, 0x00, 0xd1, 0x01, 
-	0xf7, 0xf7, 0xf8, 0x5e, 0x69, 0x78, 0x00, 0x80, 
-	0xf7, 0xfc, 0xfb, 0xcc, 0x61, 0xb8, 0x28, 0x00, 
-	0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, 
-	0xf0, 0x0f, 0xfb, 0xee, 0x20, 0x00, 0x86, 0x38, 
-	0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 0x43, 0x18, 
-	0xe0, 0x10, 0x98, 0x15, 0x61, 0xb8, 0x98, 0x15, 
-	0x0e, 0x00, 0x06, 0x00, 0x90, 0x15, 0x23, 0x0d, 
-	0x06, 0x9b, 0x42, 0xd8, 0xd1, 0x01, 0x20, 0x00, 
-	0xe0, 0x00, 0x20, 0x01, 0x86, 0x38, 0x69, 0xf8, 
-	0x4b, 0x33, 0x40, 0x18, 0x61, 0xf8, 0x69, 0xb8, 
-	0x28, 0x00, 0xd1, 0x06, 0x69, 0x78, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x7c, 
-	0xe7, 0x75, 0x68, 0xf8, 0x90, 0x06, 0x69, 0x38, 
-	0x90, 0x07, 0x69, 0x78, 0x90, 0x08, 0x69, 0xb8, 
-	0x90, 0x09, 0xa8, 0x02, 0x1c, 0x21, 0x1d, 0xfa, 
-	0x32, 0x01, 0xb4, 0x07, 0x1c, 0x32, 0xb4, 0x04, 
-	0x20, 0x00, 0x9a, 0x05, 0xa9, 0x0a, 0xab, 0x0c, 
-	0xf0, 0x03, 0xf8, 0xa0, 0xb0, 0x04, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5f, 
-	0xe7, 0x59, 0x2e, 0x00, 0xd0, 0x09, 0x2e, 0x01, 
-	0xd0, 0x07, 0x2e, 0x02, 0xd0, 0x05, 0x2e, 0x03, 
-	0xd0, 0x03, 0x23, 0x02, 0x69, 0xf8, 0x43, 0x18, 
-	0x61, 0xf8, 0x85, 0xfc, 0x2c, 0x08, 0xd2, 0x02, 
-	0x00, 0xa0, 0x9a, 0x0a, 0x50, 0x17, 0x20, 0x01, 
-	0x24, 0x00, 0x63, 0xf8, 0x63, 0xbc, 0x85, 0xbe, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x18, 
-	0x8c, 0xa8, 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xcb, 0x22, 0x00, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xa0, 0x98, 0x17, 
-	0x60, 0x38, 0x98, 0x17, 0x28, 0x00, 0xd0, 0x06, 
-	0x22, 0x00, 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x17, 
-	0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xc1, 0x68, 0xb8, 
-	0x60, 0x78, 0x1c, 0x38, 0xb0, 0x0b, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0xff, 0xff, 0x7f, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
-	0xb0, 0x82, 0x28, 0x00, 0xd0, 0x13, 0x68, 0x78, 
-	0x28, 0x00, 0xd1, 0x10, 0x68, 0xb8, 0x90, 0x00, 
-	0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x46, 0x69, 
-	0x68, 0x38, 0xf0, 0x0c, 0xf8, 0xe7, 0x22, 0x0c, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x58, 
-	0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x05, 0xb0, 0x02, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
-	0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 0xd1, 0x03, 
-	0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x23, 0x00, 0x49, 0x22, 0x00, 0x82, 
-	0x58, 0x8c, 0x42, 0xbc, 0xd1, 0x00, 0x50, 0x8b, 
-	0x30, 0x01, 0x28, 0x08, 0xdb, 0xf7, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xc8, 0x68, 0xf8, 
-	0x90, 0x00, 0x69, 0x38, 0x90, 0x01, 0x69, 0x78, 
-	0x90, 0x02, 0x69, 0xb8, 0x90, 0x03, 0x46, 0x68, 
-	0x1d, 0xc2, 0x32, 0x01, 0x46, 0x69, 0x68, 0xb8, 
-	0xf0, 0x03, 0xfb, 0x24, 0x6a, 0x38, 0x28, 0x00, 
-	0xd0, 0x03, 0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 
-	0x30, 0x04, 0x69, 0xf8, 0x0c, 0x00, 0xd3, 0x16, 
-	0x23, 0x30, 0x5e, 0xf8, 0x28, 0x00, 0xd1, 0x0d, 
-	0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xf9, 0x48, 0x0d, 
-	0x8d, 0x01, 0x39, 0x01, 0x04, 0x09, 0x14, 0x09, 
-	0x85, 0x01, 0xd1, 0x08, 0x20, 0xff, 0xf7, 0xf6, 
-	0xff, 0x73, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
-	0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xb9, 0x22, 0x80, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x04, 
-	0x1c, 0x38, 0xf7, 0xfc, 0xfa, 0xb1, 0xe7, 0xb3, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 
-	0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x08, 
-	0x20, 0xff, 0x30, 0x01, 0x47, 0x70, 0x20, 0x02, 
-	0x47, 0x70, 0x20, 0x04, 0x47, 0x70, 0x20, 0x10, 
-	0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, 
-	0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 0x06, 0x14, 
-	0x0e, 0x24, 0x28, 0x00, 0xd0, 0x0a, 0x21, 0x03, 
-	0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x1f, 0x68, 0xb8, 
-	0x1c, 0x21, 0xf0, 0x04, 0xfc, 0xc7, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x68, 0xb8, 
-	0xf0, 0x04, 0xfc, 0x14, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x02, 
-	0x68, 0x80, 0x21, 0x02, 0xe0, 0x01, 0x68, 0x80, 
-	0x21, 0x00, 0xf0, 0x04, 0xfc, 0x07, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0x0e, 0x09, 
-	0x28, 0x00, 0xd0, 0x02, 0x68, 0x80, 0xf0, 0x04, 
-	0xfe, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
-	0x23, 0x05, 0x43, 0x18, 0x4d, 0x08, 0x84, 0xa8, 
-	0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20, 
-	0x8c, 0xa9, 0x06, 0x09, 0x0e, 0x09, 0xf7, 0xff, 
-	0xff, 0xe8, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xf5, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, 
-	0x48, 0x01, 0x23, 0x24, 0x5e, 0xc0, 0x47, 0x70, 
-	0x2e, 0x08, 0x1a, 0x4c, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x28, 0x00, 0xd0, 0x15, 0x6a, 0x20, 
-	0x28, 0x00, 0xd0, 0x06, 0x42, 0xb8, 0xd0, 0x10, 
-	0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 0x20, 0x00, 
-	0x62, 0x20, 0x2f, 0x00, 0xd0, 0x09, 0x68, 0xa0, 
-	0x68, 0x39, 0xf0, 0x0c, 0xf8, 0x19, 0x28, 0x00, 
-	0xd1, 0x03, 0x62, 0x27, 0x68, 0x78, 0x30, 0x01, 
-	0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0x06, 0x09, 0xd0, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x68, 0x80, 0xf0, 0x04, 
-	0xfd, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
-	0x1c, 0x07, 0x1c, 0x0c, 0xd0, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 
-	0xf8, 0xa5, 0x2c, 0x00, 0xd0, 0x03, 0x23, 0x01, 
-	0x69, 0xf8, 0x43, 0x18, 0xe0, 0x02, 0x69, 0xf8, 
-	0x08, 0x40, 0x00, 0x40, 0x61, 0xf8, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x21, 0x07, 
-	0x07, 0x09, 0x63, 0x88, 0x47, 0x70, 0x00, 0x00, 
-	0xb5, 0x90, 0x9c, 0x03, 0x9f, 0x04, 0xb0, 0x85, 
-	0x91, 0x00, 0x92, 0x01, 0x93, 0x02, 0x94, 0x03, 
-	0x97, 0x04, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0a, 
-	0xff, 0x69, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, 
-	0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, 
-	0x6b, 0xc0, 0x01, 0x80, 0x06, 0x05, 0x0e, 0x2d, 
-	0x95, 0x00, 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 
-	0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 
-	0x99, 0x07, 0x68, 0x48, 0x99, 0x04, 0x43, 0x48, 
-	0x99, 0x07, 0x68, 0x09, 0x08, 0xc9, 0x18, 0x0f, 
-	0x97, 0x03, 0x21, 0x00, 0x91, 0x02, 0x9b, 0x05, 
-	0x68, 0x58, 0x28, 0x00, 0xdd, 0x5e, 0x23, 0x32, 
-	0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 
-	0x9a, 0x08, 0x18, 0x81, 0x1c, 0x08, 0xd5, 0x00, 
-	0x30, 0x03, 0x10, 0x80, 0x29, 0x00, 0xda, 0x04, 
-	0x42, 0x49, 0x07, 0x89, 0x0f, 0x89, 0x42, 0x49, 
-	0xe0, 0x01, 0x07, 0x89, 0x0f, 0x89, 0x00, 0x4a, 
-	0x9d, 0x00, 0x41, 0x15, 0x1c, 0x2b, 0x06, 0x2d, 
-	0x0e, 0x2d, 0x27, 0xc0, 0x40, 0xd7, 0x06, 0x3a, 
-	0x0e, 0x12, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, 
-	0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x33, 0x88, 
-	0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 0x24, 0x00, 
-	0x9b, 0x07, 0x68, 0x9b, 0x2b, 0x00, 0xd9, 0x23, 
-	0x0a, 0x3b, 0xd3, 0x05, 0x78, 0x03, 0x43, 0x93, 
-	0x70, 0x03, 0x78, 0x03, 0x43, 0x2b, 0x70, 0x03, 
-	0x31, 0x01, 0x29, 0x03, 0xdd, 0x04, 0x22, 0xc0, 
-	0x21, 0x00, 0x9d, 0x00, 0x30, 0x01, 0xe0, 0x05, 
-	0x10, 0x92, 0x06, 0x12, 0x0e, 0x12, 0x10, 0xab, 
-	0x06, 0x1d, 0x0e, 0x2d, 0x00, 0x7b, 0x06, 0x1f, 
-	0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x03, 
-	0x9b, 0x01, 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 
-	0x9b, 0x07, 0x68, 0x9b, 0x42, 0xa3, 0xd8, 0xdb, 
-	0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 
-	0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 0x99, 0x02, 
-	0x31, 0x01, 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 
-	0x42, 0x88, 0xdc, 0xa0, 0xb0, 0x06, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 
-	0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, 
-	0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x07, 0x06, 
-	0x0f, 0x36, 0x96, 0x00, 0x01, 0x30, 0x06, 0x06, 
-	0x0e, 0x36, 0x96, 0x01, 0x68, 0x18, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 
-	0x90, 0x04, 0x68, 0x48, 0x9a, 0x04, 0x43, 0x50, 
-	0x68, 0x0a, 0x08, 0xd2, 0x18, 0x17, 0x97, 0x03, 
-	0x22, 0x00, 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 
-	0x28, 0x00, 0xdd, 0x48, 0x23, 0x32, 0x98, 0x06, 
-	0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 
-	0x18, 0x82, 0x1c, 0x10, 0xd5, 0x00, 0x30, 0x01, 
-	0x10, 0x40, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, 
-	0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x1d, 0xdd, 
-	0x35, 0x81, 0x78, 0x2f, 0x24, 0x00, 0x68, 0x8b, 
-	0x35, 0x01, 0x2b, 0x00, 0xd9, 0x21, 0x0a, 0x3b, 
-	0xd3, 0x10, 0x08, 0x53, 0xd3, 0x06, 0x78, 0x06, 
-	0x23, 0xf0, 0x40, 0x33, 0x70, 0x03, 0x78, 0x03, 
-	0x9e, 0x00, 0xe0, 0x05, 0x78, 0x03, 0x07, 0x1b, 
-	0x0f, 0x1b, 0x70, 0x03, 0x78, 0x03, 0x9e, 0x01, 
-	0x43, 0x33, 0x70, 0x03, 0x32, 0x01, 0x08, 0x53, 
-	0xd2, 0x00, 0x30, 0x01, 0x00, 0x7b, 0x06, 0x1f, 
-	0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x01, 
-	0x78, 0x2f, 0x35, 0x01, 0x68, 0x8b, 0x42, 0xa3, 
-	0xd8, 0xdd, 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 
-	0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 
-	0x9a, 0x02, 0x32, 0x01, 0x92, 0x02, 0x9b, 0x05, 
-	0x68, 0x58, 0x42, 0x90, 0xdc, 0xb6, 0xb0, 0x06, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x6a, 0x40, 
-	0x68, 0xc4, 0x98, 0x03, 0x6b, 0xc0, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0x68, 0x20, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc2, 
-	0x92, 0x02, 0x68, 0x48, 0x43, 0x50, 0x68, 0x0a, 
-	0x08, 0xd2, 0x18, 0x10, 0x90, 0x01, 0x25, 0x00, 
-	0x68, 0x60, 0x28, 0x00, 0xdd, 0x35, 0x23, 0x32, 
-	0x98, 0x03, 0x5e, 0xc0, 0x9b, 0x06, 0x43, 0x58, 
-	0x9a, 0x05, 0x18, 0x80, 0x9a, 0x03, 0x69, 0x92, 
-	0x18, 0x17, 0x98, 0x01, 0x18, 0x20, 0x1d, 0xc6, 
-	0x36, 0x81, 0x78, 0x32, 0x20, 0x00, 0x68, 0x8b, 
-	0x36, 0x01, 0x2b, 0x00, 0xd9, 0x16, 0x0a, 0x13, 
-	0xd3, 0x01, 0x9b, 0x00, 0x70, 0x3b, 0x00, 0x52, 
-	0x06, 0x12, 0x0e, 0x12, 0xd1, 0x09, 0x1d, 0xc2, 
-	0x32, 0x01, 0x08, 0xd2, 0x00, 0xd2, 0x1a, 0x10, 
-	0x19, 0xc7, 0x1c, 0x10, 0x78, 0x32, 0x36, 0x01, 
-	0xe0, 0x01, 0x30, 0x01, 0x37, 0x01, 0x68, 0x8b, 
-	0x42, 0x83, 0xd8, 0xe8, 0x98, 0x01, 0x9a, 0x02, 
-	0x18, 0x80, 0x90, 0x01, 0x9b, 0x06, 0x33, 0x01, 
-	0x93, 0x06, 0x68, 0x60, 0x35, 0x01, 0x42, 0xa8, 
-	0xdc, 0xc9, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x2c, 
-	0x1c, 0x07, 0x5e, 0xc0, 0xb0, 0x85, 0x28, 0x01, 
-	0xd0, 0x0f, 0x28, 0x02, 0xd0, 0x07, 0x28, 0x03, 
-	0xd1, 0x11, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0x9a, 0xe0, 0x5d, 0xab, 0x06, 
-	0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x23, 
-	0xe0, 0x57, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x97, 0xe0, 0x51, 0x6a, 0x78, 
-	0x68, 0xc0, 0x90, 0x04, 0x68, 0x00, 0x01, 0x00, 
-	0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 
-	0x90, 0x03, 0x99, 0x06, 0x68, 0x48, 0x99, 0x03, 
-	0x43, 0x48, 0x99, 0x06, 0x68, 0x09, 0x08, 0xc9, 
-	0x18, 0x09, 0x91, 0x02, 0x21, 0x00, 0x91, 0x01, 
-	0x98, 0x04, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x38, 
-	0x98, 0x04, 0x99, 0x02, 0x9e, 0x07, 0x18, 0x40, 
-	0x30, 0x88, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, 
-	0x24, 0x00, 0x99, 0x06, 0x68, 0x88, 0x28, 0x00, 
-	0xd9, 0x1d, 0x0a, 0x28, 0xd3, 0x05, 0x68, 0xb8, 
-	0x6b, 0xfb, 0x9a, 0x08, 0x1c, 0x31, 0xf0, 0x0a, 
-	0xfb, 0x87, 0x00, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0xd1, 0x0b, 0x1d, 0xe0, 0x30, 0x01, 0x08, 0xc0, 
-	0x00, 0xc0, 0x1b, 0x01, 0x19, 0x8e, 0x1c, 0x04, 
-	0x98, 0x00, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, 
-	0xe0, 0x01, 0x34, 0x01, 0x36, 0x01, 0x99, 0x06, 
-	0x68, 0x88, 0x42, 0xa0, 0xd8, 0xe1, 0x98, 0x03, 
-	0x99, 0x02, 0x18, 0x09, 0x91, 0x02, 0x9a, 0x08, 
-	0x32, 0x01, 0x92, 0x08, 0x99, 0x01, 0x31, 0x01, 
-	0x91, 0x01, 0x98, 0x04, 0x68, 0x40, 0x42, 0x88, 
-	0xdc, 0xc6, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 
-	0x20, 0x00, 0xb0, 0x88, 0xf0, 0x08, 0xfa, 0x35, 
-	0x90, 0x06, 0x00, 0x80, 0x30, 0x10, 0x00, 0x80, 
-	0xf7, 0xfc, 0xf8, 0x04, 0x1c, 0x04, 0x20, 0x00, 
-	0x2c, 0x00, 0xd1, 0x03, 0xb0, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1d, 0xe1, 0x31, 0x09, 
-	0x91, 0x07, 0x49, 0x19, 0x68, 0x4b, 0x1c, 0x5a, 
-	0x60, 0x4a, 0x60, 0x63, 0x60, 0xe7, 0x68, 0x39, 
-	0x01, 0x09, 0x31, 0x1f, 0x09, 0x49, 0x01, 0x49, 
-	0x90, 0x00, 0x90, 0x01, 0x1e, 0x48, 0x90, 0x02, 
-	0x68, 0xe0, 0x68, 0x40, 0x00, 0xc0, 0x38, 0x01, 
-	0x90, 0x03, 0x46, 0x68, 0x21, 0x00, 0xf0, 0x08, 
-	0xfa, 0x13, 0x60, 0xa0, 0x68, 0xe0, 0x30, 0x88, 
-	0x90, 0x05, 0x68, 0xa0, 0x90, 0x04, 0x46, 0x68, 
-	0x1c, 0x22, 0x68, 0x61, 0xb4, 0x07, 0x22, 0x00, 
-	0xb4, 0x04, 0x22, 0x01, 0x20, 0x00, 0xa9, 0x0a, 
-	0xab, 0x08, 0xf0, 0x02, 0xfd, 0x2b, 0xb0, 0x04, 
-	0x28, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0xf7, 0xfb, 
-	0xff, 0xeb, 0x24, 0x00, 0x1c, 0x20, 0xe7, 0xc5, 
-	0x2e, 0x08, 0x1a, 0x78, 0xb5, 0x80, 0x1c, 0x07, 
-	0xb0, 0x84, 0x28, 0x00, 0xd0, 0x1a, 0x20, 0x00, 
-	0xf0, 0x08, 0xf9, 0xe7, 0x90, 0x00, 0x1d, 0xf8, 
-	0x30, 0x09, 0x90, 0x01, 0x68, 0xb8, 0x90, 0x02, 
-	0x68, 0xf8, 0x30, 0x88, 0x90, 0x03, 0x46, 0x68, 
-	0x46, 0x69, 0x1d, 0xc2, 0x32, 0x01, 0x68, 0x38, 
-	0xf0, 0x03, 0xf8, 0x18, 0x22, 0x10, 0x21, 0x00, 
-	0x1c, 0x38, 0xf0, 0x0f, 0xf8, 0x19, 0x1c, 0x38, 
-	0xf7, 0xfb, 0xff, 0xc6, 0xb0, 0x04, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x32, 
-	0x1c, 0x07, 0x5e, 0xc0, 0x1c, 0x0c, 0x1c, 0x15, 
-	0xb0, 0x8a, 0x42, 0x90, 0xdd, 0x63, 0x6a, 0x78, 
-	0x28, 0x00, 0xd1, 0x0b, 0x4e, 0x38, 0x68, 0x30, 
-	0x28, 0x00, 0xd1, 0x05, 0x48, 0x37, 0xf7, 0xff, 
-	0xff, 0x7d, 0x60, 0x30, 0x28, 0x00, 0xd0, 0x61, 
-	0x68, 0x30, 0x62, 0x78, 0x23, 0x01, 0x6b, 0xb8, 
-	0x6a, 0x79, 0x42, 0xd8, 0xd1, 0x01, 0x22, 0x01, 
-	0xe0, 0x00, 0x22, 0x00, 0x92, 0x01, 0x68, 0xc8, 
-	0x90, 0x00, 0x68, 0x00, 0x90, 0x04, 0x98, 0x00, 
-	0x68, 0x40, 0x90, 0x03, 0x6b, 0xf8, 0x28, 0x01, 
-	0xd1, 0x01, 0x90, 0x02, 0xe0, 0x11, 0x20, 0x00, 
-	0x90, 0x02, 0x9a, 0x01, 0x2a, 0x00, 0xd1, 0x0c, 
-	0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x57, 0x6b, 0xba, 
-	0x99, 0x03, 0xb4, 0x06, 0x1c, 0x03, 0x9a, 0x0f, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x80, 
-	0xb0, 0x02, 0x99, 0x03, 0x91, 0x08, 0x20, 0x01, 
-	0x90, 0x09, 0x78, 0x20, 0x28, 0x00, 0xd0, 0x31, 
-	0x23, 0x32, 0x5e, 0xf8, 0x42, 0xa8, 0xdd, 0x22, 
-	0x78, 0x20, 0x99, 0x00, 0xf0, 0x00, 0xf8, 0x34, 
-	0x90, 0x07, 0x1c, 0x06, 0x78, 0x20, 0x07, 0x00, 
-	0x0f, 0x00, 0x99, 0x04, 0x43, 0x48, 0x90, 0x05, 
-	0x78, 0x20, 0x09, 0x00, 0x07, 0x40, 0x0f, 0x40, 
-	0x99, 0x03, 0x43, 0x48, 0x90, 0x06, 0x98, 0x02, 
-	0x34, 0x01, 0x28, 0x00, 0xd0, 0x0c, 0x99, 0x0d, 
-	0x9a, 0x01, 0xb4, 0x06, 0x6a, 0x78, 0x68, 0xb9, 
-	0x68, 0x00, 0xaa, 0x07, 0x1c, 0x2b, 0xf0, 0x0a, 
-	0xfd, 0x8b, 0xb0, 0x02, 0xe0, 0x06, 0xe0, 0x09, 
-	0x9b, 0x0d, 0x1c, 0x38, 0xa9, 0x05, 0x1c, 0x2a, 
-	0xf7, 0xff, 0xfe, 0xa8, 0x19, 0xad, 0x78, 0x20, 
-	0x28, 0x00, 0xd1, 0xcd, 0xb0, 0x0a, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, 
-	0x29, 0x00, 0xd1, 0x00, 0x49, 0x02, 0x06, 0x40, 
-	0x0e, 0x40, 0x18, 0x40, 0x7a, 0x00, 0x47, 0x70, 
-	0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xb0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xd1, 0x08, 0x4f, 0x0c, 0x68, 0x38, 
-	0x28, 0x00, 0xd1, 0x03, 0x48, 0x0b, 0xf7, 0xff, 
-	0xfe, 0xf9, 0x60, 0x38, 0x68, 0x3f, 0x25, 0x00, 
-	0x78, 0x20, 0x28, 0x00, 0xd0, 0x08, 0x78, 0x20, 
-	0x68, 0xf9, 0x34, 0x01, 0xf7, 0xff, 0xff, 0xe0, 
-	0x19, 0x45, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xf6, 
-	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, 
-	0xb5, 0x80, 0x28, 0x00, 0xd1, 0x08, 0x4f, 0x09, 
-	0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x48, 0x08, 
-	0xf7, 0xff, 0xfe, 0xd8, 0x60, 0x38, 0x68, 0x38, 
-	0x28, 0x00, 0xd1, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xc0, 0x68, 0x40, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x78, 
-	0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4a, 0x18, 0x21, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0xf7, 0xff, 0xfa, 0x98, 0x49, 0x16, 0x27, 0x00, 
-	0x64, 0x08, 0x49, 0x16, 0x91, 0x02, 0x49, 0x16, 
-	0x91, 0x01, 0x49, 0x16, 0x91, 0x00, 0x4c, 0x16, 
-	0x01, 0x38, 0x06, 0x01, 0x0e, 0x09, 0x20, 0x10, 
-	0x1c, 0x22, 0x1c, 0x0d, 0xf7, 0xff, 0xfa, 0x86, 
-	0x00, 0xbe, 0x99, 0x02, 0x51, 0x88, 0x20, 0x04, 
-	0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x7e, 
-	0x99, 0x01, 0x51, 0x88, 0x20, 0x02, 0x1c, 0x29, 
-	0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x77, 0x99, 0x00, 
-	0x51, 0x88, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe3, 
-	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xc0, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x90, 
-	0x2e, 0x08, 0x1a, 0x80, 0xb5, 0x80, 0x48, 0x0c, 
-	0xf7, 0xff, 0xfe, 0x84, 0x4f, 0x0b, 0x64, 0x78, 
-	0x48, 0x0b, 0xf7, 0xff, 0xfe, 0x7f, 0x64, 0xb8, 
-	0x48, 0x0a, 0xf7, 0xff, 0xfe, 0x7b, 0x64, 0xf8, 
-	0x20, 0x00, 0x22, 0x00, 0x49, 0x08, 0x00, 0x83, 
-	0x50, 0xca, 0x30, 0x01, 0x28, 0x10, 0xdb, 0xfa, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0x5e, 0x2c, 0x2e, 0x08, 0x1c, 0x80, 
-	0x2e, 0x02, 0x94, 0xb8, 0x2e, 0x02, 0xd7, 0x44, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x90, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x0b, 
-	0x29, 0x0f, 0xdc, 0x09, 0x00, 0x8c, 0x4f, 0x06, 
-	0x59, 0x39, 0x29, 0x00, 0xd0, 0x04, 0x1c, 0x08, 
-	0xf7, 0xff, 0xfb, 0x85, 0x20, 0x00, 0x51, 0x38, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xff, 0x04, 0x05, 
-	0x0c, 0x2d, 0x04, 0x10, 0x0c, 0x00, 0xb0, 0x82, 
-	0x90, 0x00, 0x04, 0x18, 0x0c, 0x00, 0x90, 0x01, 
-	0x2d, 0x00, 0xd0, 0x01, 0x2d, 0x0f, 0xdd, 0x01, 
-	0x20, 0xff, 0xe0, 0x53, 0x00, 0xaf, 0x4c, 0x2c, 
-	0x59, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x28, 
-	0xf7, 0xff, 0xff, 0xd0, 0x98, 0x00, 0x4a, 0x29, 
-	0x40, 0x02, 0x92, 0x00, 0x23, 0x2d, 0x01, 0x1b, 
-	0x42, 0x9a, 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 
-	0x23, 0x09, 0x01, 0x9b, 0x98, 0x01, 0x42, 0x98, 
-	0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 0x2d, 0x08, 
-	0xda, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, 
-	0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x9a, 0x06, 
-	0xb4, 0x04, 0x20, 0x00, 0x9a, 0x04, 0x9b, 0x05, 
-	0xf7, 0xff, 0xfa, 0x24, 0x51, 0xe0, 0xb0, 0x04, 
-	0x1c, 0x01, 0xd0, 0xd1, 0x48, 0x18, 0x6c, 0x82, 
-	0x62, 0x4a, 0x21, 0x01, 0x59, 0xe2, 0x63, 0xd1, 
-	0x21, 0x00, 0x43, 0xc9, 0x59, 0xe2, 0x63, 0x91, 
-	0x99, 0x03, 0x29, 0x08, 0xd2, 0x10, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x06, 0x08, 0x0b, 0x04, 0x06, 0x08, 0x0b, 
-	0x48, 0x0e, 0xe0, 0x02, 0x48, 0x0e, 0xe0, 0x00, 
-	0x48, 0x0e, 0x59, 0xc6, 0xe0, 0x00, 0x6c, 0x06, 
-	0x59, 0xe0, 0x1c, 0x31, 0xf7, 0xff, 0xfb, 0xd6, 
-	0x59, 0xe0, 0x68, 0x80, 0x21, 0x07, 0xf0, 0x04, 
-	0xf9, 0xbd, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x00, 0x00, 0xff, 0xfe, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x90, 
-	0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, 
-	0x14, 0x09, 0x04, 0x16, 0x14, 0x36, 0xb0, 0x85, 
-	0x28, 0x07, 0xdc, 0x29, 0x00, 0x84, 0x4f, 0x21, 
-	0x59, 0x38, 0x28, 0x00, 0xd0, 0x24, 0x08, 0x49, 
-	0x00, 0x49, 0x04, 0x0d, 0x14, 0x2d, 0x68, 0x80, 
-	0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x6b, 0x98, 0x01, 
-	0x19, 0x40, 0x90, 0x01, 0x98, 0x03, 0x19, 0x40, 
-	0x90, 0x03, 0x98, 0x02, 0x19, 0x80, 0x90, 0x02, 
-	0x98, 0x04, 0x19, 0x80, 0x90, 0x04, 0x98, 0x01, 
-	0x49, 0x15, 0x42, 0x88, 0xd8, 0x0c, 0x98, 0x02, 
-	0x42, 0x88, 0xd8, 0x09, 0x23, 0x2d, 0x01, 0x1b, 
-	0x98, 0x01, 0x42, 0x98, 0xda, 0x04, 0x23, 0x09, 
-	0x01, 0x9b, 0x98, 0x02, 0x42, 0x98, 0xdb, 0x01, 
-	0x20, 0xff, 0xe0, 0x12, 0x59, 0x38, 0x68, 0x80, 
-	0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x3b, 0x59, 0x38, 
-	0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xff, 0x0a, 
-	0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, 
-	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x4e, 
-	0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, 
-	0x80, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, 0x04, 0x16, 
-	0x0c, 0x36, 0x20, 0xff, 0xb0, 0x85, 0x2f, 0x07, 
-	0xdc, 0x10, 0x00, 0xbc, 0x4f, 0x1c, 0x59, 0x39, 
-	0x29, 0x00, 0xd0, 0x0b, 0x08, 0x5a, 0x00, 0x52, 
-	0x04, 0x15, 0x0c, 0x2d, 0x23, 0x2d, 0x01, 0x1b, 
-	0x42, 0x9d, 0xda, 0x03, 0x23, 0x09, 0x01, 0x9b, 
-	0x42, 0x9e, 0xdb, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0x88, 0xa9, 0x01, 
-	0xf0, 0x04, 0xfa, 0x0c, 0x98, 0x03, 0x99, 0x01, 
-	0x1a, 0x40, 0x90, 0x03, 0x19, 0x40, 0x90, 0x03, 
-	0x98, 0x04, 0x99, 0x02, 0x1a, 0x40, 0x90, 0x04, 
-	0x19, 0x80, 0x90, 0x04, 0x95, 0x01, 0x96, 0x02, 
-	0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x01, 
-	0xff, 0xed, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, 
-	0xf0, 0x03, 0xfe, 0xbc, 0x98, 0x00, 0x28, 0x00, 
-	0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, 
-	0xf0, 0x03, 0xfc, 0x00, 0x20, 0x00, 0xe7, 0xd5, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 
-	0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x00, 
-	0xf0, 0x03, 0xfb, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0x80, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x0c, 
-	0x29, 0x01, 0xdb, 0x0a, 0x00, 0x88, 0x49, 0x06, 
-	0x58, 0x08, 0x27, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfa, 0x36, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, 
-	0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, 
-	0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, 
-	0x23, 0x32, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, 
-	0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, 
-	0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, 
-	0x23, 0x34, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x04, 0x03, 
-	0x0c, 0x1b, 0x04, 0x0a, 0x0c, 0x12, 0x20, 0xff, 
-	0x2b, 0x07, 0xdc, 0x10, 0x00, 0x9d, 0x4f, 0x09, 
-	0x59, 0x79, 0x29, 0x00, 0xd0, 0x0b, 0x07, 0x14, 
-	0x0f, 0x24, 0x68, 0x88, 0x21, 0x03, 0xf0, 0x03, 
-	0xfe, 0xa5, 0x59, 0x78, 0x68, 0x80, 0x1c, 0x21, 
-	0xf0, 0x03, 0xff, 0x4c, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x02, 0xf0, 0x03, 0xfe, 0x8b, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x00, 0xf0, 0x03, 0xfe, 0x77, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0xf0, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x09, 
-	0x0c, 0x09, 0x04, 0x12, 0x0c, 0x12, 0x04, 0x1e, 
-	0x0c, 0x36, 0x9c, 0x05, 0x9f, 0x06, 0x04, 0x24, 
-	0x0c, 0x24, 0x04, 0x3f, 0x0c, 0x3f, 0x20, 0xff, 
-	0xb0, 0x85, 0x2d, 0x0f, 0xdc, 0x04, 0x00, 0xab, 
-	0x4d, 0x10, 0x58, 0xed, 0x2d, 0x00, 0xd1, 0x03, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x19, 0x88, 0x23, 0x32, 0x5e, 0xeb, 0x42, 0x98, 
-	0xdd, 0x02, 0x1a, 0x58, 0x04, 0x06, 0x0c, 0x36, 
-	0x19, 0x10, 0x23, 0x34, 0x5e, 0xeb, 0x42, 0x98, 
-	0xdd, 0x02, 0x1a, 0x98, 0x04, 0x04, 0x0c, 0x24, 
-	0x91, 0x00, 0x92, 0x01, 0x96, 0x02, 0x94, 0x03, 
-	0x97, 0x04, 0x46, 0x69, 0x68, 0xa8, 0xf0, 0x0a, 
-	0xfa, 0x1d, 0xe7, 0xe1, 0x2e, 0x08, 0x55, 0x10, 
-	0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, 
-	0x29, 0x00, 0xdb, 0x0f, 0x2a, 0x00, 0xdb, 0x0d, 
-	0x00, 0x9b, 0x4f, 0x07, 0x58, 0xff, 0x2f, 0x00, 
-	0xd0, 0x08, 0x23, 0x32, 0x5e, 0xfb, 0x42, 0x8b, 
-	0xdd, 0x04, 0x23, 0x34, 0x5e, 0xf9, 0x42, 0x91, 
-	0xdd, 0x00, 0x20, 0x01, 0xbc, 0x80, 0x47, 0x70, 
-	0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x9c, 0x06, 
-	0x9e, 0x05, 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x85, 
-	0x90, 0x00, 0x04, 0x08, 0x14, 0x00, 0x04, 0x17, 
-	0x14, 0x3f, 0x04, 0x1d, 0x14, 0x2d, 0x04, 0x31, 
-	0x14, 0x09, 0x91, 0x01, 0x04, 0x23, 0x0c, 0x1b, 
-	0x93, 0x02, 0xb0, 0x82, 0x99, 0x02, 0x00, 0x89, 
-	0x91, 0x06, 0x4a, 0x71, 0x92, 0x05, 0x58, 0x51, 
-	0x29, 0x00, 0xd1, 0x01, 0x20, 0xff, 0xe0, 0xd6, 
-	0x2d, 0x00, 0xda, 0x0e, 0x19, 0x40, 0x04, 0x00, 
-	0x14, 0x00, 0x42, 0x69, 0x04, 0x0d, 0x14, 0x2d, 
-	0x99, 0x03, 0x18, 0x79, 0x04, 0x0f, 0x14, 0x3f, 
-	0x99, 0x03, 0x42, 0x49, 0x04, 0x09, 0x14, 0x09, 
-	0x91, 0x03, 0x1c, 0x01, 0x1c, 0x04, 0x98, 0x02, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xb1, 0x28, 0x00, 
-	0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 
-	0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 
-	0xf0, 0x09, 0xff, 0x7a, 0x98, 0x03, 0x10, 0x40, 
-	0x90, 0x00, 0x10, 0x6e, 0x1c, 0x28, 0xb0, 0x82, 
-	0xf0, 0x0e, 0xfd, 0x58, 0xf0, 0x0e, 0xfd, 0x94, 
-	0x90, 0x00, 0x91, 0x01, 0x98, 0x05, 0xf0, 0x0e, 
-	0xfd, 0x51, 0xf0, 0x0e, 0xfd, 0x8d, 0x9a, 0x00, 
-	0x9b, 0x01, 0xb0, 0x02, 0xf0, 0x0e, 0xfd, 0x8c, 
-	0x28, 0x00, 0xd0, 0x4c, 0x98, 0x03, 0x28, 0x00, 
-	0xdd, 0x21, 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x6d, 
-	0x98, 0x00, 0x99, 0x03, 0x18, 0x40, 0x90, 0x00, 
-	0x34, 0x01, 0x42, 0xa8, 0xdb, 0x03, 0x98, 0x00, 
-	0x1b, 0x40, 0x90, 0x00, 0x37, 0x01, 0x98, 0x02, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x78, 
-	0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 
-	0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 
-	0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x41, 0x36, 0x01, 
-	0x42, 0xae, 0xdb, 0xe1, 0xe0, 0x76, 0x98, 0x03, 
-	0x42, 0x40, 0x04, 0x00, 0x14, 0x00, 0x90, 0x03, 
-	0x98, 0x00, 0x42, 0x46, 0x20, 0x00, 0x90, 0x01, 
-	0x2d, 0x00, 0xdd, 0x43, 0x98, 0x03, 0x18, 0x36, 
-	0x34, 0x01, 0x42, 0xae, 0xdb, 0x01, 0x1b, 0x76, 
-	0x3f, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 
-	0xf7, 0xff, 0xff, 0x52, 0x28, 0x00, 0xd0, 0x08, 
-	0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 
-	0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 
-	0xff, 0x1b, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 
-	0x42, 0xa8, 0xdb, 0xe3, 0xe0, 0x4e, 0x98, 0x03, 
-	0x28, 0x00, 0xdd, 0x24, 0x20, 0x00, 0x90, 0x01, 
-	0x98, 0x03, 0x28, 0x00, 0xdd, 0x1e, 0x19, 0x76, 
-	0x99, 0x03, 0x37, 0x01, 0x42, 0x8e, 0xdb, 0x02, 
-	0x98, 0x03, 0x1a, 0x36, 0x34, 0x01, 0x98, 0x02, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x2c, 
-	0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 
-	0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 
-	0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xf5, 0x98, 0x01, 
-	0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 
-	0xdb, 0xe1, 0xe0, 0x27, 0xe0, 0x26, 0x98, 0x03, 
-	0x42, 0x40, 0x04, 0x01, 0x14, 0x09, 0x91, 0x03, 
-	0x20, 0x00, 0x90, 0x01, 0x29, 0x00, 0xdd, 0x1d, 
-	0x19, 0x76, 0x99, 0x03, 0x3f, 0x01, 0x42, 0x8e, 
-	0xdb, 0x02, 0x99, 0x03, 0x1a, 0x76, 0x34, 0x01, 
-	0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0x03, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 
-	0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xcc, 
-	0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 
-	0x42, 0x88, 0xdb, 0xe1, 0x20, 0x00, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x23, 0x00, 
-	0x88, 0x01, 0x0a, 0x0a, 0x06, 0x12, 0x0e, 0x12, 
-	0x06, 0x09, 0x0e, 0x09, 0x2a, 0xdf, 0xd0, 0x1a, 
-	0xdc, 0x07, 0x2a, 0xc4, 0xd0, 0x19, 0x2a, 0xd6, 
-	0xd0, 0x1b, 0x2a, 0xdc, 0xd1, 0x08, 0x22, 0x1e, 
-	0xe0, 0x06, 0x2a, 0xe4, 0xd0, 0x13, 0x2a, 0xf6, 
-	0xd0, 0x15, 0x2a, 0xfc, 0xd1, 0x00, 0x22, 0x1f, 
-	0x29, 0xdf, 0xd0, 0x26, 0xdc, 0x11, 0x29, 0xc4, 
-	0xd0, 0x25, 0x29, 0xd6, 0xd0, 0x27, 0x29, 0xdc, 
-	0xd1, 0x12, 0x21, 0x1e, 0xe0, 0x10, 0x22, 0x19, 
-	0xe7, 0xf2, 0x22, 0x1a, 0xe7, 0xf0, 0x22, 0x1b, 
-	0xe7, 0xee, 0x22, 0x1c, 0xe7, 0xec, 0x22, 0x1d, 
-	0xe7, 0xea, 0x29, 0xe4, 0xd0, 0x15, 0x29, 0xf6, 
-	0xd0, 0x17, 0x29, 0xfc, 0xd1, 0x00, 0x21, 0x1f, 
-	0x02, 0x17, 0x18, 0x7f, 0x80, 0x07, 0x30, 0x02, 
-	0x2a, 0x00, 0xd0, 0x04, 0x29, 0x00, 0xd0, 0x02, 
-	0x33, 0x01, 0x2b, 0x70, 0xdb, 0xc0, 0xbc, 0x80, 
-	0x47, 0x70, 0x21, 0x19, 0xe7, 0xf0, 0x21, 0x1a, 
-	0xe7, 0xee, 0x21, 0x1b, 0xe7, 0xec, 0x21, 0x1c, 
-	0xe7, 0xea, 0x21, 0x1d, 0xe7, 0xe8, 0xb5, 0xf0, 
-	0x1c, 0x0f, 0x1c, 0x11, 0x04, 0x02, 0x0c, 0x12, 
-	0x04, 0x0c, 0x0c, 0x24, 0x04, 0x1d, 0x0c, 0x2d, 
-	0x00, 0x96, 0xb0, 0x81, 0x48, 0x10, 0x90, 0x00, 
-	0x59, 0x81, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x16, 
-	0x2a, 0x00, 0xd0, 0x14, 0x2a, 0x0f, 0xdc, 0x12, 
-	0x23, 0x32, 0x5e, 0xca, 0x42, 0xa2, 0xdb, 0x0e, 
-	0x23, 0x34, 0x5e, 0xc9, 0x42, 0xa9, 0xdb, 0x0a, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x93, 0x98, 0x00, 
-	0x59, 0x80, 0x1c, 0x39, 0x1c, 0x22, 0x1c, 0x2b, 
-	0xf7, 0xff, 0xfb, 0x5c, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0xb4, 0xb0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x14, 
-	0x14, 0x24, 0x04, 0x1a, 0x14, 0x12, 0x20, 0xff, 
-	0x2f, 0x0f, 0xdc, 0x1d, 0x00, 0xbd, 0x4f, 0x0f, 
-	0x59, 0x7b, 0x2b, 0x00, 0xd0, 0x18, 0x48, 0x0e, 
-	0x29, 0x01, 0xd0, 0x05, 0x29, 0x02, 0xd0, 0x01, 
-	0x29, 0x03, 0xd0, 0x03, 0x6c, 0x80, 0xe0, 0x02, 
-	0x6c, 0x40, 0xe0, 0x00, 0x6c, 0xc0, 0x62, 0x58, 
-	0x59, 0x78, 0x63, 0xc4, 0x20, 0x00, 0x43, 0xc0, 
-	0x42, 0x82, 0xd1, 0x02, 0x59, 0x79, 0x63, 0x88, 
-	0xe0, 0x01, 0x59, 0x78, 0x63, 0x82, 0x20, 0x00, 
-	0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1c, 0x80, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0x00, 0x80, 
-	0x4a, 0x07, 0x58, 0x10, 0x28, 0x00, 0xd1, 0x02, 
-	0x20, 0xff, 0xbc, 0x08, 0x47, 0x18, 0x07, 0x89, 
-	0x0f, 0x89, 0x68, 0x80, 0xf0, 0x03, 0xfe, 0x76, 
-	0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x04, 0x09, 0x0c, 0x09, 
-	0x4b, 0x0a, 0x40, 0x18, 0x08, 0x4a, 0xd3, 0x01, 
-	0x23, 0x02, 0x43, 0x18, 0x08, 0x8a, 0xd3, 0x02, 
-	0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 0x08, 0xca, 
-	0xd3, 0x01, 0x23, 0x01, 0x43, 0x18, 0x09, 0x09, 
-	0xd3, 0x02, 0x23, 0x01, 0x04, 0x1b, 0x43, 0x18, 
-	0x47, 0x70, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xfc, 
-	0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x14, 
-	0x0c, 0x24, 0x1c, 0x1e, 0x1c, 0x0f, 0x28, 0x07, 
-	0xdc, 0x25, 0x28, 0x01, 0xdb, 0x23, 0x00, 0x85, 
-	0x48, 0x12, 0x59, 0x40, 0x28, 0x00, 0xd0, 0x1e, 
-	0x0e, 0x31, 0x02, 0x30, 0x0a, 0x00, 0xf7, 0xff, 
-	0xff, 0xd1, 0x1c, 0x06, 0x2f, 0x02, 0xd0, 0x0e, 
-	0x2f, 0x04, 0xd0, 0x0c, 0x2f, 0x10, 0xd0, 0x0a, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x0e, 
-	0x06, 0x22, 0x0e, 0x12, 0x1c, 0x31, 0x48, 0x08, 
-	0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 0x07, 0x22, 
-	0x0f, 0x12, 0x48, 0x06, 0x59, 0x40, 0x68, 0x00, 
-	0x1c, 0x31, 0xf0, 0x0b, 0xfa, 0xdb, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x10, 
-	0x0c, 0x00, 0x04, 0x1f, 0x0c, 0x3f, 0x22, 0x00, 
-	0xb0, 0x81, 0x92, 0x00, 0x2c, 0x07, 0xdc, 0x3a, 
-	0x2c, 0x01, 0xdb, 0x38, 0x00, 0xa4, 0x4a, 0x1e, 
-	0x59, 0x12, 0x2a, 0x00, 0xd0, 0x33, 0x29, 0x02, 
-	0xd0, 0x1b, 0x29, 0x04, 0xd0, 0x19, 0x29, 0x10, 
-	0xd0, 0x17, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 
-	0xd1, 0x29, 0x06, 0x02, 0x0e, 0x12, 0x46, 0x69, 
-	0x1c, 0x15, 0x4c, 0x16, 0x6c, 0x20, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfa, 0xdc, 0x98, 0x00, 0x02, 0x00, 
-	0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x82, 
-	0x90, 0x00, 0x1c, 0x01, 0x6c, 0x20, 0x1c, 0x2a, 
-	0xe0, 0x12, 0x07, 0x02, 0x0f, 0x12, 0x1c, 0x15, 
-	0x4e, 0x0d, 0x59, 0x30, 0x68, 0x00, 0x46, 0x69, 
-	0xf0, 0x0b, 0xfa, 0xc8, 0x98, 0x00, 0x02, 0x00, 
-	0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x6e, 
-	0x90, 0x00, 0x1c, 0x01, 0x59, 0x30, 0x1c, 0x2a, 
-	0x68, 0x00, 0xf0, 0x0b, 0xfa, 0x8b, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x55, 0x10, 0x2e, 0x08, 0x1c, 0x80, 
-	0x2e, 0x08, 0x55, 0x50, 0xb5, 0xf0, 0x4f, 0x28, 
-	0x25, 0x00, 0x24, 0xff, 0x69, 0x38, 0x28, 0x00, 
-	0xd1, 0x01, 0x60, 0xbd, 0xe0, 0x0c, 0x26, 0x05, 
-	0x68, 0xb9, 0x29, 0x07, 0xd2, 0xf9, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x08, 0x10, 0x1a, 0x21, 0x30, 0x38, 0x00, 
-	0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x01, 0x02, 0x80, 0xf7, 0xf6, 0xfa, 0x86, 
-	0x28, 0x00, 0xdb, 0x2d, 0x20, 0x02, 0xe0, 0x25, 
-	0x48, 0x18, 0xf7, 0xf6, 0xfa, 0xa1, 0x28, 0x00, 
-	0xdb, 0x26, 0x89, 0xb8, 0x28, 0x00, 0xdd, 0x15, 
-	0x20, 0x03, 0xe0, 0x1b, 0x89, 0xb8, 0xf7, 0xf6, 
-	0xfa, 0x75, 0x28, 0x00, 0xdb, 0x1c, 0x20, 0x04, 
-	0xe0, 0x14, 0xf7, 0xf6, 0xfa, 0x91, 0x28, 0x00, 
-	0xdb, 0x16, 0x69, 0x39, 0x18, 0x09, 0x61, 0x39, 
-	0x89, 0xb9, 0x1a, 0x08, 0x81, 0xb8, 0x89, 0xb8, 
-	0x28, 0x00, 0xdc, 0xe9, 0x60, 0xbe, 0xe0, 0x0b, 
-	0x20, 0x00, 0xf7, 0xf6, 0xfa, 0x5f, 0x28, 0x00, 
-	0xd1, 0x06, 0x20, 0x06, 0x60, 0xb8, 0xe0, 0x03, 
-	0xf7, 0xf6, 0xfa, 0x7a, 0x28, 0x00, 0xda, 0xb8, 
-	0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, 
-	0xa8, 0x01, 0x49, 0x2e, 0xc9, 0x8e, 0xc0, 0x8e, 
-	0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, 
-	0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x3f, 
-	0x21, 0x08, 0xe0, 0x04, 0x21, 0x01, 0xe0, 0x02, 
-	0x21, 0x02, 0xe0, 0x00, 0x21, 0x04, 0x91, 0x00, 
-	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x33, 
-	0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x2f, 
-	0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, 
-	0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xb8, 
-	0x4f, 0x1d, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, 
-	0x04, 0x1b, 0x42, 0x98, 0xdc, 0x20, 0x1f, 0xf8, 
-	0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00, 
-	0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x42, 
-	0x68, 0x38, 0xf7, 0xfe, 0xfe, 0x90, 0xb0, 0x01, 
-	0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07, 
-	0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00, 
-	0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0x62, 
-	0xb0, 0x04, 0x60, 0x38, 0x1c, 0x01, 0xd1, 0x03, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x69, 0x88, 0x99, 0x00, 0x43, 0x4d, 0x1d, 0xe9, 
-	0xd5, 0x00, 0x31, 0x07, 0x10, 0xc9, 0x43, 0x71, 
-	0x61, 0x38, 0x60, 0x79, 0x81, 0xb9, 0x20, 0x01, 
-	0x60, 0xb8, 0xe7, 0xed, 0x2e, 0x03, 0x39, 0x50, 
-	0x2e, 0x08, 0x1d, 0x00, 0xb5, 0xf0, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x87, 
-	0x91, 0x00, 0x04, 0x11, 0x0c, 0x09, 0x91, 0x01, 
-	0x04, 0x19, 0x0c, 0x09, 0x91, 0x02, 0xb0, 0x85, 
-	0x28, 0x07, 0xdc, 0x43, 0x28, 0x01, 0xdb, 0x41, 
-	0x00, 0x85, 0x48, 0x3e, 0x90, 0x0b, 0x59, 0x41, 
-	0x29, 0x00, 0xd0, 0x3b, 0x48, 0x3c, 0x90, 0x0a, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x36, 0x23, 0x2c, 
-	0x5e, 0xca, 0x2a, 0x0b, 0xd2, 0x32, 0xa3, 0x02, 
-	0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
-	0x06, 0x06, 0x06, 0x00, 0x22, 0x00, 0x92, 0x00, 
-	0x92, 0x01, 0x23, 0x32, 0x5e, 0xc3, 0x93, 0x02, 
-	0x23, 0x34, 0x5e, 0xc0, 0x90, 0x03, 0x92, 0x04, 
-	0x98, 0x07, 0x08, 0x80, 0xd3, 0x40, 0x23, 0x2c, 
-	0x5e, 0xc8, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 
-	0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 
-	0xd1, 0x10, 0x27, 0xff, 0x37, 0x01, 0xe0, 0x04, 
-	0x27, 0x02, 0xe0, 0x02, 0x27, 0x04, 0xe0, 0x00, 
-	0x27, 0x10, 0x4e, 0x24, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x9f, 0xd1, 0x16, 0x24, 0x00, 0x48, 0x22, 
-	0x90, 0x09, 0xe0, 0x03, 0xb0, 0x0c, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x58, 0x31, 
-	0x29, 0x00, 0xd0, 0x06, 0x06, 0x22, 0x0e, 0x12, 
-	0x98, 0x09, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x5d, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, 
-	0xe0, 0x12, 0x24, 0x00, 0x2f, 0x00, 0xdd, 0x0f, 
-	0x48, 0x16, 0x90, 0x08, 0x00, 0xa0, 0x58, 0x31, 
-	0x29, 0x00, 0xd0, 0x06, 0x07, 0x22, 0x0f, 0x12, 
-	0x98, 0x08, 0x59, 0x40, 0x68, 0x00, 0xf0, 0x0b, 
-	0xf9, 0x49, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, 
-	0x98, 0x07, 0x08, 0x40, 0xd3, 0x01, 0x22, 0xff, 
-	0xe0, 0x00, 0x22, 0x00, 0x99, 0x06, 0xb4, 0x06, 
-	0x98, 0x0d, 0x59, 0x40, 0x68, 0x81, 0x98, 0x0c, 
-	0x68, 0x00, 0x68, 0x80, 0x9b, 0x07, 0xaa, 0x02, 
-	0xf0, 0x09, 0xff, 0x12, 0xb0, 0x0e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, 
-	0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, 
-	0xb5, 0x80, 0x4f, 0x0a, 0x68, 0x38, 0x28, 0x00, 
-	0xd0, 0x0c, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfc, 0x72, 
-	0x68, 0x38, 0xf7, 0xfe, 0xfd, 0xc0, 0x20, 0x00, 
-	0x60, 0x38, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1d, 0x00, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, 
-	0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, 
-	0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, 
-	0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00, 
-	0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c, 
-	0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04, 
-	0x30, 0x0c, 0x90, 0x04, 0xf0, 0x11, 0xff, 0xf0, 
-	0x90, 0x01, 0xf0, 0x11, 0xff, 0xd3, 0x90, 0x00, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88, 
-	0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08, 
-	0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00, 
-	0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05, 
-	0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03, 
-	0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60, 
-	0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73, 
-	0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, 
-	0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06, 
-	0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 
-	0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02, 
-	0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08, 
-	0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a, 
-	0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55, 
-	0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41, 
-	0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01, 
-	0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 
-	0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67, 
-	0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02, 
-	0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02, 
-	0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, 
-	0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 
-	0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43, 
-	0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41, 
-	0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01, 
-	0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 
-	0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43, 
-	0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b, 
-	0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20, 
-	0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01, 
-	0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38, 
-	0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 
-	0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20, 
-	0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 
-	0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff, 
-	0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05, 
-	0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80, 
-	0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b, 
-	0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11, 
-	0xff, 0x4f, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, 
-	0xf0, 0x11, 0xff, 0x2e, 0x20, 0x00, 0x6e, 0x80, 
-	0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06, 
-	0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00, 
-	0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x08, 0x59, 0xb0, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x3a, 0xf4, 0x2e, 0x08, 0x1d, 0x14, 
-	0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7, 
-	0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06, 
-	0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04, 
-	0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27, 
-	0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0x39, 0x60, 
-	0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83, 
-	0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00, 
-	0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06, 
-	0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84, 
-	0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21, 
-	0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00, 
-	0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01, 
-	0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05, 
-	0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01, 
-	0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 
-	0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01, 
-	0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01, 
-	0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50, 
-	0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09, 
-	0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05, 
-	0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00, 
-	0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05, 
-	0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02, 
-	0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00, 
-	0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 
-	0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05, 
-	0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00, 
-	0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, 
-	0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad, 
-	0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06, 
-	0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00, 
-	0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05, 
-	0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01, 
-	0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37, 
-	0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x11, 
-	0xfe, 0x2d, 0x90, 0x03, 0xf0, 0x11, 0xfe, 0x44, 
-	0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x11, 
-	0xfe, 0xa3, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, 
-	0x1c, 0x20, 0xf0, 0x11, 0xfe, 0xa1, 0x98, 0x02, 
-	0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x6c, 
-	0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
-	0xfe, 0x4b, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04, 
-	0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27, 
-	0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 
-	0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00, 
-	0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 
-	0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19, 
-	0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 
-	0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19, 
-	0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00, 
-	0x90, 0x07, 0xf0, 0x11, 0xfd, 0xe7, 0x90, 0x03, 
-	0xf0, 0x11, 0xfd, 0xfe, 0x90, 0x02, 0xf0, 0x11, 
-	0xfe, 0x5f, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, 
-	0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0x5c, 
-	0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 
-	0xfe, 0x27, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 
-	0xf0, 0x11, 0xfe, 0x06, 0x1c, 0x38, 0xb0, 0x07, 
-	0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, 
-	0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xb0, 
-	0x2e, 0x08, 0x5d, 0xb4, 0x68, 0x00, 0x00, 0x38, 
-	0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00, 
-	0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04, 
-	0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa, 
-	0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00, 
-	0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01, 
-	0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 
-	0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6, 
-	0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04, 
-	0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, 
-	0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f, 
-	0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20, 
-	0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa, 
-	0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12, 
-	0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28, 
-	0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00, 
-	0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80, 
-	0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24, 
-	0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1, 
-	0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12, 
-	0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19, 
-	0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19, 
-	0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17, 
-	0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15, 
-	0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13, 
-	0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e, 
-	0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0, 
-	0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x5d, 0xbc, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xd4, 
-	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x5e, 0x0c, 
-	0x2e, 0x08, 0x5e, 0x10, 0x6a, 0x00, 0x00, 0x10, 
-	0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04, 
-	0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00, 
-	0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00, 
-	0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1, 
-	0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0, 
-	0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00, 
-	0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28, 
-	0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38, 
-	0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17, 
-	0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49, 
-	0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 
-	0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03, 
-	0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08, 
-	0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73, 
-	0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b, 
-	0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6, 
-	0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28, 
-	0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80, 
-	0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30, 
-	0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04, 
-	0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 
-	0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18, 
-	0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40, 
-	0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97, 
-	0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38, 
-	0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 
-	0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c, 
-	0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01, 
-	0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b, 
-	0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87, 
-	0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44, 
-	0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48, 
-	0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83, 
-	0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09, 
-	0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02, 
-	0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00, 
-	0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12, 
-	0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0, 
-	0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18, 
-	0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00, 
-	0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b, 
-	0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12, 
-	0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04, 
-	0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a, 
-	0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03, 
-	0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56, 
-	0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03, 
-	0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00, 
-	0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80, 
-	0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18, 
-	0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04, 
-	0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03, 
-	0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00, 
-	0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03, 
-	0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67, 
-	0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60, 
-	0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0, 
-	0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0, 
-	0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 
-	0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 
-	0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 
-	0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10, 
-	0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05, 
-	0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a, 
-	0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff, 
-	0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03, 
-	0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e, 
-	0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08, 
-	0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30, 
-	0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03, 
-	0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16, 
-	0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04, 
-	0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f, 
-	0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, 
-	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, 
-	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5d, 0xd8, 
-	0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0x01, 
-	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xfc, 
-	0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44, 
-	0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00, 
-	0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09, 
-	0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02, 
-	0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c, 
-	0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f, 
-	0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18, 
-	0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8, 
-	0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8, 
-	0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27, 
-	0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15, 
-	0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43, 
-	0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03, 
-	0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d, 
-	0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d, 
-	0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5, 
-	0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3, 
-	0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06, 
-	0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36, 
-	0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb, 
-	0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, 
-	0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11, 
-	0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14, 
-	0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06, 
-	0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b, 
-	0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00, 
-	0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01, 
-	0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01, 
-	0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01, 
-	0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 
-	0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25, 
-	0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23, 
-	0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24, 
-	0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f, 
-	0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a, 
-	0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d, 
-	0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01, 
-	0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b, 
-	0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02, 
-	0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d, 
-	0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36, 
-	0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8, 
-	0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8, 
-	0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08, 
-	0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8, 
-	0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8, 
-	0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00, 
-	0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00, 
-	0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1, 
-	0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xf3, 0x98, 0x00, 
-	0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 
-	0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d, 
-	0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b, 
-	0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b, 
-	0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19, 
-	0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19, 
-	0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 
-	0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19, 
-	0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b, 
-	0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17, 
-	0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 
-	0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00, 
-	0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8, 
-	0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08, 
-	0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x11, 0xf9, 0xe5, 0x20, 0x00, 
-	0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5d, 0xc0, 
-	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
-	0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00, 
-	0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09, 
-	0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20, 
-	0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30, 
-	0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07, 
-	0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36, 
-	0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xec, 
-	0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, 
-	0x2e, 0x08, 0x5d, 0xf8, 0x1c, 0x01, 0x06, 0x08, 
-	0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01, 
-	0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03, 
-	0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x34, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, 
-	0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55, 
-	0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09, 
-	0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18, 
-	0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05, 
-	0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c, 
-	0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01, 
-	0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11, 
-	0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c, 
-	0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, 
-	0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c, 
-	0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43, 
-	0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f, 
-	0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01, 
-	0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e, 
-	0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00, 
-	0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00, 
-	0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00, 
-	0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01, 
-	0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02, 
-	0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9, 
-	0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29, 
-	0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1, 
-	0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, 
-	0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00, 
-	0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4, 
-	0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1, 
-	0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0, 
-	0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80, 
-	0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0, 
-	0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33, 
-	0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 
-	0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, 
-	0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, 
-	0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12, 
-	0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08, 
-	0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8, 
-	0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01, 
-	0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0x80, 0x0f, 
-	0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, 
-	0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x66, 0x00, 0x00, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0, 
-	0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00, 
-	0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00, 
-	0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8, 
-	0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, 
-	0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb, 
-	0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00, 
-	0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0, 
-	0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02, 
-	0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1, 
-	0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21, 
-	0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9, 
-	0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, 
-	0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00, 
-	0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4, 
-	0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1, 
-	0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0, 
-	0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00, 
-	0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11, 
-	0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12, 
-	0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8, 
-	0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30, 
-	0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3, 
-	0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x5d, 0xcc, 
-	0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 
-	0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, 
-	0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04, 
-	0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2, 
-	0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x11, 
-	0xf8, 0x89, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xb5, 0x98, 0x00, 
-	0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, 
-	0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x11, 
-	0xf8, 0x75, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xa1, 0x20, 0x00, 
-	0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x5e, 0x1c, 
-	0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 
-	0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03, 
-	0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80, 
-	0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f, 
-	0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02, 
-	0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00, 
-	0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17, 
-	0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00, 
-	0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x11, 0xf8, 0x3a, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x65, 0xe0, 0x13, 
-	0xf0, 0x11, 0xf8, 0x2c, 0x1c, 0x05, 0x1c, 0x21, 
-	0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, 
-	0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
-	0xf8, 0x57, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02, 
-	0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00, 
-	0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05, 
-	0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80, 
-	0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c, 
-	0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20, 
-	0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00, 
-	0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, 
-	0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04, 
-	0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, 
-	0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04, 
-	0xf0, 0x10, 0xff, 0xd4, 0x1c, 0x06, 0x1c, 0x22, 
-	0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, 
-	0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x00, 
-	0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20, 
-	0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00, 
-	0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d, 
-	0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01, 
-	0x04, 0x64, 0x0c, 0x64, 0xf0, 0x10, 0xff, 0xae, 
-	0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, 
-	0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, 
-	0xf0, 0x10, 0xff, 0xda, 0xe7, 0xde, 0x20, 0x00, 
-	0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, 
-	0x2e, 0x08, 0x5e, 0x10, 0x00, 0x00, 0xbf, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, 
-	0x20, 0x00, 0xf0, 0x19, 0xfe, 0x73, 0x60, 0x38, 
-	0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, 
-	0xf0, 0x19, 0xfe, 0x6c, 0x60, 0x78, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x10, 
-	0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, 
-	0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 
-	0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 
-	0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, 
-	0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x6e, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x99, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x56, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x81, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x14, 
-	0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, 
-	0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 
-	0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 
-	0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, 
-	0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x2e, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x59, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x16, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x10, 0xff, 0x41, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x18, 
-	0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, 
-	0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, 
-	0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00, 
-	0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40, 
-	0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, 
-	0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, 
-	0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09, 
-	0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68, 
-	0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12, 
-	0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39, 
-	0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04, 
-	0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04, 
-	0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09, 
-	0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04, 
-	0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 
-	0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, 
-	0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc8, 
-	0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02, 
-	0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28, 
-	0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04, 
-	0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4, 
-	0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
-	0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12, 
-	0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0, 
-	0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80, 
-	0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35, 
-	0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68, 
-	0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8, 
-	0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, 
-	0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8, 
-	0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00, 
-	0x2e, 0x08, 0x5d, 0xc8, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15, 
-	0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03, 
-	0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01, 
-	0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b, 
-	0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00, 
-	0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68, 
-	0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18, 
-	0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00, 
-	0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1, 
-	0x2e, 0x08, 0x5d, 0xd0, 0xff, 0xff, 0xdf, 0xe1, 
-	0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x2c, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83, 
-	0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b, 
-	0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78, 
-	0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80, 
-	0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10, 
-	0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03, 
-	0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8, 
-	0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02, 
-	0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08, 
-	0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8, 
-	0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01, 
-	0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5, 
-	0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b, 
-	0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19, 
-	0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0, 
-	0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01, 
-	0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92, 
-	0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74, 
-	0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43, 
-	0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83, 
-	0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23, 
-	0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, 
-	0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84, 
-	0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18, 
-	0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39, 
-	0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04, 
-	0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12, 
-	0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35, 
-	0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00, 
-	0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0, 
-	0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc, 
-	0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01, 
-	0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30, 
-	0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c, 
-	0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24, 
-	0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b, 
-	0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f, 
-	0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21, 
-	0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, 
-	0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae, 
-	0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b, 
-	0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a, 
-	0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c, 
-	0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d, 
-	0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd, 
-	0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00, 
-	0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00, 
-	0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43, 
-	0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01, 
-	0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06, 
-	0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee, 
-	0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00, 
-	0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0, 
-	0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03, 
-	0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01, 
-	0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40, 
-	0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8, 
-	0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0, 
-	0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x38, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, 
-	0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x19, 
-	0xfb, 0xfd, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x10, 
-	0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
-	0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09, 
-	0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d, 
-	0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9, 
-	0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01, 
-	0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35, 
-	0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x3c, 
-	0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70, 
-	0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d, 
-	0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d, 
-	0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08, 
-	0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85, 
-	0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, 
-	0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13, 
-	0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06, 
-	0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41, 
-	0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 
-	0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04, 
-	0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88, 
-	0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8, 
-	0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
-	0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 
-	0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05, 
-	0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x19, 
-	0xfb, 0x7d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01, 
-	0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05, 
-	0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd, 
-	0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae, 
-	0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24, 
-	0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09, 
-	0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 
-	0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff, 
-	0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 
-	0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8, 
-	0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac, 
-	0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00, 
-	0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c, 
-	0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05, 
-	0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01, 
-	0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, 
-	0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 
-	0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 
-	0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b, 
-	0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
-	0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7, 
-	0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38, 
-	0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01, 
-	0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09, 
-	0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38, 
-	0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00, 
-	0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84, 
-	0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00, 
-	0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 
-	0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, 
-	0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea, 
-	0x49, 0x80, 0x20, 0x91, 0xf0, 0x19, 0xfa, 0xa2, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c, 
-	0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08, 
-	0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37, 
-	0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03, 
-	0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 
-	0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8, 
-	0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38, 
-	0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, 
-	0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00, 
-	0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00, 
-	0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00, 
-	0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b, 
-	0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16, 
-	0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c, 
-	0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
-	0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00, 
-	0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8, 
-	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 
-	0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12, 
-	0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, 
-	0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 
-	0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05, 
-	0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, 
-	0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04, 
-	0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b, 
-	0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8, 
-	0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09, 
-	0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33, 
-	0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 
-	0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e, 
-	0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 
-	0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b, 
-	0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21, 
-	0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00, 
-	0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07, 
-	0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8, 
-	0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d, 
-	0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 
-	0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10, 
-	0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c, 
-	0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0xff, 0xff, 
-	0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38, 
-	0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07, 
-	0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00, 
-	0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40, 
-	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a, 
-	0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d, 
-	0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c, 
-	0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01, 
-	0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c, 
-	0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, 
-	0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60, 
-	0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60, 
-	0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, 
-	0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, 
-	0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 
-	0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61, 
-	0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 
-	0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19, 
-	0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79, 
-	0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36, 
-	0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21, 
-	0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00, 
-	0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46, 
-	0x49, 0x0f, 0x20, 0x91, 0xf0, 0x19, 0xf9, 0x1e, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, 
-	0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, 
-	0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
-	0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05, 
-	0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xff, 0x1c, 0x07, 
-	0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00, 
-	0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13, 
-	0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15, 
-	0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00, 
-	0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18, 
-	0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8, 
-	0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, 
-	0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, 
-	0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, 
-	0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2, 
-	0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 
-	0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40, 
-	0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0, 
-	0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20, 
-	0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0, 
-	0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60, 
-	0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20, 
-	0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48, 
-	0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0, 
-	0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01, 
-	0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 
-	0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13, 
-	0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1, 
-	0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8, 
-	0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49, 
-	0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08, 
-	0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20, 
-	0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, 
-	0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 
-	0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, 
-	0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 
-	0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00, 
-	0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13, 
-	0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01, 
-	0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60, 
-	0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00, 
-	0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60, 
-	0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, 
-	0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 
-	0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b, 
-	0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 
-	0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18, 
-	0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01, 
-	0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40, 
-	0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14, 
-	0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09, 
-	0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x19, 
-	0xf8, 0x21, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38, 
-	0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a, 
-	0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38, 
-	0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95, 
-	0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38, 
-	0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85, 
-	0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00, 
-	0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00, 
-	0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a, 
-	0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0, 
-	0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85, 
-	0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00, 
-	0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 
-	0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38, 
-	0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38, 
-	0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06, 
-	0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b, 
-	0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51, 
-	0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, 
-	0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03, 
-	0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06, 
-	0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b, 
-	0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01, 
-	0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, 
-	0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09, 
-	0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14, 
-	0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0, 
-	0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0, 
-	0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01, 
-	0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01, 
-	0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52, 
-	0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60, 
-	0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00, 
-	0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00, 
-	0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15, 
-	0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03, 
-	0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, 
-	0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, 
-	0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, 
-	0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41, 
-	0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f, 
-	0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00, 
-	0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05, 
-	0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15, 
-	0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0, 
-	0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4, 
-	0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 
-	0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b, 
-	0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c, 
-	0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d, 
-	0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, 
-	0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82, 
-	0x49, 0x1c, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x06, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25, 
-	0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff, 
-	0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff, 
-	0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x60, 0x84, 
-	0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0x94, 
-	0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x6a, 0xa0, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 
-	0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, 
-	0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f, 
-	0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1, 
-	0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77, 
-	0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21, 
-	0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00, 
-	0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91, 
-	0xf0, 0x18, 0xfe, 0x98, 0xe0, 0x00, 0xe0, 0x11, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00, 
-	0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08, 
-	0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 
-	0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0, 
-	0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 
-	0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 
-	0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
-	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0, 
-	0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20, 
-	0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 
-	0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05, 
-	0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01, 
-	0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50, 
-	0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00, 
-	0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, 
-	0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06, 
-	0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 
-	0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03, 
-	0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf7, 0xb0, 0x83, 
-	0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00, 
-	0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38, 
-	0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05, 
-	0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10, 
-	0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x18, 
-	0xfd, 0xb9, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8, 
-	0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00, 
-	0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38, 
-	0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12, 
-	0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03, 
-	0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08, 
-	0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01, 
-	0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b, 
-	0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e, 
-	0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00, 
-	0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, 
-	0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf, 
-	0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8, 
-	0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00, 
-	0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 
-	0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3, 
-	0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38, 
-	0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00, 
-	0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7, 
-	0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, 
-	0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1, 
-	0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, 
-	0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48, 
-	0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02, 
-	0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38, 
-	0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12, 
-	0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08, 
-	0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48, 
-	0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00, 
-	0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97, 
-	0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08, 
-	0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
-	0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0, 
-	0x49, 0x95, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xf2, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08, 
-	0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, 
-	0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89, 
-	0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 
-	0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, 
-	0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9, 
-	0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77, 
-	0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, 
-	0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23, 
-	0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00, 
-	0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00, 
-	0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91, 
-	0xf0, 0x18, 0xfc, 0x8c, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60, 
-	0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e, 
-	0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 
-	0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 
-	0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01, 
-	0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02, 
-	0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84, 
-	0x49, 0x4f, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0x66, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, 
-	0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40, 
-	0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00, 
-	0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09, 
-	0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08, 
-	0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 
-	0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13, 
-	0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 
-	0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 
-	0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6, 
-	0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18, 
-	0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 
-	0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7, 
-	0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41, 
-	0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc, 
-	0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6, 
-	0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01, 
-	0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d, 
-	0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b, 
-	0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b, 
-	0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, 
-	0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, 
-	0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0x94, 0xcc, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x3f, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x5e, 0x4c, 0x68, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x00, 0x00, 0x04, 0xcc, 
-	0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00, 
-	0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, 
-	0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06, 
-	0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4, 
-	0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76, 
-	0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c, 
-	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
-	0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a, 
-	0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00, 
-	0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00, 
-	0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91, 
-	0xf0, 0x18, 0xfb, 0x80, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, 
-	0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 
-	0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x7c, 0xc0, 
-	0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 
-	0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04, 
-	0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01, 
-	0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20, 
-	0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 
-	0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, 
-	0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, 
-	0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05, 
-	0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05, 
-	0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04, 
-	0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 
-	0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73, 
-	0x49, 0xbd, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0xfe, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 
-	0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9, 
-	0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03, 
-	0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2, 
-	0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0, 
-	0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01, 
-	0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9, 
-	0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f, 
-	0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d, 
-	0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
-	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08, 
-	0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02, 
-	0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0, 
-	0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11, 
-	0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 
-	0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0, 
-	0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 
-	0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 
-	0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe, 
-	0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00, 
-	0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00, 
-	0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1, 
-	0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, 
-	0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00, 
-	0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00, 
-	0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b, 
-	0x49, 0x71, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0x66, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 
-	0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d, 
-	0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 
-	0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12, 
-	0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60, 
-	0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a, 
-	0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00, 
-	0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55, 
-	0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, 
-	0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73, 
-	0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00, 
-	0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b, 
-	0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45, 
-	0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b, 
-	0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00, 
-	0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01, 
-	0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02, 
-	0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d, 
-	0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42, 
-	0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0, 
-	0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, 
-	0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10, 
-	0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03, 
-	0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03, 
-	0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03, 
-	0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11, 
-	0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03, 
-	0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01, 
-	0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 
-	0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 
-	0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, 
-	0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 
-	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00, 
-	0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 
-	0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00, 
-	0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1, 
-	0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d, 
-	0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08, 
-	0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0, 
-	0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05, 
-	0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x2e, 0x08, 0x7d, 0x94, 
-	0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d, 
-	0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, 
-	0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06, 
-	0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d, 
-	0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, 
-	0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06, 
-	0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05, 
-	0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02, 
-	0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69, 
-	0x20, 0x91, 0xf0, 0x18, 0xf9, 0x23, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a, 
-	0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08, 
-	0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06, 
-	0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 
-	0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a, 
-	0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05, 
-	0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92, 
-	0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 
-	0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 
-	0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
-	0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9, 
-	0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
-	0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9, 
-	0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01, 
-	0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00, 
-	0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 
-	0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23, 
-	0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70, 
-	0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04, 
-	0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04, 
-	0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32, 
-	0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03, 
-	0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03, 
-	0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40, 
-	0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f, 
-	0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70, 
-	0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04, 
-	0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, 
-	0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26, 
-	0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03, 
-	0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03, 
-	0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00, 
-	0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00, 
-	0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04, 
-	0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04, 
-	0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05, 
-	0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05, 
-	0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02, 
-	0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00, 
-	0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9, 
-	0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03, 
-	0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3, 
-	0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28, 
-	0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01, 
-	0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24, 
-	0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20, 
-	0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c, 
-	0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b, 
-	0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28, 
-	0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b, 
-	0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b, 
-	0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d, 
-	0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12, 
-	0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d, 
-	0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3, 
-	0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d, 
-	0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d, 
-	0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a, 
-	0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04, 
-	0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00, 
-	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc, 
-	0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca, 
-	0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00, 
-	0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14, 
-	0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05, 
-	0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93, 
-	0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85, 
-	0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05, 
-	0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93, 
-	0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e, 
-	0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85, 
-	0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d, 
-	0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x40, 
-	0x2e, 0x08, 0x7d, 0x94, 0xb5, 0xf3, 0xb0, 0x82, 
-	0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05, 
-	0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef, 
-	0x20, 0x91, 0xf0, 0x17, 0xff, 0x83, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08, 
-	0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, 
-	0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05, 
-	0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08, 
-	0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0, 
-	0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01, 
-	0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
-	0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 
-	0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 
-	0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83, 
-	0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce, 
-	0x20, 0x91, 0xf0, 0x17, 0xff, 0x3b, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb, 
-	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06, 
-	0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01, 
-	0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 
-	0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3, 
-	0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 
-	0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 
-	0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00, 
-	0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15, 
-	0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12, 
-	0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
-	0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01, 
-	0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00, 
-	0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8, 
-	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 
-	0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12, 
-	0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00, 
-	0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5, 
-	0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01, 
-	0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99, 
-	0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, 
-	0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a, 
-	0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48, 
-	0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a, 
-	0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, 
-	0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 
-	0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71, 
-	0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 
-	0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
-	0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40, 
-	0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 
-	0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 
-	0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, 
-	0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72, 
-	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, 
-	0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a, 
-	0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a, 
-	0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x17, 
-	0xfe, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c, 
-	0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02, 
-	0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46, 
-	0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00, 
-	0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a, 
-	0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x17, 
-	0xfe, 0x11, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01, 
-	0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00, 
-	0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31, 
-	0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f, 
-	0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09, 
-	0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, 
-	0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 
-	0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, 
-	0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 
-	0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03, 
-	0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26, 
-	0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 
-	0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00, 
-	0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11, 
-	0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xe7, 0xd5, 0x3f, 0x01, 
-	0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01, 
-	0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01, 
-	0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48, 
-	0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06, 
-	0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44, 
-	0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42, 
-	0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a, 
-	0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09, 
-	0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, 
-	0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, 
-	0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, 
-	0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33, 
-	0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02, 
-	0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02, 
-	0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02, 
-	0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00, 
-	0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6, 
-	0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00, 
-	0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 
-	0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
-	0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a, 
-	0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 
-	0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00, 
-	0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00, 
-	0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91, 
-	0xf0, 0x17, 0xfd, 0x18, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04, 
-	0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 
-	0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92, 
-	0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 
-	0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0x04, 0xcc, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf3, 0x1c, 0x07, 
-	0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04, 
-	0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 
-	0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 
-	0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x17, 
-	0xfc, 0xd1, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0, 
-	0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04, 
-	0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff, 
-	0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
-	0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05, 
-	0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08, 
-	0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, 
-	0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89, 
-	0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60, 
-	0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x7a, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6, 
-	0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08, 
-	0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, 
-	0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, 
-	0xfc, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 
-	0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60, 
-	0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 
-	0xf0, 0x17, 0xfc, 0x24, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, 
-	0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 
-	0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
-	0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, 
-	0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, 
-	0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09, 
-	0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60, 
-	0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0xce, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 
-	0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30, 
-	0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, 
-	0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
-	0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
-	0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, 
-	0xfb, 0x91, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 
-	0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60, 
-	0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 
-	0xf0, 0x17, 0xfb, 0x78, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, 
-	0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 
-	0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
-	0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, 
-	0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00, 
-	0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01, 
-	0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0, 
-	0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1, 
-	0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80, 
-	0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde, 
-	0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x16, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
-	0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 
-	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
-	0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, 
-	0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e, 
-	0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28, 
-	0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 
-	0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 
-	0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
-	0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20, 
-	0x20, 0x91, 0xf0, 0x17, 0xfa, 0xd7, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57, 
-	0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08, 
-	0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, 
-	0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xbe, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 
-	0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02, 
-	0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28, 
-	0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 
-	0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02, 
-	0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, 
-	0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, 
-	0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48, 
-	0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49, 
-	0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c, 
-	0x20, 0x91, 0xf0, 0x17, 0xfa, 0x57, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 
-	0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34, 
-	0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb, 
-	0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
-	0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28, 
-	0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e, 
-	0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 
-	0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30, 
-	0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05, 
-	0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91, 
-	0xf0, 0x17, 0xfa, 0x18, 0x28, 0x92, 0xd0, 0x00, 
-	0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92, 
-	0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 
-	0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 
-	0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00, 
-	0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 
-	0x20, 0x91, 0xf0, 0x17, 0xf9, 0xff, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 
-	0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 
-	0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 
-	0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b, 
-	0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0x1c, 0x01, 0x20, 0x0d, 
-	0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0, 
-	0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01, 
-	0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b, 
-	0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08, 
-	0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90, 
-	0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0, 
-	0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08, 
-	0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48, 
-	0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4, 
-	0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18, 
-	0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58, 
-	0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80, 
-	0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
-	0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00, 
-	0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, 
-	0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78, 
-	0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00, 
-	0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 
-	0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13, 
-	0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58, 
-	0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40, 
-	0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10, 
-	0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d, 
-	0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40, 
-	0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00, 
-	0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 
-	0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00, 
-	0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01, 
-	0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02, 
-	0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90, 
-	0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08, 
-	0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b, 
-	0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02, 
-	0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c, 
-	0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 
-	0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03, 
-	0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00, 
-	0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02, 
-	0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20, 
-	0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12, 
-	0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5, 
-	0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66, 
-	0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 
-	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 
-	0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 
-	0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91, 
-	0xf0, 0x17, 0xf8, 0xdc, 0x28, 0x92, 0xd0, 0x03, 
-	0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5, 
-	0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02, 
-	0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e, 
-	0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca, 
-	0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06, 
-	0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00, 
-	0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 
-	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
-	0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20, 
-	0x20, 0x91, 0xf0, 0x17, 0xf8, 0xa7, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27, 
-	0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 
-	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8, 
-	0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08, 
-	0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0x8e, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 
-	0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01, 
-	0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x7d, 0xb8, 0xb4, 0x80, 0x1c, 0x01, 
-	0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19, 
-	0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa, 
-	0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80, 
-	0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04, 
-	0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80, 
-	0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, 
-	0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20, 
-	0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8, 
-	0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b, 
-	0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98, 
-	0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01, 
-	0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19, 
-	0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23, 
-	0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01, 
-	0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, 
-	0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14, 
-	0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10, 
-	0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c, 
-	0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b, 
-	0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff, 
-	0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x50, 
-	0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, 
-	0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40, 
-	0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18, 
-	0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01, 
-	0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b, 
-	0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40, 
-	0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64, 
-	0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b, 
-	0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b, 
-	0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03, 
-	0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b, 
-	0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26, 
-	0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33, 
-	0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01, 
-	0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00, 
-	0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 
-	0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 
-	0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64, 
-	0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b, 
-	0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb, 
-	0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18, 
-	0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02, 
-	0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91, 
-	0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b, 
-	0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b, 
-	0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 
-	0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20, 
-	0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b, 
-	0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18, 
-	0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc, 
-	0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e, 
-	0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, 
-	0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 
-	0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33, 
-	0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01, 
-	0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a, 
-	0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, 
-	0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, 
-	0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64, 
-	0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01, 
-	0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb, 
-	0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 
-	0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07, 
-	0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01, 
-	0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18, 
-	0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01, 
-	0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01, 
-	0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01, 
-	0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18, 
-	0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30, 
-	0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04, 
-	0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40, 
-	0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02, 
-	0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f, 
-	0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 
-	0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 
-	0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01, 
-	0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43, 
-	0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17, 
-	0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01, 
-	0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e, 
-	0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 
-	0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4, 
-	0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b, 
-	0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff, 
-	0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02, 
-	0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, 
-	0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, 
-	0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01, 
-	0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 
-	0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23, 
-	0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19, 
-	0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17, 
-	0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, 
-	0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b, 
-	0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f, 
-	0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, 
-	0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 
-	0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff, 
-	0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b, 
-	0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, 
-	0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, 
-	0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 
-	0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 
-	0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00, 
-	0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 
-	0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
-	0x2e, 0x08, 0x7c, 0x1c, 0x2e, 0x08, 0x5e, 0x50, 
-	0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60, 
-	0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, 
-	0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, 
-	0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, 
-	0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04, 
-	0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac, 
-	0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41, 
-	0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64, 
-	0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28, 
-	0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, 
-	0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03, 
-	0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01, 
-	0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82, 
-	0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00, 
-	0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01, 
-	0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f, 
-	0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5, 
-	0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47, 
-	0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00, 
-	0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01, 
-	0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff, 
-	0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa, 
-	0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9, 
-	0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02, 
-	0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12, 
-	0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11, 
-	0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a, 
-	0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09, 
-	0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11, 
-	0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a, 
-	0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03, 
-	0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07, 
-	0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12, 
-	0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05, 
-	0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12, 
-	0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01, 
-	0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00, 
-	0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80, 
-	0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33, 
-	0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 
-	0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40, 
-	0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, 
-	0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08, 
-	0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, 
-	0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84, 
-	0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00, 
-	0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06, 
-	0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03, 
-	0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02, 
-	0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40, 
-	0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00, 
-	0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65, 
-	0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00, 
-	0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0, 
-	0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01, 
-	0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01, 
-	0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04, 
-	0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30, 
-	0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06, 
-	0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06, 
-	0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02, 
-	0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08, 
-	0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70, 
-	0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40, 
-	0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02, 
-	0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a, 
-	0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04, 
-	0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30, 
-	0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 
-	0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a, 
-	0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00, 
-	0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01, 
-	0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80, 
-	0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf, 
-	0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01, 
-	0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3, 
-	0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b, 
-	0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00, 
-	0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80, 
-	0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01, 
-	0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb, 
-	0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, 
-	0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01, 
-	0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb, 
-	0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89, 
-	0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10, 
-	0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02, 
-	0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30, 
-	0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00, 
-	0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08, 
-	0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e, 
-	0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26, 
-	0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20, 
-	0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b, 
-	0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80, 
-	0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b, 
-	0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb, 
-	0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31, 
-	0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20, 
-	0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00, 
-	0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19, 
-	0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28, 
-	0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27, 
-	0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15, 
-	0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c, 
-	0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20, 
-	0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00, 
-	0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19, 
-	0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c, 
-	0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b, 
-	0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00, 
-	0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e, 
-	0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07, 
-	0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b, 
-	0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02, 
-	0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00, 
-	0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b, 
-	0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x82, 0x18, 
-	0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18, 
-	0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, 
-	0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x5e, 0x50, 
-	0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c, 
-	0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca, 
-	0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29, 
-	0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, 
-	0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49, 
-	0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33, 
-	0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01, 
-	0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01, 
-	0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18, 
-	0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33, 
-	0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d, 
-	0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18, 
-	0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07, 
-	0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 
-	0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 
-	0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02, 
-	0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02, 
-	0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, 
-	0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05, 
-	0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 
-	0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x03, 0x39, 0xfc, 0x2e, 0x08, 0x7c, 0x1c, 
-	0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c, 
-	0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20, 
-	0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02, 
-	0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01, 
-	0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b, 
-	0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09, 
-	0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, 
-	0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00, 
-	0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1, 
-	0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25, 
-	0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23, 
-	0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03, 
-	0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59, 
-	0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59, 
-	0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33, 
-	0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09, 
-	0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b, 
-	0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, 
-	0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b, 
-	0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01, 
-	0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09, 
-	0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b, 
-	0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09, 
-	0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05, 
-	0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x54, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x58, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09, 
-	0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09, 
-	0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09, 
-	0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09, 
-	0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09, 
-	0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19, 
-	0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38, 
-	0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8, 
-	0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88, 
-	0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48, 
-	0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88, 
-	0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8, 
-	0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08, 
-	0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20, 
-	0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09, 
-	0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05, 
-	0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03, 
-	0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, 
-	0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, 
-	0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, 
-	0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04, 
-	0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05, 
-	0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19, 
-	0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89, 
-	0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00, 
-	0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09, 
-	0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98, 
-	0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81, 
-	0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, 
-	0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01, 
-	0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73, 
-	0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38, 
-	0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8, 
-	0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12, 
-	0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0, 
-	0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80, 
-	0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06, 
-	0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0, 
-	0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01, 
-	0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40, 
-	0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07, 
-	0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23, 
-	0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02, 
-	0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07, 
-	0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d, 
-	0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48, 
-	0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04, 
-	0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e, 
-	0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04, 
-	0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0, 
-	0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 
-	0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8, 
-	0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01, 
-	0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, 
-	0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00, 
-	0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4, 
-	0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, 
-	0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05, 
-	0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39, 
-	0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01, 
-	0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, 
-	0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05, 
-	0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39, 
-	0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03, 
-	0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d, 
-	0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88, 
-	0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02, 
-	0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01, 
-	0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00, 
-	0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22, 
-	0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02, 
-	0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00, 
-	0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12, 
-	0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02, 
-	0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff, 
-	0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 
-	0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88, 
-	0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02, 
-	0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08, 
-	0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x44, 
-	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xd0, 
-	0x2e, 0x08, 0x1f, 0x18, 0x66, 0x00, 0x00, 0x80, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 
-	0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01, 
-	0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40, 
-	0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09, 
-	0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33, 
-	0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc, 
-	0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01, 
-	0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, 
-	0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x18, 
-	0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0, 
-	0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16, 
-	0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1, 
-	0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05, 
-	0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d, 
-	0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01, 
-	0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81, 
-	0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04, 
-	0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00, 
-	0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04, 
-	0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x44, 0xcc, 0x00, 0x0f, 0x80, 
-	0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09, 
-	0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02, 
-	0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, 
-	0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8, 
-	0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00, 
-	0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00, 
-	0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, 
-	0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89, 
-	0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80, 
-	0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40, 
-	0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20, 
-	0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6, 
-	0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00, 
-	0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00, 
-	0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
-	0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, 
-	0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, 
-	0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8, 
-	0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68, 
-	0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e, 
-	0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3, 
-	0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84, 
-	0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02, 
-	0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01, 
-	0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, 
-	0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00, 
-	0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03, 
-	0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7, 
-	0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, 
-	0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1, 
-	0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, 
-	0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2, 
-	0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1, 
-	0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73, 
-	0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 
-	0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d, 
-	0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a, 
-	0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08, 
-	0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00, 
-	0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93, 
-	0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03, 
-	0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00, 
-	0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b, 
-	0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 
-	0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 
-	0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08, 
-	0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10, 
-	0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18, 
-	0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3, 
-	0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00, 
-	0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93, 
-	0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03, 
-	0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00, 
-	0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b, 
-	0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 
-	0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 
-	0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08, 
-	0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b, 
-	0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00, 
-	0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03, 
-	0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08, 
-	0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08, 
-	0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00, 
-	0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08, 
-	0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0, 
-	0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01, 
-	0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, 
-	0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04, 
-	0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01, 
-	0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30, 
-	0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b, 
-	0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f, 
-	0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, 
-	0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98, 
-	0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26, 
-	0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e, 
-	0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32, 
-	0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80, 
-	0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
-	0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a, 
-	0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0, 
-	0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0, 
-	0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff, 
-	0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01, 
-	0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03, 
-	0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03, 
-	0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c, 
-	0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18, 
-	0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2, 
-	0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, 
-	0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00, 
-	0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18, 
-	0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05, 
-	0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98, 
-	0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06, 
-	0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x7b, 0xf4, 0x64, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x9e, 0x00, 0x04, 0xb8, 
-	0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, 
-	0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65, 
-	0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, 
-	0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90, 
-	0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b, 
-	0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80, 
-	0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56, 
-	0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00, 
-	0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51, 
-	0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43, 
-	0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50, 
-	0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18, 
-	0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27, 
-	0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04, 
-	0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04, 
-	0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
-	0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0, 
-	0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06, 
-	0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 
-	0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36, 
-	0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f, 
-	0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33, 
-	0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02, 
-	0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, 
-	0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02, 
-	0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, 
-	0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88, 
-	0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27, 
-	0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 
-	0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24, 
-	0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00, 
-	0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02, 
-	0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8, 
-	0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80, 
-	0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00, 
-	0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a, 
-	0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01, 
-	0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02, 
-	0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d, 
-	0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19, 
-	0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4, 
-	0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06, 
-	0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x7b, 0xf4, 
-	0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x9e, 0x00, 0x04, 0xb8, 
-	0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, 
-	0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, 
-	0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09, 
-	0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01, 
-	0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01, 
-	0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04, 
-	0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a, 
-	0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07, 
-	0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04, 
-	0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03, 
-	0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0, 
-	0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00, 
-	0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20, 
-	0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00, 
-	0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08, 
-	0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf, 
-	0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d, 
-	0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a, 
-	0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a, 
-	0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17, 
-	0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20, 
-	0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01, 
-	0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00, 
-	0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03, 
-	0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
-	0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80, 
-	0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78, 
-	0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07, 
-	0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01, 
-	0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02, 
-	0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, 
-	0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, 
-	0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00, 
-	0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00, 
-	0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69, 
-	0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06, 
-	0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65, 
-	0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17, 
-	0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63, 
-	0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07, 
-	0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0, 
-	0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41, 
-	0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88, 
-	0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07, 
-	0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03, 
-	0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08, 
-	0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08, 
-	0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00, 
-	0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07, 
-	0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9, 
-	0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07, 
-	0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07, 
-	0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83, 
-	0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02, 
-	0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80, 
-	0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02, 
-	0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39, 
-	0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37, 
-	0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36, 
-	0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03, 
-	0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4, 
-	0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, 
-	0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, 
-	0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b, 
-	0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29, 
-	0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28, 
-	0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, 
-	0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00, 
-	0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23, 
-	0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05, 
-	0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d, 
-	0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46, 
-	0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0, 
-	0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08, 
-	0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36, 
-	0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63, 
-	0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01, 
-	0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07, 
-	0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 
-	0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f, 
-	0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x80, 
-	0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0x69, 0x90, 
-	0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80, 
-	0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f, 
-	0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8, 
-	0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01, 
-	0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90, 
-	0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10, 
-	0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f, 
-	0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0xb0, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00, 
-	0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01, 
-	0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b, 
-	0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00, 
-	0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 
-	0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93, 
-	0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12, 
-	0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12, 
-	0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, 
-	0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e, 
-	0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00, 
-	0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09, 
-	0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00, 
-	0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a, 
-	0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00, 
-	0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 
-	0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55, 
-	0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07, 
-	0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20, 
-	0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5, 
-	0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07, 
-	0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73, 
-	0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08, 
-	0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01, 
-	0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98, 
-	0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02, 
-	0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec, 
-	0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00, 
-	0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, 
-	0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13, 
-	0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13, 
-	0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58, 
-	0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30, 
-	0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d, 
-	0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03, 
-	0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5, 
-	0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec, 
-	0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03, 
-	0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a, 
-	0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01, 
-	0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00, 
-	0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13, 
-	0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40, 
-	0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88, 
-	0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98, 
-	0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01, 
-	0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, 
-	0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71, 
-	0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00, 
-	0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01, 
-	0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00, 
-	0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, 
-	0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc, 
-	0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04, 
-	0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5, 
-	0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00, 
-	0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, 
-	0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04, 
-	0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 
-	0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4, 
-	0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee, 
-	0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40, 
-	0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03, 
-	0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47, 
-	0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9, 
-	0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd, 
-	0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, 
-	0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7, 
-	0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00, 
-	0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18, 
-	0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40, 
-	0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02, 
-	0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e, 
-	0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00, 
-	0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d, 
-	0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02, 
-	0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a, 
-	0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe, 
-	0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01, 
-	0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, 
-	0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49, 
-	0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00, 
-	0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01, 
-	0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8, 
-	0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0, 
-	0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01, 
-	0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8, 
-	0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, 
-	0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09, 
-	0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00, 
-	0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88, 
-	0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00, 
-	0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, 
-	0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04, 
-	0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, 
-	0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d, 
-	0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46, 
-	0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 
-	0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00, 
-	0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7, 
-	0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00, 
-	0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20, 
-	0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a, 
-	0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0, 
-	0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88, 
-	0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18, 
-	0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 
-	0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32, 
-	0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38, 
-	0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff, 
-	0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, 
-	0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 
-	0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18, 
-	0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38, 
-	0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11, 
-	0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00, 
-	0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01, 
-	0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b, 
-	0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff, 
-	0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03, 
-	0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a, 
-	0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, 
-	0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17, 
-	0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00, 
-	0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02, 
-	0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00, 
-	0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00, 
-	0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00, 
-	0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, 
-	0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5e, 0xe0, 
-	0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80, 
-	0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20, 
-	0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, 
-	0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7, 
-	0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12, 
-	0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 
-	0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41, 
-	0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01, 
-	0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b, 
-	0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3, 
-	0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36, 
-	0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d, 
-	0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f, 
-	0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b, 
-	0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00, 
-	0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03, 
-	0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01, 
-	0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b, 
-	0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 
-	0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb, 
-	0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08, 
-	0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 
-	0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f, 
-	0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b, 
-	0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00, 
-	0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b, 
-	0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c, 
-	0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09, 
-	0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18, 
-	0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c, 
-	0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd, 
-	0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0, 
-	0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b, 
-	0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb, 
-	0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01, 
-	0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83, 
-	0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, 
-	0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00, 
-	0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3, 
-	0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x90, 
-	0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x69, 0x90, 
-	0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00, 
-	0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58, 
-	0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90, 
-	0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, 
-	0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18, 
-	0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00, 
-	0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 
-	0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10, 
-	0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1, 
-	0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09, 
-	0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e, 
-	0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06, 
-	0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0c, 
-	0xf9, 0xb5, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, 
-	0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, 
-	0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x01, 0x09, 0x15, 0x1c, 0x01, 0x48, 0x0e, 
-	0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c, 
-	0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a, 
-	0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08, 
-	0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06, 
-	0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40, 
-	0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0x1c, 0x48, 0x03, 0x6e, 0x80, 
-	0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, 
-	0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37, 
-	0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70, 
-	0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31, 
-	0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30, 
-	0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88, 
-	0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b, 
-	0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, 
-	0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, 
-	0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23, 
-	0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01, 
-	0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40, 
-	0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d, 
-	0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89, 
-	0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18, 
-	0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 
-	0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40, 
-	0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08, 
-	0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03, 
-	0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99, 
-	0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, 
-	0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x01, 
-	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, 
-	0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18, 
-	0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, 
-	0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00, 
-	0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8, 
-	0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5, 
-	0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd, 
-	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
-	0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9, 
-	0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a, 
-	0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 
-	0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04, 
-	0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd, 
-	0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x0c, 0xf8, 0x96, 0x48, 0xc9, 0x68, 0x00, 
-	0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7, 
-	0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73, 
-	0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, 
-	0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98, 
-	0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66, 
-	0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00, 
-	0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00, 
-	0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18, 
-	0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8, 
-	0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52, 
-	0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac, 
-	0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09, 
-	0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09, 
-	0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 
-	0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 
-	0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0, 
-	0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0c, 
-	0xf8, 0x33, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00, 
-	0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00, 
-	0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93, 
-	0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89, 
-	0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, 
-	0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, 
-	0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03, 
-	0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93, 
-	0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d, 
-	0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 
-	0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 
-	0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 
-	0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 
-	0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0xdc, 
-	0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d, 
-	0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00, 
-	0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80, 
-	0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18, 
-	0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01, 
-	0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00, 
-	0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 
-	0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 
-	0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 
-	0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 
-	0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0x88, 
-	0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00, 
-	0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, 
-	0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89, 
-	0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b, 
-	0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8, 
-	0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37, 
-	0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00, 
-	0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33, 
-	0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31, 
-	0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48, 
-	0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30, 
-	0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00, 
-	0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a, 
-	0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8, 
-	0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, 
-	0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f, 
-	0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 
-	0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00, 
-	0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89, 
-	0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 
-	0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 
-	0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, 
-	0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9, 
-	0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff, 
-	0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
-	0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00, 
-	0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41, 
-	0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x60, 0x54, 0xff, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, 
-	0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5, 
-	0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 
-	0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 
-	0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 
-	0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x0b, 0xfe, 0xd5, 0x48, 0x9a, 
-	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18, 
-	0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
-	0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f, 
-	0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90, 
-	0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, 
-	0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 
-	0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 
-	0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00, 
-	0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d, 
-	0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 
-	0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 
-	0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
-	0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, 
-	0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x0b, 0xfe, 0x85, 0xe0, 0x02, 
-	0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6, 
-	0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62, 
-	0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c, 
-	0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0, 
-	0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68, 
-	0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08, 
-	0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d, 
-	0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49, 
-	0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60, 
-	0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19, 
-	0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c, 
-	0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0, 
-	0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8, 
-	0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57, 
-	0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08, 
-	0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80, 
-	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50, 
-	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
-	0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c, 
-	0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0, 
-	0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a, 
-	0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 
-	0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44, 
-	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40, 
-	0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x0b, 0xfe, 0x1a, 0xe0, 0x4f, 0x48, 0x3c, 
-	0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08, 
-	0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38, 
-	0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c, 
-	0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00, 
-	0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34, 
-	0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08, 
-	0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e, 
-	0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01, 
-	0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8, 
-	0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09, 
-	0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40, 
-	0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20, 
-	0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 
-	0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08, 
-	0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00, 
-	0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89, 
-	0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16, 
-	0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01, 
-	0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80, 
-	0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08, 
-	0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e, 
-	0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00, 
-	0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08, 
-	0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08, 
-	0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08, 
-	0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00, 
-	0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 
-	0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x03, 
-	0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01, 
-	0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e, 
-	0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06, 
-	0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8, 
-	0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29, 
-	0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b, 
-	0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12, 
-	0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b, 
-	0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21, 
-	0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b, 
-	0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f, 
-	0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a, 
-	0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12, 
-	0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12, 
-	0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b, 
-	0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a, 
-	0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12, 
-	0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12, 
-	0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d, 
-	0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b, 
-	0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb, 
-	0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12, 
-	0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05, 
-	0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b, 
-	0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0x44, 0x2e, 0x08, 0x1f, 0x1c, 
-	0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22, 
-	0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01, 
-	0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08, 
-	0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02, 
-	0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11, 
-	0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18, 
-	0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9, 
-	0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c, 
-	0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00, 
-	0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07, 
-	0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5, 
-	0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x60, 0x7c, 
-	0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x1f, 0x9c, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13, 
-	0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19, 
-	0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27, 
-	0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01, 
-	0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05, 
-	0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02, 
-	0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04, 
-	0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20, 
-	0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98, 
-	0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d, 
-	0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02, 
-	0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08, 
-	0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d, 
-	0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02, 
-	0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03, 
-	0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff, 
-	0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46, 
-	0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31, 
-	0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f, 
-	0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e, 
-	0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, 
-	0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01, 
-	0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 
-	0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46, 
-	0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00, 
-	0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80, 
-	0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff, 
-	0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7, 
-	0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74, 
-	0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02, 
-	0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a, 
-	0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68, 
-	0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff, 
-	0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35, 
-	0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00, 
-	0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e, 
-	0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff, 
-	0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07, 
-	0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c, 
-	0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08, 
-	0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9, 
-	0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, 
-	0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00, 
-	0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08, 
-	0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00, 
-	0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a, 
-	0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14, 
-	0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01, 
-	0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70, 
-	0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x60, 0x70, 
-	0x2e, 0x08, 0x60, 0x6c, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00, 
-	0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06, 
-	0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8, 
-	0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00, 
-	0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8, 
-	0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04, 
-	0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03, 
-	0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, 
-	0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89, 
-	0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00, 
-	0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04, 
-	0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 
-	0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, 
-	0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88, 
-	0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05, 
-	0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35, 
-	0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34, 
-	0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 
-	0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88, 
-	0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88, 
-	0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c, 
-	0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00, 
-	0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01, 
-	0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41, 
-	0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00, 
-	0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01, 
-	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21, 
-	0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20, 
-	0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d, 
-	0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16, 
-	0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19, 
-	0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48, 
-	0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, 
-	0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33, 
-	0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03, 
-	0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00, 
-	0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00, 
-	0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, 
-	0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 
-	0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0x7c, 0x1c, 
-	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x94, 0xa4, 
-	0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00, 
-	0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04, 
-	0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 
-	0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, 
-	0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20, 
-	0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b, 
-	0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01, 
-	0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, 
-	0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04, 
-	0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00, 
-	0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b, 
-	0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 
-	0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, 
-	0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3, 
-	0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00, 
-	0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, 
-	0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, 
-	0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80, 
-	0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07, 
-	0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda, 
-	0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20, 
-	0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c, 
-	0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80, 
-	0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14, 
-	0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f, 
-	0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70, 
-	0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00, 
-	0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a, 
-	0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80, 
-	0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02, 
-	0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba, 
-	0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 
-	0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x60, 0x74, 
-	0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a, 
-	0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 
-	0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14, 
-	0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80, 
-	0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40, 
-	0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, 
-	0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01, 
-	0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04, 
-	0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07, 
-	0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4, 
-	0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84, 
-	0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80, 
-	0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 
-	0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05, 
-	0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d, 
-	0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00, 
-	0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88, 
-	0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00, 
-	0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00, 
-	0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00, 
-	0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b, 
-	0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01, 
-	0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2, 
-	0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88, 
-	0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08, 
-	0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00, 
-	0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01, 
-	0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19, 
-	0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b, 
-	0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12, 
-	0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07, 
-	0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07, 
-	0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23, 
-	0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14, 
-	0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
-	0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00, 
-	0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3, 
-	0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01, 
-	0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03, 
-	0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04, 
-	0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06, 
-	0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, 
-	0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a, 
-	0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02, 
-	0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, 
-	0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00, 
-	0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09, 
-	0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68, 
-	0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00, 
-	0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00, 
-	0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00, 
-	0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09, 
-	0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02, 
-	0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a, 
-	0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03, 
-	0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01, 
-	0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02, 
-	0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40, 
-	0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 
-	0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 
-	0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc, 
-	0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0, 
-	0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, 
-	0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, 
-	0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80, 
-	0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00, 
-	0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0, 
-	0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20, 
-	0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff, 
-	0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00, 
-	0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78, 
-	0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7, 
-	0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d, 
-	0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84, 
-	0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09, 
-	0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01, 
-	0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46, 
-	0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00, 
-	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48, 
-	0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16, 
-	0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10, 
-	0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70, 
-	0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38, 
-	0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b, 
-	0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80, 
-	0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10, 
-	0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20, 
-	0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00, 
-	0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00, 
-	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80, 
-	0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12, 
-	0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30, 
-	0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06, 
-	0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14, 
-	0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00, 
-	0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c, 
-	0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b, 
-	0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78, 
-	0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 
-	0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10, 
-	0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, 
-	0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38, 
-	0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, 
-	0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff, 
-	0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8, 
-	0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00, 
-	0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20, 
-	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06, 
-	0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06, 
-	0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02, 
-	0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, 
-	0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18, 
-	0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98, 
-	0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c, 
-	0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09, 
-	0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33, 
-	0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff, 
-	0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39, 
-	0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10, 
-	0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39, 
-	0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03, 
-	0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 
-	0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01, 
-	0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29, 
-	0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 
-	0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, 
-	0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38, 
-	0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18, 
-	0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38, 
-	0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18, 
-	0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c, 
-	0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20, 
-	0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39, 
-	0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40, 
-	0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0, 
-	0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff, 
-	0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff, 
-	0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, 
-	0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 
-	0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, 
-	0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39, 
-	0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02, 
-	0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39, 
-	0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00, 
-	0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00, 
-	0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, 
-	0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0, 
-	0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00, 
-	0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45, 
-	0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03, 
-	0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02, 
-	0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03, 
-	0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00, 
-	0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01, 
-	0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01, 
-	0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01, 
-	0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c, 
-	0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00, 
-	0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05, 
-	0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00, 
-	0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, 
-	0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08, 
-	0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40, 
-	0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07, 
-	0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, 
-	0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39, 
-	0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39, 
-	0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39, 
-	0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40, 
-	0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00, 
-	0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38, 
-	0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, 
-	0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 
-	0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38, 
-	0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04, 
-	0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03, 
-	0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03, 
-	0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03, 
-	0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98, 
-	0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04, 
-	0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 
-	0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00, 
-	0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23, 
-	0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02, 
-	0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b, 
-	0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39, 
-	0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e, 
-	0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c, 
-	0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b, 
-	0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99, 
-	0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33, 
-	0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08, 
-	0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b, 
-	0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18, 
-	0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00, 
-	0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47, 
-	0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02, 
-	0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 
-	0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0, 
-	0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, 
-	0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08, 
-	0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b, 
-	0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00, 
-	0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 
-	0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 
-	0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6, 
-	0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06, 
-	0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93, 
-	0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00, 
-	0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40, 
-	0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00, 
-	0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18, 
-	0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28, 
-	0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00, 
-	0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01, 
-	0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05, 
-	0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18, 
-	0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58, 
-	0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00, 
-	0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00, 
-	0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b, 
-	0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01, 
-	0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18, 
-	0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17, 
-	0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00, 
-	0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15, 
-	0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7d, 0x94, 
-	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x00, 
-	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x60, 0x84, 
-	0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, 
-	0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x5e, 0x4c, 
-	0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40, 
-	0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a, 
-	0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, 
-	0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06, 
-	0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05, 
-	0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01, 
-	0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00, 
-	0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08, 
-	0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04, 
-	0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d, 
-	0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e, 
-	0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43, 
-	0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff, 
-	0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00, 
-	0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d, 
-	0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46, 
-	0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05, 
-	0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70, 
-	0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08, 
-	0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d, 
-	0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e, 
-	0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45, 
-	0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0, 
-	0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64, 
-	0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02, 
-	0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60, 
-	0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00, 
-	0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04, 
-	0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01, 
-	0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01, 
-	0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c, 
-	0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a, 
-	0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80, 
-	0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02, 
-	0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11, 
-	0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80, 
-	0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03, 
-	0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03, 
-	0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03, 
-	0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f, 
-	0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03, 
-	0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05, 
-	0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, 
-	0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, 
-	0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17, 
-	0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a, 
-	0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff, 
-	0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0, 
-	0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00, 
-	0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02, 
-	0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78, 
-	0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, 
-	0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8, 
-	0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, 
-	0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03, 
-	0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8, 
-	0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03, 
-	0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8, 
-	0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, 
-	0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00, 
-	0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81, 
-	0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46, 
-	0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01, 
-	0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c, 
-	0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0, 
-	0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b, 
-	0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13, 
-	0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09, 
-	0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69, 
-	0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08, 
-	0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20, 
-	0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8, 
-	0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20, 
-	0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01, 
-	0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, 
-	0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00, 
-	0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01, 
-	0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38, 
-	0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52, 
-	0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, 
-	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39, 
-	0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 
-	0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03, 
-	0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08, 
-	0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc, 
-	0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00, 
-	0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08, 
-	0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00, 
-	0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48, 
-	0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26, 
-	0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23, 
-	0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0, 
-	0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04, 
-	0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8, 
-	0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19, 
-	0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff, 
-	0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff, 
-	0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40, 
-	0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00, 
-	0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48, 
-	0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b, 
-	0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88, 
-	0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d, 
-	0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe, 
-	0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
-	0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x7c, 0xbc, 
-	0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00, 
-	0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30, 
-	0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04, 
-	0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40, 
-	0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01, 
-	0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, 
-	0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc, 
-	0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 
-	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, 
-	0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x13, 
-	0xfb, 0x0d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8, 
-	0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, 
-	0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff, 
-	0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00, 
-	0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9, 
-	0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, 
-	0x2e, 0x08, 0x7c, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 
-	0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01, 
-	0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9, 
-	0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 
-	0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, 
-	0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a, 
-	0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19, 
-	0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88, 
-	0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c, 
-	0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04, 
-	0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01, 
-	0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08, 
-	0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, 
-	0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8, 
-	0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b, 
-	0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf, 
-	0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81, 
-	0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07, 
-	0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36, 
-	0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 
-	0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3, 
-	0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4, 
-	0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17, 
-	0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70, 
-	0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01, 
-	0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48, 
-	0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40, 
-	0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06, 
-	0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84, 
-	0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00, 
-	0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02, 
-	0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03, 
-	0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04, 
-	0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04, 
-	0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0, 
-	0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02, 
-	0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0, 
-	0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14, 
-	0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd, 
-	0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06, 
-	0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02, 
-	0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06, 
-	0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98, 
-	0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02, 
-	0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e, 
-	0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00, 
-	0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 
-	0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00, 
-	0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78, 
-	0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f, 
-	0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d, 
-	0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48, 
-	0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, 
-	0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05, 
-	0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78, 
-	0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39, 
-	0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29, 
-	0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12, 
-	0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, 
-	0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d, 
-	0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10, 
-	0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38, 
-	0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00, 
-	0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10, 
-	0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78, 
-	0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 
-	0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06, 
-	0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08, 
-	0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88, 
-	0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f, 
-	0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01, 
-	0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41, 
-	0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06, 
-	0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 
-	0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39, 
-	0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17, 
-	0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, 
-	0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b, 
-	0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b, 
-	0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 
-	0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e, 
-	0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01, 
-	0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c, 
-	0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00, 
-	0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40, 
-	0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38, 
-	0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01, 
-	0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13, 
-	0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51, 
-	0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20, 
-	0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04, 
-	0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, 
-	0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78, 
-	0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14, 
-	0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14, 
-	0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88, 
-	0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14, 
-	0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01, 
-	0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00, 
-	0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04, 
-	0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00, 
-	0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02, 
-	0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00, 
-	0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33, 
-	0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01, 
-	0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08, 
-	0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10, 
-	0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98, 
-	0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, 
-	0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1, 
-	0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 
-	0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00, 
-	0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00, 
-	0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 
-	0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48, 
-	0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 
-	0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01, 
-	0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10, 
-	0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 
-	0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30, 
-	0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c, 
-	0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 
-	0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48, 
-	0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88, 
-	0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, 
-	0x2e, 0x08, 0x7c, 0xbc, 0xcc, 0x00, 0x02, 0x00, 
-	0x2e, 0x08, 0x7d, 0xa0, 0xcc, 0x00, 0x0f, 0x80, 
-	0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00, 
-	0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08, 
-	0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 
-	0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01, 
-	0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07, 
-	0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb, 
-	0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b, 
-	0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 
-	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00, 
-	0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00, 
-	0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12, 
-	0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c, 
-	0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02, 
-	0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08, 
-	0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00, 
-	0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08, 
-	0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b, 
-	0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07, 
-	0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b, 
-	0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1, 
-	0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, 
-	0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28, 
-	0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 
-	0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02, 
-	0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d, 
-	0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14, 
-	0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98, 
-	0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23, 
-	0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e, 
-	0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b, 
-	0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01, 
-	0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08, 
-	0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06, 
-	0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28, 
-	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, 
-	0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3, 
-	0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b, 
-	0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b, 
-	0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b, 
-	0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b, 
-	0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18, 
-	0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55, 
-	0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58, 
-	0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55, 
-	0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53, 
-	0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51, 
-	0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18, 
-	0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04, 
-	0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e, 
-	0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d, 
-	0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00, 
-	0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50, 
-	0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00, 
-	0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff, 
-	0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45, 
-	0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8, 
-	0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 
-	0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 
-	0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, 
-	0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, 
-	0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 
-	0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, 
-	0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a, 
-	0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43, 
-	0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00, 
-	0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50, 
-	0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00, 
-	0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff, 
-	0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93, 
-	0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04, 
-	0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, 
-	0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a, 
-	0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18, 
-	0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c, 
-	0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 
-	0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0, 
-	0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c, 
-	0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, 
-	0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01, 
-	0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4, 
-	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01, 
-	0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0x72, 0xec, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x72, 0x90, 
-	0x2e, 0x08, 0x72, 0x9c, 0x9e, 0x00, 0x04, 0x80, 
-	0x2e, 0x08, 0x60, 0x90, 0x2e, 0x08, 0x69, 0x90, 
-	0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x5e, 0xdc, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x2e, 0x08, 0x5f, 0xa4, 0x64, 0x00, 0x08, 0x00, 
-	0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0x7b, 0xf4, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5f, 0xc4, 0xb4, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 
-	0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, 
-	0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05, 
-	0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8, 
-	0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, 
-	0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9, 
-	0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11, 
-	0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18, 
-	0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03, 
-	0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05, 
-	0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02, 
-	0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06, 
-	0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02, 
-	0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03, 
-	0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, 
-	0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, 
-	0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05, 
-	0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06, 
-	0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04, 
-	0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84, 
-	0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a, 
-	0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86, 
-	0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f, 
-	0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02, 
-	0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8, 
-	0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c, 
-	0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8, 
-	0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a, 
-	0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a, 
-	0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78, 
-	0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0, 
-	0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa, 
-	0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93, 
-	0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03, 
-	0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16, 
-	0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00, 
-	0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20, 
-	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0, 
-	0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0, 
-	0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20, 
-	0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02, 
-	0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38, 
-	0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40, 
-	0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05, 
-	0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37, 
-	0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 
-	0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03, 
-	0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31, 
-	0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00, 
-	0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00, 
-	0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02, 
-	0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 
-	0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04, 
-	0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80, 
-	0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21, 
-	0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02, 
-	0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d, 
-	0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b, 
-	0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48, 
-	0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 
-	0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15, 
-	0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2, 
-	0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88, 
-	0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08, 
-	0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05, 
-	0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, 
-	0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00, 
-	0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00, 
-	0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04, 
-	0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72, 
-	0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x60, 0x88, 
-	0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81, 
-	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3, 
-	0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6, 
-	0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04, 
-	0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f, 
-	0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36, 
-	0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33, 
-	0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f, 
-	0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3, 
-	0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x5e, 0x5c, 
-	0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, 
-	0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, 
-	0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08, 
-	0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0, 
-	0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01, 
-	0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18, 
-	0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x81, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86, 
-	0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05, 
-	0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2, 
-	0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02, 
-	0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8, 
-	0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05, 
-	0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c, 
-	0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02, 
-	0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00, 
-	0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, 
-	0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, 
-	0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 
-	0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8, 
-	0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08, 
-	0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 
-	0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e, 
-	0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, 
-	0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01, 
-	0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, 
-	0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, 
-	0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30, 
-	0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05, 
-	0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05, 
-	0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 
-	0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 
-	0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00, 
-	0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63, 
-	0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8, 
-	0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c, 
-	0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60, 
-	0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, 
-	0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0, 
-	0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58, 
-	0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 
-	0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00, 
-	0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, 
-	0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00, 
-	0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, 
-	0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, 
-	0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04, 
-	0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03, 
-	0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00, 
-	0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b, 
-	0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8, 
-	0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, 
-	0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30, 
-	0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28, 
-	0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01, 
-	0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01, 
-	0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01, 
-	0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, 
-	0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12, 
-	0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89, 
-	0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89, 
-	0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05, 
-	0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02, 
-	0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01, 
-	0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e, 
-	0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, 
-	0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80, 
-	0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 
-	0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, 
-	0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06, 
-	0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xc4, 
-	0x2e, 0x08, 0x5f, 0x64, 0xff, 0xff, 0xfb, 0xff, 
-	0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03, 
-	0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 
-	0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70, 
-	0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07, 
-	0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8, 
-	0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02, 
-	0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, 
-	0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09, 
-	0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05, 
-	0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01, 
-	0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80, 
-	0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81, 
-	0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7, 
-	0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11, 
-	0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04, 
-	0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08, 
-	0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, 
-	0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4, 
-	0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f, 
-	0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00, 
-	0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf, 
-	0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4, 
-	0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88, 
-	0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff, 
-	0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01, 
-	0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05, 
-	0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14, 
-	0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06, 
-	0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03, 
-	0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05, 
-	0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56, 
-	0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00, 
-	0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25, 
-	0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0, 
-	0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01, 
-	0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83, 
-	0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, 
-	0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 
-	0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02, 
-	0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5, 
-	0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 
-	0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08, 
-	0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05, 
-	0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05, 
-	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1, 
-	0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08, 
-	0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54, 
-	0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00, 
-	0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73, 
-	0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e, 
-	0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70, 
-	0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08, 
-	0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50, 
-	0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6, 
-	0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38, 
-	0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00, 
-	0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01, 
-	0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09, 
-	0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff, 
-	0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81, 
-	0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, 
-	0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 
-	0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11, 
-	0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a, 
-	0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08, 
-	0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51, 
-	0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 
-	0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89, 
-	0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c, 
-	0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e, 
-	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6, 
-	0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7, 
-	0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 
-	0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05, 
-	0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d, 
-	0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07, 
-	0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08, 
-	0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1, 
-	0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81, 
-	0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81, 
-	0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45, 
-	0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08, 
-	0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c, 
-	0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02, 
-	0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04, 
-	0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88, 
-	0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11, 
-	0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56, 
-	0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07, 
-	0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8, 
-	0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28, 
-	0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8, 
-	0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a, 
-	0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d, 
-	0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c, 
-	0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8, 
-	0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07, 
-	0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c, 
-	0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04, 
-	0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39, 
-	0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 
-	0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38, 
-	0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08, 
-	0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5f, 0xa4, 
-	0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x5e, 0xe4, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, 
-	0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5f, 0xc4, 
-	0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22, 
-	0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8, 
-	0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01, 
-	0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00, 
-	0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08, 
-	0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90, 
-	0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1, 
-	0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07, 
-	0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84, 
-	0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07, 
-	0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87, 
-	0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7, 
-	0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44, 
-	0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7, 
-	0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47, 
-	0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 
-	0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70, 
-	0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0xb0, 0x82, 
-	0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00, 
-	0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01, 
-	0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf, 
-	0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4, 
-	0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08, 
-	0x49, 0x32, 0x98, 0x00, 0xf0, 0x09, 0xfa, 0xca, 
-	0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff, 
-	0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b, 
-	0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0, 
-	0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01, 
-	0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0, 
-	0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 
-	0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06, 
-	0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, 
-	0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 
-	0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06, 
-	0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02, 
-	0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b, 
-	0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, 
-	0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06, 
-	0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, 
-	0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, 
-	0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06, 
-	0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04, 
-	0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41, 
-	0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76, 
-	0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04, 
-	0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90, 
-	0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0xa0, 0x2e, 0x01, 0x35, 0x35, 
-	0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0x1c, 0x0f, 
-	0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03, 
-	0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04, 
-	0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01, 
-	0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10, 
-	0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f, 
-	0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb, 
-	0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18, 
-	0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a, 
-	0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00, 
-	0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 
-	0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, 
-	0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63, 
-	0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b, 
-	0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98, 
-	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08, 
-	0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 
-	0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b, 
-	0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00, 
-	0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b, 
-	0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00, 
-	0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00, 
-	0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, 
-	0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 
-	0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, 
-	0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40, 
-	0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40, 
-	0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18, 
-	0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb, 
-	0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36, 
-	0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, 
-	0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 
-	0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b, 
-	0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 
-	0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37, 
-	0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c, 
-	0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f, 
-	0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d, 
-	0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00, 
-	0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01, 
-	0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29, 
-	0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18, 
-	0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, 
-	0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23, 
-	0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18, 
-	0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00, 
-	0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09, 
-	0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01, 
-	0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23, 
-	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d, 
-	0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15, 
-	0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18, 
-	0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11, 
-	0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 
-	0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40, 
-	0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18, 
-	0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, 
-	0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0, 
-	0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14, 
-	0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x7c, 0x18, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5e, 0x0c, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xc4, 
-	0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 
-	0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
-	0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x12, 
-	0xf8, 0x69, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, 
-	0x1d, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x62, 
-	0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x5a, 
-	0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x09, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x52, 
-	0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x0d, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x4a, 
-	0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x42, 
-	0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x5e, 0x0c, 0xb5, 0xf0, 0x1c, 0x07, 
-	0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08, 
-	0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2, 
-	0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00, 
-	0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8, 
-	0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53, 
-	0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0, 
-	0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00, 
-	0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33, 
-	0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33, 
-	0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48, 
-	0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8, 
-	0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 
-	0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 
-	0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8, 
-	0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e, 
-	0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff, 
-	0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25, 
-	0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84, 
-	0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33, 
-	0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0, 
-	0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00, 
-	0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, 
-	0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80, 
-	0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0, 
-	0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, 
-	0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45, 
-	0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00, 
-	0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20, 
-	0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8, 
-	0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01, 
-	0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88, 
-	0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40, 
-	0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00, 
-	0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14, 
-	0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08, 
-	0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 
-	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38, 
-	0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 
-	0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a, 
-	0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, 
-	0x2e, 0x08, 0x7c, 0x1c, 0x00, 0x00, 0x80, 0x0f, 
-	0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0, 
-	0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0, 
-	0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02, 
-	0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00, 
-	0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05, 
-	0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00, 
-	0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 
-	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26, 
-	0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6, 
-	0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00, 
-	0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, 
-	0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00, 
-	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0, 
-	0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82, 
-	0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80, 
-	0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02, 
-	0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40, 
-	0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12, 
-	0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40, 
-	0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8, 
-	0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d, 
-	0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 
-	0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
-	0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00, 
-	0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33, 
-	0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01, 
-	0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20, 
-	0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02, 
-	0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb, 
-	0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07, 
-	0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10, 
-	0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05, 
-	0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, 
-	0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05, 
-	0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03, 
-	0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68, 
-	0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18, 
-	0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04, 
-	0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c, 
-	0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c, 
-	0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08, 
-	0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04, 
-	0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c, 
-	0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03, 
-	0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd, 
-	0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03, 
-	0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08, 
-	0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06, 
-	0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40, 
-	0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48, 
-	0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48, 
-	0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20, 
-	0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8, 
-	0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a, 
-	0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06, 
-	0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10, 
-	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, 
-	0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01, 
-	0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68, 
-	0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68, 
-	0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40, 
-	0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b, 
-	0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89, 
-	0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00, 
-	0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c, 
-	0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02, 
-	0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18, 
-	0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42, 
-	0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08, 
-	0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08, 
-	0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06, 
-	0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07, 
-	0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08, 
-	0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e, 
-	0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00, 
-	0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00, 
-	0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02, 
-	0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90, 
-	0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08, 
-	0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, 
-	0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 
-	0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90, 
-	0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90, 
-	0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01, 
-	0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b, 
-	0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00, 
-	0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80, 
-	0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68, 
-	0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, 
-	0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18, 
-	0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00, 
-	0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, 
-	0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00, 
-	0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c, 
-	0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1, 
-	0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd, 
-	0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x10, 
-	0x2e, 0x08, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00, 
-	0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, 
-	0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8, 
-	0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13, 
-	0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2, 
-	0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 
-	0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20, 
-	0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31, 
-	0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09, 
-	0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29, 
-	0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8, 
-	0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, 
-	0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93, 
-	0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01, 
-	0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, 
-	0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80, 
-	0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18, 
-	0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18, 
-	0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01, 
-	0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08, 
-	0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06, 
-	0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1, 
-	0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02, 
-	0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11, 
-	0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02, 
-	0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02, 
-	0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e, 
-	0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40, 
-	0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06, 
-	0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10, 
-	0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05, 
-	0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, 
-	0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a, 
-	0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03, 
-	0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09, 
-	0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, 
-	0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c, 
-	0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00, 
-	0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10, 
-	0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10, 
-	0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80, 
-	0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12, 
-	0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04, 
-	0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05, 
-	0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00, 
-	0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01, 
-	0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e, 
-	0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04, 
-	0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, 
-	0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01, 
-	0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20, 
-	0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30, 
-	0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11, 
-	0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0, 
-	0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70, 
-	0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b, 
-	0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c, 
-	0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00, 
-	0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, 
-	0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06, 
-	0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, 
-	0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, 
-	0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90, 
-	0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00, 
-	0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05, 
-	0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e, 
-	0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80, 
-	0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01, 
-	0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81, 
-	0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78, 
-	0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11, 
-	0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8, 
-	0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1, 
-	0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd, 
-	0x2e, 0x08, 0x5e, 0x5c, 0x80, 0x00, 0x00, 0x00, 
-	0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80, 
-	0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef, 
-	0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe, 
-	0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8, 
-	0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78, 
-	0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50, 
-	0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b, 
-	0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0, 
-	0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50, 
-	0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, 
-	0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
-	0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80, 
-	0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00, 
-	0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0, 
-	0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10, 
-	0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0, 
-	0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, 
-	0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01, 
-	0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90, 
-	0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7, 
-	0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90, 
-	0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50, 
-	0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0, 
-	0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01, 
-	0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, 
-	0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02, 
-	0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a, 
-	0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d, 
-	0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70, 
-	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x1f, 0xa4, 
-	0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00, 
-	0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
-	0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f, 
-	0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10, 
-	0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, 
-	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, 
-	0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b, 
-	0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52, 
-	0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
-	0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00, 
-	0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 
-	0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04, 
-	0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04, 
-	0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8, 
-	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
-	0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80, 
-	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff, 
-	0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb, 
-	0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01, 
-	0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00, 
-	0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18, 
-	0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40, 
-	0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, 
-	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06, 
-	0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08, 
-	0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80, 
-	0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00, 
-	0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 
-	0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07, 
-	0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02, 
-	0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03, 
-	0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02, 
-	0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c, 
-	0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33, 
-	0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01, 
-	0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70, 
-	0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20, 
-	0xf0, 0x11, 0xfb, 0x6a, 0x48, 0x1f, 0x69, 0x84, 
-	0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06, 
-	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
-	0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00, 
-	0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00, 
-	0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00, 
-	0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00, 
-	0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00, 
-	0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00, 
-	0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00, 
-	0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00, 
-	0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18, 
-	0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, 
-	0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01, 
-	0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f, 
-	0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50, 
-	0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 
-	0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31, 
-	0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0, 
-	0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0, 
-	0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00, 
-	0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05, 
-	0xf0, 0x11, 0xfb, 0x08, 0xf0, 0x11, 0xfa, 0xe4, 
-	0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 
-	0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89, 
-	0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21, 
-	0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16, 
-	0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18, 
-	0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 
-	0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 
-	0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08, 
-	0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04, 
-	0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc, 
-	0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x11, 0xfa, 0xda, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f, 
-	0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, 
-	0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, 
-	0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70, 
-	0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, 
-	0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, 
-	0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0x86, 
-	0xf0, 0x11, 0xfa, 0x62, 0x48, 0x2a, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01, 
-	0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e, 
-	0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a, 
-	0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0, 
-	0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29, 
-	0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 
-	0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10, 
-	0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00, 
-	0xff, 0x1e, 0xf0, 0x11, 0xfa, 0x39, 0x48, 0x0a, 
-	0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, 
-	0x9b, 0x04, 0x60, 0x18, 0xf0, 0x11, 0xfa, 0x52, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c, 
-	0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28, 
-	0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 
-	0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 
-	0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08, 
-	0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64, 
-	0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01, 
-	0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 
-	0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28, 
-	0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01, 
-	0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02, 
-	0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00, 
-	0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 
-	0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 
-	0xf9, 0xed, 0xf0, 0x11, 0xf9, 0xc9, 0x48, 0x2a, 
-	0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
-	0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26, 
-	0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 
-	0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89, 
-	0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19, 
-	0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c, 
-	0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 
-	0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34, 
-	0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18, 
-	0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9, 
-	0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 
-	0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00, 
-	0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07, 
-	0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x11, 0xf9, 0xba, 
-	0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81, 
-	0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04, 
-	0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 
-	0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04, 
-	0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02, 
-	0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8, 
-	0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08, 
-	0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71, 
-	0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20, 
-	0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x11, 0xf9, 0x56, 
-	0xf0, 0x11, 0xf9, 0x32, 0x48, 0x30, 0x69, 0x80, 
-	0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e, 
-	0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03, 
-	0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a, 
-	0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20, 
-	0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08, 
-	0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a, 
-	0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08, 
-	0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e, 
-	0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0, 
-	0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04, 
-	0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00, 
-	0xfd, 0xda, 0xf0, 0x11, 0xf9, 0x17, 0x20, 0x00, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, 
-	0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86, 
-	0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07, 
-	0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d, 
-	0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78, 
-	0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, 
-	0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01, 
-	0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08, 
-	0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, 
-	0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, 
-	0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02, 
-	0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8, 
-	0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04, 
-	0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, 
-	0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 
-	0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49, 
-	0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, 
-	0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, 
-	0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 0xf8, 0x9a, 
-	0xf0, 0x11, 0xf8, 0x76, 0x48, 0x33, 0x69, 0x80, 
-	0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31, 
-	0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80, 
-	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04, 
-	0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00, 
-	0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9, 
-	0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08, 
-	0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24, 
-	0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08, 
-	0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0, 
-	0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 
-	0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07, 
-	0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00, 
-	0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49, 
-	0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d, 
-	0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40, 
-	0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49, 
-	0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x11, 
-	0xf8, 0x55, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff, 
-	0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, 
-	0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93, 
-	0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11, 
-	0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e, 
-	0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79, 
-	0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88, 
-	0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71, 
-	0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02, 
-	0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40, 
-	0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89, 
-	0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02, 
-	0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61, 
-	0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 
-	0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01, 
-	0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12, 
-	0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80, 
-	0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41, 
-	0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80, 
-	0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48, 
-	0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b, 
-	0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a, 
-	0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b, 
-	0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06, 
-	0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9, 
-	0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 
-	0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40, 
-	0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08, 
-	0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04, 
-	0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03, 
-	0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78, 
-	0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, 
-	0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01, 
-	0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a, 
-	0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, 
-	0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, 
-	0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, 
-	0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78, 
-	0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8, 
-	0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 
-	0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 
-	0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09, 
-	0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 
-	0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 
-	0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, 
-	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 
-	0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8, 
-	0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13, 
-	0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, 
-	0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92, 
-	0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10, 
-	0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e, 
-	0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78, 
-	0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9, 
-	0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09, 
-	0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16, 
-	0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08, 
-	0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04, 
-	0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88, 
-	0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06, 
-	0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a, 
-	0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40, 
-	0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06, 
-	0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08, 
-	0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05, 
-	0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07, 
-	0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e, 
-	0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 
-	0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00, 
-	0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68, 
-	0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, 
-	0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, 
-	0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36, 
-	0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08, 
-	0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01, 
-	0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04, 
-	0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, 
-	0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, 
-	0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 
-	0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02, 
-	0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 
-	0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 
-	0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 
-	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 
-	0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18, 
-	0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29, 
-	0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 
-	0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02, 
-	0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01, 
-	0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, 
-	0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 
-	0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f, 
-	0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07, 
-	0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11, 
-	0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0, 
-	0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40, 
-	0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1, 
-	0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18, 
-	0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, 
-	0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41, 
-	0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, 
-	0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 
-	0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00, 
-	0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18, 
-	0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02, 
-	0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08, 
-	0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09, 
-	0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f, 
-	0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b, 
-	0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08, 
-	0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12, 
-	0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12, 
-	0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08, 
-	0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40, 
-	0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b, 
-	0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80, 
-	0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06, 
-	0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04, 
-	0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 
-	0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06, 
-	0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48, 
-	0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02, 
-	0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 
-	0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0, 
-	0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d, 
-	0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38, 
-	0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09, 
-	0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a, 
-	0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, 
-	0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1, 
-	0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8, 
-	0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38, 
-	0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86, 
-	0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20, 
-	0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a, 
-	0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69, 
-	0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0, 
-	0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b, 
-	0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, 
-	0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08, 
-	0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 
-	0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, 
-	0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 
-	0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 
-	0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8, 
-	0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09, 
-	0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09, 
-	0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00, 
-	0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09, 
-	0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09, 
-	0x91, 0x0d, 0xf0, 0x10, 0xfd, 0x9b, 0xf0, 0x10, 
-	0xfd, 0x77, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00, 
-	0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18, 
-	0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 
-	0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8, 
-	0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02, 
-	0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80, 
-	0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18, 
-	0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, 
-	0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a, 
-	0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08, 
-	0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, 
-	0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09, 
-	0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40, 
-	0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08, 
-	0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19, 
-	0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59, 
-	0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38, 
-	0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57, 
-	0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51, 
-	0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 
-	0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19, 
-	0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89, 
-	0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20, 
-	0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08, 
-	0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00, 
-	0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41, 
-	0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19, 
-	0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d, 
-	0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9, 
-	0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f, 
-	0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92, 
-	0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92, 
-	0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e, 
-	0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f, 
-	0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9, 
-	0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b, 
-	0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 
-	0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27, 
-	0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25, 
-	0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23, 
-	0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21, 
-	0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f, 
-	0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9, 
-	0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c, 
-	0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2, 
-	0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52, 
-	0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52, 
-	0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52, 
-	0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52, 
-	0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52, 
-	0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05, 
-	0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00, 
-	0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x10, 
-	0xfc, 0xc9, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, 
-	0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, 
-	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff, 
-	0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 
-	0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, 
-	0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18, 
-	0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89, 
-	0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08, 
-	0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00, 
-	0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31, 
-	0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 
-	0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08, 
-	0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00, 
-	0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08, 
-	0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80, 
-	0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89, 
-	0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08, 
-	0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80, 
-	0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d, 
-	0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, 
-	0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b, 
-	0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0, 
-	0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, 
-	0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 
-	0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
-	0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09, 
-	0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0, 
-	0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08, 
-	0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80, 
-	0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89, 
-	0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80, 
-	0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04, 
-	0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0x3a, 0x04, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xe7, 0xff, 
-	0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff, 
-	0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15, 
-	0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21, 
-	0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d, 
-	0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b, 
-	0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09, 
-	0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05, 
-	0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f, 
-	0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00, 
-	0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b, 
-	0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33, 
-	0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00, 
-	0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00, 
-	0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49, 
-	0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf, 
-	0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35, 
-	0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 
-	0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08, 
-	0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e, 
-	0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18, 
-	0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, 
-	0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00, 
-	0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49, 
-	0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20, 
-	0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e, 
-	0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, 
-	0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, 
-	0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18, 
-	0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39, 
-	0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49, 
-	0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40, 
-	0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff, 
-	0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01, 
-	0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88, 
-	0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40, 
-	0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f, 
-	0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00, 
-	0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xfc, 0x03, 
-	0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, 
-	0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e, 
-	0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00, 
-	0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10, 
-	0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01, 
-	0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06, 
-	0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01, 
-	0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14, 
-	0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89, 
-	0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, 
-	0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e, 
-	0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09, 
-	0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00, 
-	0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01, 
-	0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05, 
-	0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88, 
-	0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70, 
-	0x2e, 0x08, 0x1f, 0xa8, 0x2e, 0x08, 0x1f, 0xac, 
-	0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02, 
-	0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08, 
-	0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 
-	0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa, 
-	0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00, 
-	0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12, 
-	0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00, 
-	0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04, 
-	0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00, 
-	0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18, 
-	0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08, 
-	0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x07, 0xfb, 0x65, 0xe0, 0x18, 
-	0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18, 
-	0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0, 
-	0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d, 
-	0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e, 
-	0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a, 
-	0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, 
-	0xfb, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x7c, 0x2c, 
-	0x2e, 0x08, 0x7c, 0x30, 0x2e, 0x08, 0x7c, 0x34, 
-	0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x38, 
-	0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xf0, 0x1c, 0x05, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, 
-	0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d, 
-	0xf0, 0x07, 0xfb, 0x3c, 0x48, 0x07, 0x60, 0x04, 
-	0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08, 
-	0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06, 
-	0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00, 
-	0x2e, 0x01, 0x53, 0xed, 0x2e, 0x08, 0x7c, 0x30, 
-	0x2e, 0x08, 0x7c, 0x2c, 0x2e, 0x08, 0x7c, 0x34, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07, 
-	0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x17, 0x48, 0x06, 
-	0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, 
-	0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0x53, 0xed, 
-	0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x3c, 
-	0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01, 
-	0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d, 
-	0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb, 
-	0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57, 
-	0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c, 
-	0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27, 
-	0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22, 
-	0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d, 
-	0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09, 
-	0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d, 
-	0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17, 
-	0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00, 
-	0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 
-	0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 
-	0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00, 
-	0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 
-	0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 
-	0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c, 
-	0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00, 
-	0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80, 
-	0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0, 
-	0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30, 
-	0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0, 
-	0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02, 
-	0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08, 
-	0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 
-	0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a, 
-	0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, 
-	0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00, 
-	0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49, 
-	0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08, 
-	0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18, 
-	0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde, 
-	0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b, 
-	0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48, 
-	0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40, 
-	0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b, 
-	0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd, 
-	0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65, 
-	0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89, 
-	0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d, 
-	0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 
-	0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 
-	0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b, 
-	0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec, 
-	0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec, 
-	0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 
-	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 
-	0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54, 
-	0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00, 
-	0x2e, 0x08, 0x7c, 0x3d, 0x6e, 0x00, 0x0e, 0x10, 
-	0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18, 
-	0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24, 
-	0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90, 
-	0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4, 
-	0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4, 
-	0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a, 
-	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, 
-	0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06, 
-	0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10, 
-	0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00, 
-	0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0x7c, 0x3d, 
-	0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20, 
-	0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 
-	0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
-	0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01, 
-	0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2, 
-	0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x3d, 
-	0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04, 
-	0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00, 
-	0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04, 
-	0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, 
-	0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01, 
-	0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20, 
-	0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b, 
-	0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88, 
-	0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 
-	0x2e, 0x08, 0x60, 0x84, 0x1c, 0x03, 0x1c, 0x0a, 
-	0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88, 
-	0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06, 
-	0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb, 
-	0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69, 
-	0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88, 
-	0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 
-	0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01, 
-	0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, 
-	0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 
-	0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0, 
-	0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05, 
-	0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a, 
-	0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60, 
-	0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09, 
-	0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60, 
-	0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00, 
-	0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08, 
-	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07, 
-	0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00, 
-	0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04, 
-	0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06, 
-	0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07, 
-	0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03, 
-	0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff, 
-	0x49, 0x84, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0xca, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80, 
-	0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88, 
-	0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, 
-	0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00, 
-	0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a, 
-	0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x0f, 
-	0xff, 0xa5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f, 
-	0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09, 
-	0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, 
-	0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 
-	0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80, 
-	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, 
-	0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14, 
-	0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 
-	0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 
-	0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, 
-	0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38, 
-	0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee, 
-	0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21, 
-	0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78, 
-	0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 
-	0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 
-	0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 
-	0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 
-	0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
-	0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 
-	0x49, 0x24, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0x06, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22, 
-	0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00, 
-	0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f, 
-	0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 
-	0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a, 
-	0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, 
-	0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01, 
-	0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06, 
-	0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08, 
-	0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89, 
-	0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92, 
-	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, 
-	0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x60, 0x84, 
-	0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0xc0, 
-	0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x94, 0x88, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00, 
-	0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b, 
-	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a, 
-	0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x98, 0x02, 0x90, 0x01, 0x98, 0x01, 
-	0x88, 0x44, 0x98, 0x01, 0x78, 0x06, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x9c, 0xdd, 0x02, 0x20, 0xff, 
-	0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, 
-	0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91, 
-	0xf0, 0x0f, 0xfe, 0x88, 0x28, 0x92, 0xd0, 0x03, 
-	0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5, 
-	0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5, 
-	0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, 
-	0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13, 
-	0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15, 
-	0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91, 
-	0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d, 
-	0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02, 
-	0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00, 
-	0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92, 
-	0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0, 
-	0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x08, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc8, 
-	0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, 
-	0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 
-	0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, 
-	0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, 
-	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, 
-	0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
-	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 
-	0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x1e, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, 
-	0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, 
-	0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80, 
-	0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02, 
-	0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, 
-	0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, 
-	0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00, 
-	0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94, 
-	0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, 
-	0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
-	0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf7, 0x9a, 0x02, 
-	0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66, 
-	0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20, 
-	0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff, 
-	0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfd, 0xc5, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01, 
-	0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01, 
-	0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02, 
-	0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d, 
-	0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36, 
-	0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b, 
-	0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x9b, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82, 
-	0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0, 
-	0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, 
-	0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6, 
-	0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a, 
-	0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, 
-	0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08, 
-	0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b, 
-	0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80, 
-	0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10, 
-	0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6, 
-	0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3, 
-	0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 
-	0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3, 
-	0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfd, 0x45, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
-	0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28, 
-	0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00, 
-	0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18, 
-	0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08, 
-	0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92, 
-	0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf, 
-	0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11, 
-	0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f, 
-	0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11, 
-	0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01, 
-	0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, 
-	0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02, 
-	0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81, 
-	0x49, 0x65, 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x0a, 
-	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, 
-	0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, 
-	0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08, 
-	0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 
-	0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, 
-	0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 
-	0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12, 
-	0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
-	0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, 
-	0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18, 
-	0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 
-	0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 
-	0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 
-	0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01, 
-	0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00, 
-	0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 
-	0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40, 
-	0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17, 
-	0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37, 
-	0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, 
-	0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45, 
-	0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14, 
-	0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09, 
-	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, 
-	0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f, 
-	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12, 
-	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02, 
-	0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x0f, 
-	0xfc, 0x65, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
-	0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11, 
-	0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00, 
-	0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 
-	0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3, 
-	0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, 
-	0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, 
-	0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb8, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26, 
-	0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2, 
-	0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8, 
-	0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04, 
-	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff, 
-	0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01, 
-	0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 
-	0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01, 
-	0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9, 
-	0x49, 0x14, 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0xee, 
-	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
-	0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08, 
-	0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01, 
-	0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01, 
-	0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01, 
-	0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02, 
-	0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05, 
-	0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5, 
-	0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, 
-	0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07, 
-	0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10, 
-	0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b, 
-	0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01, 
-	0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3, 
-	0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84, 
-	0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, 
-	0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0, 
-	0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, 
-	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, 
-	0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 
-	0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c, 
-	0x20, 0x91, 0xf0, 0x0f, 0xfb, 0x7f, 0x28, 0x92, 
-	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66, 
-	0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07, 
-	0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04, 
-	0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd, 
-	0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, 
-	0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x0e, 0x00, 
-	0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39, 
-	0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01, 
-	0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa, 
-	0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00, 
-	0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0xc8, 0x20, 0x00, 0x6b, 0x00, 
-	0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40, 
-	0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, 
-	0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, 
-	0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08, 
-	0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 
-	0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64, 
-	0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63, 
-	0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f, 
-	0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e, 
-	0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57, 
-	0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55, 
-	0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51, 
-	0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d, 
-	0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a, 
-	0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49, 
-	0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48, 
-	0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46, 
-	0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45, 
-	0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44, 
-	0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43, 
-	0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41, 
-	0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e, 
-	0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40, 
-	0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0, 
-	0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00, 
-	0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40, 
-	0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80, 
-	0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0, 
-	0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, 
-	0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70, 
-	0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x5d, 0xc0, 
-	0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xc8, 
-	0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xcc, 
-	0x2e, 0x08, 0x5d, 0xc4, 0x64, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd0, 0x9e, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x5d, 0xe8, 0x9e, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x94, 0x9c, 
-	0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0xa4, 
-	0x2e, 0x08, 0x94, 0xa8, 0x2e, 0x08, 0x5d, 0xd8, 
-	0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xec, 
-	0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, 
-	0x2e, 0x08, 0x5d, 0xf8, 0x2e, 0x08, 0x5d, 0xe0, 
-	0x2e, 0x08, 0x5d, 0xe4, 0x2e, 0x08, 0x60, 0x6c, 
-	0x2e, 0x08, 0x60, 0x70, 0x2e, 0x08, 0x5d, 0xfc, 
-	0x2e, 0x08, 0x5e, 0x00, 0x2e, 0x08, 0x5e, 0x2c, 
-	0x2e, 0x08, 0x5e, 0x04, 0x2e, 0x08, 0x5e, 0x08, 
-	0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x5e, 0x10, 
-	0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18, 
-	0x2e, 0x08, 0x5e, 0x1c, 0x2e, 0x08, 0x5e, 0x20, 
-	0x2e, 0x08, 0x5e, 0x24, 0x2e, 0x08, 0x5e, 0x28, 
-	0x2e, 0x08, 0x5d, 0xb0, 0x2e, 0x08, 0x5d, 0xb4, 
-	0x2e, 0x08, 0x7c, 0x44, 0x2e, 0x08, 0x5e, 0x54, 
-	0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x60, 0x74, 
-	0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, 
-	0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40, 
-	0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x5e, 0x38, 
-	0x2e, 0x08, 0x5e, 0x3c, 0x2e, 0x08, 0x7c, 0x40, 
-	0x2e, 0x08, 0x7c, 0x18, 0x2e, 0x08, 0x5e, 0x48, 
-	0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a, 
-	0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12, 
-	0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b, 
-	0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff, 
-	0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11, 
-	0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20, 
-	0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12, 
-	0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41, 
-	0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00, 
-	0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91, 
-	0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40, 
-	0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12, 
-	0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37, 
-	0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00, 
-	0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91, 
-	0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60, 
-	0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12, 
-	0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d, 
-	0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00, 
-	0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91, 
-	0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00, 
-	0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28, 
-	0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28, 
-	0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33, 
-	0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25, 
-	0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51, 
-	0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00, 
-	0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f, 
-	0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51, 
-	0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00, 
-	0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19, 
-	0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51, 
-	0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00, 
-	0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13, 
-	0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11, 
-	0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00, 
-	0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20, 
-	0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08, 
-	0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03, 
-	0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70, 
-	0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0x7c, 0x44, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x48, 
-	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, 
-	0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10, 
-	0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50, 
-	0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58, 
-	0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b, 
-	0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b, 
-	0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50, 
-	0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14, 
-	0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8, 
-	0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50, 
-	0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e, 
-	0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8, 
-	0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50, 
-	0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08, 
-	0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8, 
-	0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03, 
-	0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff, 
-	0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x44, 
-	0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36, 
-	0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20, 
-	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00, 
-	0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33, 
-	0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00, 
-	0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b, 
-	0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00, 
-	0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f, 
-	0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19, 
-	0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00, 
-	0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b, 
-	0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00, 
-	0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00, 
-	0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01, 
-	0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f, 
-	0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02, 
-	0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0, 
-	0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01, 
-	0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c, 
-	0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01, 
-	0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 
-	0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08, 
-	0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, 
-	0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, 
-	0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8, 
-	0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88, 
-	0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88, 
-	0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88, 
-	0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c, 
-	0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80, 
-	0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89, 
-	0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9, 
-	0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9, 
-	0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, 
-	0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89, 
-	0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49, 
-	0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08, 
-	0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89, 
-	0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68, 
-	0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66, 
-	0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21, 
-	0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62, 
-	0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08, 
-	0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49, 
-	0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9, 
-	0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09, 
-	0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57, 
-	0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d, 
-	0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19, 
-	0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08, 
-	0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00, 
-	0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10, 
-	0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48, 
-	0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 
-	0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49, 
-	0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04, 
-	0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e, 
-	0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 
-	0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8, 
-	0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 
-	0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 
-	0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80, 
-	0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03, 
-	0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20, 
-	0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa, 
-	0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48, 
-	0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09, 
-	0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f, 
-	0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff, 
-	0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08, 
-	0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20, 
-	0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09, 
-	0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, 
-	0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88, 
-	0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40, 
-	0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09, 
-	0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b, 
-	0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00, 
-	0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 
-	0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85, 
-	0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, 
-	0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x08, 
-	0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0x8b, 0xa8, 
-	0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x48, 0xfc, 0xb7, 0xff, 0xff, 
-	0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00, 
-	0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00, 
-	0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17, 
-	0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, 
-	0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00, 
-	0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, 
-	0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, 
-	0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef, 
-	0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, 
-	0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b, 
-	0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 
-	0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05, 
-	0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05, 
-	0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05, 
-	0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 
-	0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07, 
-	0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7, 
-	0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c, 
-	0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40, 
-	0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83, 
-	0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40, 
-	0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 
-	0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b, 
-	0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a, 
-	0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36, 
-	0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b, 
-	0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80, 
-	0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c, 
-	0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b, 
-	0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80, 
-	0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b, 
-	0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24, 
-	0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45, 
-	0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0, 
-	0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78, 
-	0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20, 
-	0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18, 
-	0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0, 
-	0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc, 
-	0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b, 
-	0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04, 
-	0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17, 
-	0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23, 
-	0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13, 
-	0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 
-	0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07, 
-	0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e, 
-	0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03, 
-	0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x5d, 0xd4, 0x66, 0x00, 0x00, 0x80, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00, 
-	0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, 
-	0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, 
-	0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82, 
-	0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69, 
-	0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 
-	0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62, 
-	0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 
-	0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 
-	0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02, 
-	0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a, 
-	0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 
-	0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd, 
-	0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02, 
-	0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, 
-	0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5, 
-	0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, 
-	0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02, 
-	0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01, 
-	0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08, 
-	0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51, 
-	0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40, 
-	0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18, 
-	0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1, 
-	0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01, 
-	0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 
-	0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 
-	0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08, 
-	0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, 
-	0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, 
-	0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06, 
-	0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, 
-	0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01, 
-	0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88, 
-	0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f, 
-	0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 
-	0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, 
-	0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 
-	0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15, 
-	0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 
-	0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01, 
-	0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 
-	0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01, 
-	0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 
-	0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 
-	0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02, 
-	0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 
-	0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, 
-	0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc, 
-	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82, 
-	0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44, 
-	0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
-	0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, 
-	0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 
-	0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4, 
-	0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4, 
-	0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, 
-	0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08, 
-	0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce, 
-	0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03, 
-	0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, 
-	0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04, 
-	0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, 
-	0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d, 
-	0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0, 
-	0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01, 
-	0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 
-	0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08, 
-	0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, 
-	0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, 
-	0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09, 
-	0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba, 
-	0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8, 
-	0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01, 
-	0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88, 
-	0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, 
-	0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49, 
-	0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b, 
-	0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60, 
-	0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09, 
-	0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00, 
-	0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, 
-	0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfd, 0xb0, 
-	0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c, 
-	0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 
-	0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07, 
-	0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33, 
-	0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3, 
-	0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45, 
-	0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 
-	0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc, 
-	0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 
-	0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40, 
-	0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 
-	0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90, 
-	0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82, 
-	0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01, 
-	0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, 
-	0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, 
-	0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83, 
-	0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 
-	0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a, 
-	0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33, 
-	0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00, 
-	0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30, 
-	0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b, 
-	0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80, 
-	0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65, 
-	0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60, 
-	0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08, 
-	0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47, 
-	0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21, 
-	0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00, 
-	0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80, 
-	0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, 
-	0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, 
-	0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01, 
-	0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48, 
-	0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 
-	0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10, 
-	0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c, 
-	0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 
-	0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08, 
-	0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17, 
-	0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09, 
-	0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02, 
-	0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01, 
-	0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
-	0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff, 
-	0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b, 
-	0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 
-	0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80, 
-	0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01, 
-	0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80, 
-	0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40, 
-	0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
-	0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48, 
-	0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04, 
-	0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
-	0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16, 
-	0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09, 
-	0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12, 
-	0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00, 
-	0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3, 
-	0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09, 
-	0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06, 
-	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04, 
-	0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 
-	0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, 
-	0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 
-	0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc, 
-	0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80, 
-	0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0, 
-	0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20, 
-	0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff, 
-	0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 
-	0x40, 0x88, 0xf0, 0x05, 0xfc, 0x45, 0x20, 0x00, 
-	0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01, 
-	0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00, 
-	0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59, 
-	0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01, 
-	0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80, 
-	0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 
-	0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 
-	0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 
-	0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80, 
-	0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 
-	0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b, 
-	0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, 
-	0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09, 
-	0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff, 
-	0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00, 
-	0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49, 
-	0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09, 
-	0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 
-	0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03, 
-	0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20, 
-	0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0, 
-	0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b, 
-	0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81, 
-	0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 
-	0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09, 
-	0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40, 
-	0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 
-	0xf0, 0x05, 0xfb, 0xbe, 0x48, 0x1f, 0x68, 0x00, 
-	0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b, 
-	0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 
-	0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00, 
-	0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00, 
-	0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01, 
-	0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9, 
-	0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09, 
-	0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00, 
-	0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, 
-	0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 
-	0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x8c, 
-	0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
-	0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, 
-	0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b, 
-	0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff, 
-	0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02, 
-	0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, 
-	0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d, 
-	0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 
-	0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 
-	0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00, 
-	0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03, 
-	0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22, 
-	0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, 
-	0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01, 
-	0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, 
-	0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24, 
-	0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08, 
-	0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 
-	0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f, 
-	0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13, 
-	0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b, 
-	0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04, 
-	0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3, 
-	0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0, 
-	0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac, 
-	0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, 
-	0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80, 
-	0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03, 
-	0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08, 
-	0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15, 
-	0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb, 
-	0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4, 
-	0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00, 
-	0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05, 
-	0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 
-	0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2, 
-	0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 
-	0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02, 
-	0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9, 
-	0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 
-	0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd, 
-	0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2, 
-	0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 
-	0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 
-	0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06, 
-	0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b, 
-	0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00, 
-	0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02, 
-	0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01, 
-	0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00, 
-	0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00, 
-	0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18, 
-	0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02, 
-	0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80, 
-	0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01, 
-	0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19, 
-	0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30, 
-	0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 
-	0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18, 
-	0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00, 
-	0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98, 
-	0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0, 
-	0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00, 
-	0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08, 
-	0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82, 
-	0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01, 
-	0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80, 
-	0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73, 
-	0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40, 
-	0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a, 
-	0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b, 
-	0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c, 
-	0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10, 
-	0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00, 
-	0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00, 
-	0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, 
-	0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18, 
-	0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b, 
-	0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66, 
-	0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d, 
-	0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30, 
-	0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b, 
-	0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30, 
-	0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b, 
-	0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d, 
-	0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33, 
-	0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00, 
-	0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01, 
-	0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b, 
-	0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b, 
-	0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30, 
-	0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55, 
-	0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30, 
-	0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98, 
-	0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64, 
-	0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01, 
-	0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01, 
-	0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46, 
-	0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 
-	0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48, 
-	0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40, 
-	0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38, 
-	0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 
-	0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 
-	0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d, 
-	0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06, 
-	0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, 
-	0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0, 
-	0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b, 
-	0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28, 
-	0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f, 
-	0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, 
-	0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52, 
-	0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03, 
-	0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00, 
-	0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29, 
-	0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b, 
-	0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18, 
-	0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, 
-	0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00, 
-	0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80, 
-	0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, 
-	0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 
-	0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00, 
-	0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01, 
-	0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01, 
-	0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, 
-	0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04, 
-	0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00, 
-	0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80, 
-	0x2e, 0x08, 0x7c, 0x44, 0x9e, 0x00, 0x0a, 0x00, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff, 
-	0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c, 
-	0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08, 
-	0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc, 
-	0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03, 
-	0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04, 
-	0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70, 
-	0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa, 
-	0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f, 
-	0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05, 
-	0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18, 
-	0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16, 
-	0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09, 
-	0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05, 
-	0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f, 
-	0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01, 
-	0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c, 
-	0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02, 
-	0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00, 
-	0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00, 
-	0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7, 
-	0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07, 
-	0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09, 
-	0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05, 
-	0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01, 
-	0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70, 
-	0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80, 
-	0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d, 
-	0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08, 
-	0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03, 
-	0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x90, 
-	0x2e, 0x08, 0x94, 0x94, 0x2e, 0x08, 0x94, 0x98, 
-	0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21, 
-	0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 
-	0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c, 
-	0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, 
-	0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8, 
-	0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00, 
-	0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01, 
-	0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f, 
-	0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25, 
-	0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01, 
-	0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c, 
-	0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08, 
-	0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa, 
-	0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01, 
-	0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24, 
-	0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4, 
-	0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0xcc, 
-	0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x94, 0x84, 
-	0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00, 
-	0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92, 
-	0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 
-	0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9, 
-	0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b, 
-	0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, 
-	0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce, 
-	0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5, 
-	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
-	0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 
-	0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0, 
-	0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19, 
-	0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa, 
-	0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9, 
-	0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad, 
-	0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, 
-	0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00, 
-	0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01, 
-	0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9, 
-	0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, 
-	0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 
-	0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65, 
-	0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f, 
-	0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9, 
-	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12, 
-	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
-	0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12, 
-	0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa, 
-	0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35, 
-	0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37, 
-	0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12, 
-	0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c, 
-	0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, 
-	0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79, 
-	0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, 
-	0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, 
-	0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00, 
-	0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19, 
-	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
-	0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, 
-	0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d, 
-	0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92, 
-	0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08, 
-	0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa, 
-	0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13, 
-	0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10, 
-	0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01, 
-	0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 
-	0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x60, 0x84, 
-	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xb0, 
-	0x2e, 0x08, 0x85, 0x54, 0x2e, 0x08, 0x7d, 0xb4, 
-	0x2e, 0x08, 0x8c, 0xec, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x94, 0x94, 0x00, 0x00, 0x16, 0xc8, 
-	0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x94, 0x88, 0x68, 0x00, 0x0d, 0x00, 
-	0x2e, 0x08, 0x94, 0x84, 0xb5, 0x90, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, 
-	0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78, 
-	0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b, 
-	0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06, 
-	0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80, 
-	0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02, 
-	0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8, 
-	0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b, 
-	0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11, 
-	0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee, 
-	0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, 
-	0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5, 
-	0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 
-	0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04, 
-	0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x90, 
-	0x2e, 0x08, 0x94, 0x98, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c, 
-	0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01, 
-	0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, 
-	0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, 
-	0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, 
-	0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x98, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39, 
-	0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39, 
-	0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04, 
-	0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6, 
-	0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06, 
-	0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, 
-	0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b, 
-	0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05, 
-	0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31, 
-	0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28, 
-	0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x98, 
-	0x2e, 0x08, 0x94, 0x90, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 
-	0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78, 
-	0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10, 
-	0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, 
-	0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, 
-	0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x94, 0x98, 0xb4, 0xb0, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01, 
-	0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01, 
-	0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01, 
-	0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a, 
-	0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc, 
-	0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c, 
-	0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00, 
-	0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, 
-	0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70, 
-	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00, 
-	0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, 
-	0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00, 
-	0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18, 
-	0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa, 
-	0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, 
-	0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, 
-	0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d, 
-	0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, 
-	0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b, 
-	0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07, 
-	0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15, 
-	0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19, 
-	0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29, 
-	0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89, 
-	0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89, 
-	0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9, 
-	0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79, 
-	0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, 
-	0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01, 
-	0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00, 
-	0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01, 
-	0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79, 
-	0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9, 
-	0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00, 
-	0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09, 
-	0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, 
-	0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79, 
-	0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9, 
-	0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b, 
-	0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91, 
-	0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78, 
-	0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11, 
-	0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9, 
-	0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19, 
-	0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11, 
-	0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09, 
-	0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70, 
-	0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, 
-	0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06, 
-	0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04, 
-	0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00, 
-	0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8, 
-	0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf, 
-	0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8, 
-	0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54, 
-	0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 
-	0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 
-	0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 
-	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc, 
-	0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60, 
-	0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 
-	0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00, 
-	0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0, 
-	0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf, 
-	0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07, 
-	0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf, 
-	0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, 
-	0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 
-	0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88, 
-	0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c, 
-	0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 
-	0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 
-	0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e, 
-	0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 
-	0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22, 
-	0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00, 
-	0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, 
-	0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10, 
-	0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25, 
-	0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01, 
-	0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 
-	0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 
-	0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 
-	0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 
-	0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8, 
-	0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01, 
-	0x2e, 0x08, 0x7d, 0x94, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, 
-	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 
-	0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00, 
-	0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 
-	0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 
-	0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42, 
-	0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94, 
-	0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, 
-	0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 
-	0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 
-	0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 
-	0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
-	0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 
-	0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 
-	0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 
-	0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00, 
-	0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 
-	0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0, 
-	0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, 
-	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 
-	0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 
-	0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
-	0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 
-	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
-	0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0x94, 0xb4, 0x90, 0x1c, 0x02, 
-	0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d, 
-	0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08, 
-	0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, 
-	0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09, 
-	0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80, 
-	0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, 
-	0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01, 
-	0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19, 
-	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x8c, 
-	0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48, 
-	0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca, 
-	0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b, 
-	0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80, 
-	0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
-	0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54, 
-	0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07, 
-	0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07, 
-	0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, 
-	0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, 
-	0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0, 
-	0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, 
-	0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 
-	0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0, 
-	0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00, 
-	0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 
-	0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa, 
-	0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80, 
-	0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48, 
-	0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1, 
-	0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90, 
-	0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07, 
-	0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13, 
-	0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, 
-	0x2e, 0x08, 0x94, 0x90, 0xb4, 0xf0, 0x1c, 0x01, 
-	0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07, 
-	0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b, 
-	0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02, 
-	0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00, 
-	0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00, 
-	0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb, 
-	0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b, 
-	0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02, 
-	0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, 
-	0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05, 
-	0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b, 
-	0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b, 
-	0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01, 
-	0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8, 
-	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x7c, 0x58, 0xb4, 0x80, 0x1c, 0x01, 
-	0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02, 
-	0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00, 
-	0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3, 
-	0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b, 
-	0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00, 
-	0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf, 
-	0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a, 
-	0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03, 
-	0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40, 
-	0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, 
-	0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00, 
-	0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0, 
-	0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02, 
-	0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04, 
-	0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85, 
-	0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50, 
-	0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa, 
-	0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9, 
-	0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, 
-	0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0, 
-	0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 
-	0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00, 
-	0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40, 
-	0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58, 
-	0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e, 
-	0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01, 
-	0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8, 
-	0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f, 
-	0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08, 
-	0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00, 
-	0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00, 
-	0xf0, 0x0c, 0xff, 0xe0, 0x1c, 0x06, 0x1c, 0x38, 
-	0x21, 0x01, 0xf0, 0x0c, 0xff, 0xdb, 0x90, 0x00, 
-	0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50, 
-	0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e, 
-	0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, 
-	0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00, 
-	0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00, 
-	0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02, 
-	0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13, 
-	0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5, 
-	0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00, 
-	0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00, 
-	0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48, 
-	0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18, 
-	0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
-	0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x9c, 
-	0x2e, 0x08, 0x94, 0xa0, 0x6a, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, 
-	0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00, 
-	0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9, 
-	0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10, 
-	0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10, 
-	0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00, 
-	0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0, 
-	0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07, 
-	0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01, 
-	0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 
-	0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
-	0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33, 
-	0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04, 
-	0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17, 
-	0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08, 
-	0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15, 
-	0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01, 
-	0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f, 
-	0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33, 
-	0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2, 
-	0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x0c, 
-	0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01, 
-	0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00, 
-	0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b, 
-	0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb, 
-	0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01, 
-	0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3, 
-	0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13, 
-	0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70, 
-	0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62, 
-	0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff, 
-	0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00, 
-	0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05, 
-	0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12, 
-	0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10, 
-	0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x7c, 0x48, 
-	0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 
-	0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, 
-	0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, 
-	0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, 
-	0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, 
-	0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, 
-	0xfa, 0x07, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02, 
-	0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 
-	0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 
-	0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 
-	0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c, 
-	0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59, 
-	0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02, 
-	0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe9, 0x42, 0x9a, 
-	0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, 
-	0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, 
-	0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, 
-	0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00, 
-	0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20, 
-	0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a, 
-	0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70, 
-	0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70, 
-	0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, 
-	0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07, 
-	0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03, 
-	0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7, 
-	0x07, 0x83, 0xd1, 0x17, 0x3a, 0x10, 0xd3, 0x05, 
-	0xb4, 0xb0, 0xc9, 0xb8, 0xc0, 0xb8, 0x3a, 0x10, 
-	0xd2, 0xfb, 0xbc, 0xb0, 0x32, 0x0c, 0xd3, 0x0f, 
-	0xc9, 0x08, 0xc0, 0x08, 0x1f, 0x12, 0xd2, 0xfb, 
-	0xe0, 0x0a, 0xc9, 0x08, 0x70, 0xc3, 0x0a, 0x1b, 
-	0x70, 0x83, 0x0a, 0x1b, 0x70, 0x43, 0x0a, 0x1b, 
-	0x70, 0x03, 0x1d, 0x00, 0x1f, 0x12, 0xd2, 0xf4, 
-	0x1c, 0xd2, 0xd3, 0x05, 0x78, 0x0b, 0x70, 0x03, 
-	0x1c, 0x49, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xf9, 
-	0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x43, 0x0b, 
-	0x43, 0x13, 0x07, 0x9b, 0xd1, 0x04, 0x1f, 0x12, 
-	0x58, 0x8b, 0x50, 0x83, 0xd1, 0xfb, 0x47, 0x70, 
-	0x1e, 0x52, 0x5c, 0x8b, 0x54, 0x83, 0xd1, 0xfb, 
-	0x47, 0x70, 0x00, 0x00, 0x42, 0x41, 0x46, 0x8c, 
-	0x07, 0x83, 0xd0, 0x05, 0x78, 0x03, 0x2b, 0x00, 
-	0xd0, 0x16, 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, 
-	0x49, 0x0a, 0xc8, 0x04, 0x09, 0xc9, 0x1a, 0x53, 
-	0x43, 0x93, 0x01, 0xc9, 0x40, 0x0b, 0xd0, 0xf8, 
-	0x1f, 0x00, 0x0e, 0x13, 0xd0, 0x08, 0x1c, 0x40, 
-	0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40, 
-	0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40, 
-	0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80, 
-	0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52, 
-	0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83, 
-	0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b, 
-	0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b, 
-	0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2, 
-	0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc, 
-	0x46, 0x60, 0x47, 0x70, 0x46, 0x84, 0x1c, 0x03, 
-	0x43, 0x0b, 0x07, 0x9b, 0xd1, 0x15, 0x1f, 0x12, 
-	0xd3, 0x0b, 0xb4, 0xb0, 0x4c, 0x10, 0x01, 0xe5, 
-	0xc9, 0x80, 0x1b, 0x3b, 0x43, 0xbb, 0x40, 0x2b, 
-	0xd1, 0x0f, 0xc0, 0x80, 0x1f, 0x12, 0xd2, 0xf7, 
-	0xbc, 0xb0, 0x1c, 0xd2, 0xd3, 0x11, 0x78, 0x0b, 
-	0x70, 0x03, 0x1c, 0x49, 0x1c, 0x40, 0x2b, 0x00, 
-	0xd0, 0x09, 0x1e, 0x52, 0xd2, 0xf7, 0x46, 0x60, 
-	0x47, 0x70, 0xbc, 0xb0, 0x1f, 0x09, 0x1c, 0xd2, 
-	0xe7, 0xf1, 0x70, 0x03, 0x1c, 0x40, 0x1e, 0x52, 
-	0xd2, 0xfb, 0x46, 0x60, 0x47, 0x70, 0x00, 0x00, 
-	0x01, 0x01, 0x01, 0x01, 0x1c, 0x02, 0x43, 0x0a, 
-	0x07, 0x92, 0xd1, 0x13, 0x46, 0x84, 0xb4, 0x30, 
-	0x4c, 0x0c, 0x01, 0xe5, 0xe0, 0x00, 0xc0, 0x04, 
-	0xc9, 0x04, 0x1b, 0x13, 0x43, 0x93, 0x40, 0x2b, 
-	0xd0, 0xf9, 0xe0, 0x01, 0x02, 0x12, 0x1c, 0x40, 
-	0x0e, 0x13, 0x70, 0x03, 0xd1, 0xfa, 0xbc, 0x30, 
-	0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x78, 0x0a, 
-	0x70, 0x1a, 0x1c, 0x49, 0x1c, 0x5b, 0x2a, 0x00, 
-	0xd1, 0xf9, 0x47, 0x70, 0x01, 0x01, 0x01, 0x01, 
-	0xb5, 0x80, 0x00, 0x43, 0x15, 0x5f, 0x43, 0xff, 
-	0x1c, 0x02, 0x0f, 0xc0, 0x07, 0xc0, 0x2f, 0x00, 
-	0xd0, 0x15, 0x43, 0x0b, 0xd0, 0x0c, 0x28, 0x00, 
-	0xd1, 0x07, 0x1c, 0x10, 0xf0, 0x00, 0xf9, 0x00, 
-	0xf0, 0x00, 0xf9, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x1c, 0x10, 0xe0, 0x11, 
-	0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x98, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x03, 0x13, 
-	0x43, 0x0b, 0xd1, 0x05, 0x28, 0x00, 0xd1, 0x03, 
-	0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x82, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, 
-	0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, 
-	0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, 
-	0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, 
-	0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, 
-	0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, 
-	0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 
-	0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, 
-	0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, 
-	0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, 
-	0x01, 0x01, 0x01, 0x01, 0x47, 0x78, 0x00, 0x00, 
-	0xe2, 0x10, 0xc1, 0x02, 0x12, 0x60, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x03, 0xa0, 0x10, 0x00, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x8c, 0xc1, 0x01, 
-	0xe3, 0x8c, 0xc6, 0x1e, 0xe1, 0xb0, 0x28, 0x20, 
-	0x01, 0xa0, 0x08, 0x00, 0x02, 0x4c, 0xc4, 0x01, 
-	0xe1, 0xb0, 0x2c, 0x20, 0x01, 0xa0, 0x04, 0x00, 
-	0x02, 0x4c, 0xc5, 0x02, 0xe1, 0xb0, 0x2e, 0x20, 
-	0x01, 0xa0, 0x02, 0x00, 0x02, 0x4c, 0xc5, 0x01, 
-	0xe1, 0xb0, 0x2f, 0x20, 0x01, 0xa0, 0x01, 0x00, 
-	0x02, 0x4c, 0xc6, 0x02, 0xe1, 0xb0, 0x2f, 0xa0, 
-	0x01, 0xa0, 0x00, 0x80, 0x02, 0x4c, 0xc6, 0x01, 
-	0xe1, 0xa0, 0x00, 0x80, 0xe1, 0xa0, 0x1a, 0x00, 
-	0xe1, 0x8c, 0x06, 0x20, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x22, 0x01, 0x07, 0xd2, 0x40, 0x50, 0x47, 0x70, 
-	0xe2, 0x20, 0x01, 0x02, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x00, 0x40, 0x08, 0x40, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, 
-	0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, 
-	0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, 
-	0x3a, 0x00, 0x00, 0x12, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x0c, 
-	0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x18, 
-	0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, 
-	0xea, 0x00, 0x01, 0x09, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x02, 
-	0xe1, 0xb0, 0x20, 0x82, 0x33, 0xa0, 0x00, 0x01, 
-	0x23, 0xa0, 0x00, 0x00, 0x03, 0x33, 0x00, 0x00, 
-	0x03, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, 
-	0x8a, 0x00, 0x00, 0xf9, 0xe1, 0xb0, 0x20, 0x82, 
-	0x23, 0xa0, 0x00, 0x00, 0x21, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x83, 0xa0, 0x00, 0x01, 
-	0x93, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x28, 
-	0xe8, 0xac, 0x7f, 0xff, 0xe2, 0x8f, 0x00, 0x0c, 
-	0xe2, 0x4c, 0x10, 0x3c, 0xe2, 0x4e, 0xe0, 0x04, 
-	0xe5, 0x8c, 0xe0, 0x00, 0xea, 0x00, 0x01, 0x91, 
-	0x80, 0x00, 0x00, 0x20, 0x44, 0x69, 0x76, 0x69, 
-	0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 
-	0x72, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x50, 
-	0xb5, 0xf0, 0xb0, 0x8f, 0xf0, 0x00, 0xfd, 0x01, 
-	0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x0f, 0xf0, 0x00, 
-	0xfd, 0x3b, 0x90, 0x03, 0x91, 0x04, 0x92, 0x05, 
-	0xa3, 0x3e, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x00, 0xfd, 0xae, 0x49, 0x3d, 0x22, 0x00, 
-	0x4f, 0x3d, 0x28, 0x00, 0xd0, 0x0a, 0x48, 0x3d, 
-	0xab, 0x03, 0xf0, 0x00, 0xfd, 0xfb, 0x90, 0x0c, 
-	0x91, 0x0d, 0x92, 0x0e, 0xaa, 0x03, 0xca, 0x07, 
-	0x1c, 0x3b, 0xe0, 0x08, 0x48, 0x38, 0xab, 0x03, 
-	0x3e, 0x01, 0xf0, 0x00, 0xfd, 0xef, 0x90, 0x0c, 
-	0x91, 0x0d, 0x92, 0x0e, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xfe, 0x03, 0x1c, 0x3b, 0xf0, 0x00, 0xfd, 0xe6, 
-	0xab, 0x0c, 0xf0, 0x00, 0xfe, 0x17, 0x90, 0x09, 
-	0x91, 0x0a, 0x92, 0x0b, 0xf0, 0x00, 0xfe, 0x48, 
-	0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 0x4a, 0x2d, 
-	0xb4, 0x04, 0x23, 0x03, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfe, 0x5b, 0x90, 0x01, 0x91, 0x02, 0x92, 0x03, 
-	0xb0, 0x01, 0x4a, 0x29, 0xb4, 0x04, 0x23, 0x03, 
-	0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfe, 0x65, 0xb0, 0x01, 0x46, 0x6b, 0xf0, 0x00, 
-	0xfd, 0xf9, 0xab, 0x09, 0xf0, 0x00, 0xfd, 0xdc, 
-	0xab, 0x09, 0xf0, 0x00, 0xfd, 0xbf, 0x2e, 0x00, 
-	0xd0, 0x2c, 0xb0, 0x86, 0xab, 0x0c, 0xc3, 0x07, 
-	0x1c, 0x30, 0xf0, 0x00, 0xfe, 0x69, 0x1c, 0x0c, 
-	0x1c, 0x05, 0x1c, 0x17, 0x4b, 0x1b, 0x1c, 0x1e, 
-	0xf0, 0x00, 0xfd, 0xca, 0x90, 0x03, 0x91, 0x04, 
-	0x92, 0x05, 0xab, 0x0c, 0xf0, 0x00, 0xfd, 0xaa, 
-	0x90, 0x06, 0x91, 0x07, 0x92, 0x08, 0xab, 0x03, 
-	0xf0, 0x00, 0xfe, 0x86, 0xab, 0x0c, 0xf0, 0x00, 
-	0xfe, 0x83, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 
-	0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 0x1d, 0xf3, 
-	0x33, 0x05, 0xf0, 0x00, 0xfd, 0xb1, 0x46, 0x6b, 
-	0xf0, 0x00, 0xfd, 0x94, 0xab, 0x06, 0xf0, 0x00, 
-	0xfd, 0x91, 0xb0, 0x06, 0xb0, 0x0f, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x3f, 0xe6, 0xa0, 0x9e, 
-	0x66, 0x7f, 0x3b, 0xcd, 0x80, 0x00, 0x00, 0x00, 
-	0x2e, 0x03, 0x3b, 0x10, 0x80, 0x00, 0x3f, 0xff, 
-	0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x3a, 0xbc, 
-	0x2e, 0x03, 0x3a, 0xe0, 0x2e, 0x03, 0x3a, 0xa4, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80, 
-	0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03, 
-	0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c, 
-	0xe2, 0x53, 0x3b, 0x0f, 0x4a, 0x00, 0x00, 0x13, 
-	0x12, 0x83, 0xc0, 0x01, 0x13, 0x5c, 0x0b, 0x02, 
-	0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0xc5, 0xa2, 
-	0x2a, 0x00, 0x00, 0x58, 0xe1, 0x80, 0x0a, 0x03, 
-	0xe3, 0xc1, 0x11, 0x02, 0xe1, 0x80, 0x05, 0xa1, 
-	0xe1, 0x8c, 0x1a, 0x81, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x40, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x33, 0x00, 0x00, 
-	0x13, 0xa0, 0x33, 0x19, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x93, 0x30, 0x34, 0x0a, 0x00, 0x00, 0x31, 
-	0x42, 0x00, 0x01, 0x02, 0x43, 0xa0, 0x10, 0x00, 
-	0x43, 0xa0, 0x30, 0x00, 0x41, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x53, 0x30, 0x20, 0x0a, 0x00, 0x00, 0x13, 
-	0xba, 0x00, 0x00, 0x1a, 0xe1, 0xb0, 0xc3, 0x12, 
-	0x4a, 0x00, 0x00, 0x05, 0xe2, 0x63, 0xc0, 0x20, 
-	0xe1, 0x80, 0x0c, 0x31, 0xe1, 0xa0, 0x2c, 0x32, 
-	0xe1, 0x82, 0x13, 0x11, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x96, 0xc0, 0x8c, 
-	0xe2, 0x63, 0xc0, 0x20, 0xe1, 0x80, 0x0c, 0x31, 
-	0xe1, 0xa0, 0x2c, 0x32, 0xe1, 0x82, 0x13, 0x11, 
-	0xe3, 0xa0, 0x30, 0x00, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, 
-	0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x32, 0x01, 0x02, 
-	0x41, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, 
-	0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x83, 0x30, 0x20, 0xe1, 0xb0, 0xc3, 0x11, 
-	0x4a, 0x00, 0x00, 0x04, 0xe2, 0x63, 0xc0, 0x20, 
-	0xe1, 0xa0, 0x1c, 0x31, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x3c, 0x01, 0x02, 0x01, 0x92, 0xc0, 0x06, 
-	0xe2, 0x63, 0xc0, 0x20, 0xe1, 0xa0, 0x1c, 0x31, 
-	0x03, 0x11, 0x00, 0x01, 0x12, 0x81, 0x10, 0x01, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x31, 0x01, 0x02, 0x03, 0x32, 0x00, 0x00, 
-	0x03, 0xa0, 0x10, 0x00, 0x13, 0xa0, 0x10, 0x01, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x10, 0x02, 0x02, 0x1a, 0x00, 0x00, 0x0b, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x31, 0x00, 0x00, 
-	0x11, 0xb0, 0x10, 0x81, 0x43, 0xe0, 0x00, 0x00, 
-	0x41, 0x2f, 0xff, 0x1e, 0x03, 0x32, 0x00, 0x00, 
-	0x13, 0xa0, 0x34, 0x61, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x00, 0x01, 0x02, 0xe3, 0x80, 0x02, 0x07, 
-	0xe3, 0x80, 0x06, 0xff, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xc1, 0x11, 0x02, 0xe1, 0xa0, 0xcb, 0x02, 
-	0xe1, 0x9c, 0xc0, 0x06, 0xe2, 0x00, 0xc1, 0x02, 
-	0xe1, 0xa0, 0x0a, 0x03, 0xe1, 0x80, 0x05, 0xa1, 
-	0xe1, 0xa0, 0x1a, 0x81, 0xe1, 0x81, 0x15, 0xa2, 
-	0xe3, 0xa0, 0x30, 0x00, 0x0a, 0x00, 0x00, 0x06, 
-	0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, 
-	0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, 
-	0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, 
-	0x01, 0x80, 0x00, 0x0c, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, 
-	0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, 
-	0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe3, 0xa0, 0x20, 0x01, 0xea, 0x00, 0x00, 0x01, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x20, 0x02, 
-	0xe2, 0x00, 0x31, 0x02, 0xe5, 0x9f, 0x00, 0x18, 
-	0xe5, 0x80, 0x20, 0x00, 0xe3, 0x31, 0x00, 0x00, 
-	0x03, 0xa0, 0x00, 0x00, 0x15, 0x9f, 0x00, 0x0c, 
-	0x18, 0x90, 0x00, 0x03, 0xe1, 0x80, 0x00, 0x03, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xb0, 
-	0x2e, 0x08, 0x20, 0xbc, 0xe3, 0x10, 0x06, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e, 
-	0xea, 0x00, 0x00, 0x0a, 0xe3, 0x12, 0x07, 0x02, 
-	0x0a, 0x00, 0x00, 0x08, 0xe1, 0x5c, 0x00, 0x80, 
-	0x83, 0xa0, 0x00, 0x00, 0x81, 0x2f, 0xff, 0x1e, 
-	0x03, 0x51, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x07, 0x02, 
-	0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x04, 0xee, 
-	0xe1, 0x2f, 0xff, 0x1f, 0xea, 0x00, 0x00, 0x3e, 
-	0xe5, 0x9f, 0x04, 0x5c, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x20, 
-	0xe3, 0xa0, 0x10, 0x01, 0xef, 0x12, 0x34, 0x56, 
-	0xe5, 0x9f, 0x04, 0x48, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x05, 0xe5, 0x90, 0x10, 0x00, 
-	0xe5, 0x9f, 0x04, 0x3c, 0xe5, 0x90, 0x30, 0x00, 
-	0xe5, 0x9f, 0x04, 0x38, 0xe5, 0x90, 0xd0, 0x00, 
-	0xea, 0x00, 0x00, 0x0b, 0xe3, 0xa0, 0x00, 0x16, 
-	0xe5, 0x9f, 0x44, 0x18, 0xe2, 0x84, 0x20, 0xa8, 
-	0xe2, 0x84, 0x10, 0xa4, 0xe5, 0x81, 0x20, 0x00, 
-	0xef, 0x12, 0x34, 0x56, 0xe2, 0x84, 0x00, 0xa8, 
-	0xe5, 0x90, 0xd0, 0x08, 0xe5, 0x90, 0x30, 0x04, 
-	0xe5, 0x90, 0x10, 0x00, 0xe3, 0x51, 0x00, 0x00, 
-	0x05, 0x9f, 0x14, 0x04, 0xe2, 0x8f, 0x00, 0x10, 
-	0xeb, 0x00, 0x00, 0x36, 0xe5, 0x9f, 0x03, 0xfc, 
-	0xe5, 0x9f, 0x33, 0xfc, 0xeb, 0x00, 0x00, 0x12, 
-	0xea, 0x00, 0x00, 0x4e, 0x2e, 0x00, 0x04, 0x04, 
-	0x2e, 0x03, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x1c, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x1c, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1c, 
-	0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x1c, 0x02, 0x1c, 0x13, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x13, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x13, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x13, 
-	0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0x44, 
-	0xe8, 0x8c, 0xff, 0xff, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0xac, 0x00, 0x80, 0x0e, 0x09, 
-	0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 
-	0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 
-	0x6c, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x6f, 
-	0x6e, 0x20, 0x61, 0x20, 0x54, 0x68, 0x75, 0x6d, 
-	0x62, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 
-	0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 
-	0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x50, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x73, 0x08, 0xe5, 0x87, 0x00, 0x00, 
-	0xe2, 0x8f, 0x50, 0xc9, 0xe2, 0x85, 0x5c, 0x02, 
-	0xe5, 0x87, 0x50, 0x10, 0xe2, 0x8f, 0x50, 0xe9, 
-	0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x14, 
-	0xe1, 0xa0, 0x80, 0x0e, 0xe2, 0x87, 0x00, 0x04, 
-	0xeb, 0x00, 0x02, 0x39, 0xe9, 0x2d, 0x01, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xc7, 0x00, 0x2c, 
-	0xe2, 0x87, 0x00, 0x04, 0xeb, 0x00, 0x00, 0xce, 
-	0xe3, 0xa0, 0x40, 0x00, 0xe2, 0x8d, 0x00, 0x04, 
-	0xe5, 0x97, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe5, 0xc7, 0x30, 0x2e, 0xe2, 0x81, 0x30, 0x08, 
-	0xe8, 0x91, 0x00, 0x06, 0xe5, 0x9f, 0xc2, 0xcc, 
-	0xeb, 0xff, 0xff, 0xb7, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe3, 0xa0, 0x80, 0x01, 0xea, 0x00, 0x00, 0x01, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x70, 0x00, 0xeb, 0x00, 0x02, 0x31, 
-	0xe1, 0xa0, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x0d, 
-	0xe1, 0xa0, 0x20, 0x07, 0xe3, 0x52, 0x00, 0x00, 
-	0x12, 0x8f, 0x00, 0x08, 0x15, 0x9f, 0x10, 0x00, 
-	0xeb, 0x00, 0x0c, 0x6d, 0x41, 0x42, 0x45, 0x58, 
-	0x00, 0x80, 0x0e, 0x06, 0x52, 0x65, 0x74, 0x75, 
-	0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 
-	0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 
-	0x65, 0x00, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x32, 0x60, 
-	0xeb, 0xff, 0xff, 0xa9, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc2, 0x28, 0xe5, 0xdc, 0x00, 0x2c, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x30, 0x00, 
-	0xe5, 0x9f, 0x12, 0x14, 0xe4, 0x81, 0xf0, 0x04, 
-	0xe8, 0xb3, 0x00, 0x04, 0xe8, 0xa1, 0x00, 0x04, 
-	0xe4, 0xd3, 0x20, 0x01, 0xe4, 0xc1, 0x20, 0x01, 
-	0xe3, 0x52, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0xa0, 0x80, 0x01, 0xeb, 0xff, 0xff, 0xf2, 
-	0xe5, 0x9f, 0x71, 0xe8, 0xe5, 0xd7, 0x20, 0x2f, 
-	0xe3, 0x52, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x2c, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xc7, 0x20, 0x2f, 
-	0xeb, 0x00, 0x00, 0x3b, 0xe1, 0xa0, 0x10, 0x08, 
-	0xeb, 0x00, 0x01, 0xfa, 0xe3, 0x50, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x1b, 0xe2, 0x88, 0xb0, 0x40, 
-	0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef, 
-	0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef, 
-	0xe5, 0x9f, 0x71, 0xa8, 0xe5, 0x97, 0x40, 0xa0, 
-	0xe3, 0x84, 0x40, 0x80, 0xe1, 0x21, 0xf0, 0x04, 
-	0xe1, 0xa0, 0xd0, 0x0c, 0xe1, 0xa0, 0xb0, 0x04, 
-	0xe5, 0x9f, 0x01, 0x8c, 0xe5, 0x90, 0x00, 0x04, 
-	0xe1, 0xa0, 0x10, 0x0d, 0xeb, 0x00, 0x02, 0x1a, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe5, 0xc7, 0x10, 0x2f, 
-	0xe1, 0xa0, 0x10, 0x0d, 0xe3, 0x54, 0x00, 0x10, 
-	0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x17, 
-	0xef, 0x12, 0x34, 0x56, 0xe3, 0x21, 0xf0, 0x93, 
-	0xe1, 0xa0, 0x00, 0x00, 0xe2, 0x81, 0xe0, 0x3c, 
-	0xe9, 0x5e, 0x7f, 0xff, 0xe1, 0xa0, 0x00, 0x00, 
-	0xe8, 0xde, 0x80, 0x00, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0x2a, 0x00, 0x80, 0x0e, 0x07, 
-	0x4e, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 
-	0x20, 0x66, 0x6f, 0x72, 0x20, 0x54, 0x72, 0x61, 
-	0x70, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 
-	0x72, 0x00, 0x00, 0x00, 0xe2, 0x8f, 0x00, 0x00, 
-	0xea, 0x00, 0x0c, 0x20, 0x00, 0x80, 0x0e, 0x00, 
-	0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 
-	0x65, 0x20, 0x54, 0x72, 0x61, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc1, 0x04, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xcc, 0x00, 0x2f, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x00, 0xf0, 0xe5, 0x90, 0x00, 0x00, 
-	0xe5, 0x90, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x00, 0xdc, 
-	0xe2, 0x80, 0x00, 0x04, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0xcc, 
-	0xe3, 0x50, 0x0b, 0x02, 0x33, 0xa0, 0x0b, 0x02, 
-	0xe2, 0x8c, 0xc0, 0x04, 0xe9, 0x9c, 0x00, 0x0c, 
-	0xe0, 0x53, 0x31, 0x00, 0x21, 0x53, 0x00, 0x02, 
-	0x3a, 0x00, 0x00, 0x03, 0xe5, 0x81, 0x20, 0x00, 
-	0xe0, 0x82, 0x21, 0x00, 0xe5, 0x8c, 0x20, 0x04, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x50, 0x03, 
-	0xe1, 0xa0, 0x10, 0x0c, 0xeb, 0x00, 0x00, 0x44, 
-	0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0d, 
-	0xe5, 0x9d, 0xc0, 0x08, 0xe9, 0x9c, 0x40, 0x04, 
-	0xe1, 0x5e, 0x00, 0x01, 0x10, 0x4e, 0x30, 0x02, 
-	0xe0, 0x81, 0xe0, 0x00, 0x11, 0xa0, 0x00, 0x02, 
-	0x11, 0xa0, 0x20, 0x01, 0xe9, 0x8c, 0x40, 0x04, 
-	0x13, 0x53, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x03, 
-	0xe8, 0xbd, 0x50, 0x03, 0xe5, 0x81, 0x00, 0x00, 
-	0xe1, 0xa0, 0x01, 0x43, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe8, 0xbd, 0x50, 0x03, 0xe9, 0x9c, 0x00, 0x0c, 
-	0xe0, 0x43, 0x00, 0x02, 0xe1, 0xb0, 0x01, 0x40, 
-	0x03, 0xa0, 0x20, 0x00, 0x15, 0x8c, 0x30, 0x04, 
-	0xe5, 0x81, 0x20, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe2, 0x80, 0x20, 0x03, 
-	0xe3, 0xc2, 0x20, 0x03, 0xe5, 0x9f, 0xc0, 0x24, 
-	0xe2, 0x8c, 0xc0, 0x08, 0xe8, 0x9c, 0x00, 0x03, 
-	0xe0, 0x90, 0x20, 0x02, 0x31, 0x52, 0x00, 0x01, 
-	0x35, 0x8c, 0x20, 0x00, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xcc, 
-	0x2e, 0x08, 0x20, 0x98, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x5d, 0xa4, 0x2e, 0x02, 0x5d, 0xa0, 
-	0x2e, 0x02, 0x5d, 0x9c, 0x2e, 0x08, 0x99, 0xfc, 
-	0x2e, 0x00, 0x1c, 0x39, 0x2e, 0x01, 0xa1, 0x35, 
-	0x2e, 0x01, 0x9f, 0xe9, 0x2e, 0x01, 0xa0, 0xa9, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 
-	0xe5, 0x90, 0x00, 0x00, 0xe2, 0x00, 0x04, 0xff, 
-	0xe3, 0x50, 0x04, 0xea, 0x03, 0xa0, 0x00, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe2, 0x40, 0x0b, 0x05, 
-	0xe3, 0x50, 0x0b, 0x1b, 0x33, 0xa0, 0x00, 0x01, 
-	0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe2, 0x8f, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 
-	0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x00, 0x42, 0x72, 0x61, 0x6e, 
-	0x63, 0x68, 0x20, 0x54, 0x68, 0x72, 0x6f, 0x75, 
-	0x67, 0x68, 0x20, 0x5a, 0x65, 0x72, 0x6f, 0x00, 
-	0x00, 0x02, 0x00, 0x01, 0x55, 0x6e, 0x64, 0x65, 
-	0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x49, 0x6e, 
-	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 
-	0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 
-	0x64, 0x20, 0x53, 0x57, 0x49, 0x20, 0x49, 0x6e, 
-	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 
-	0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 
-	0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x04, 0x44, 0x61, 0x74, 0x61, 
-	0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x05, 0x41, 0x64, 0x64, 0x72, 
-	0x65, 0x73, 0x73, 0x20, 0x45, 0x78, 0x63, 0x65, 
-	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x00, 0x06, 0x55, 0x6e, 0x68, 0x61, 
-	0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x49, 0x6e, 
-	0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 
-	0x00, 0x02, 0x00, 0x07, 0x55, 0x6e, 0x68, 0x61, 
-	0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x46, 0x61, 
-	0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 
-	0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0x99, 0x2c, 0x2e, 0x01, 0x99, 0x44, 
-	0x2e, 0x01, 0x99, 0x60, 0x2e, 0x01, 0x99, 0x80, 
-	0x2e, 0x01, 0x99, 0x94, 0x2e, 0x01, 0x99, 0xa4, 
-	0x2e, 0x01, 0x99, 0xbc, 0x2e, 0x01, 0x99, 0xd4, 
-	0xe2, 0x4f, 0x20, 0x28, 0xe7, 0x92, 0x01, 0x00, 
-	0xea, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xf0, 0x00, 
-	0xf8, 0x04, 0xbc, 0x08, 0x60, 0x1a, 0xbc, 0x08, 
-	0x47, 0x18, 0x47, 0x78, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x60, 
-	0x03, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe1, 0xa0, 0x2a, 0xa0, 0xe1, 0xc0, 0x0a, 0x82, 
-	0xe1, 0xa0, 0x00, 0x60, 0xe3, 0x32, 0x00, 0x00, 
-	0xe2, 0x42, 0x2c, 0x03, 0xe2, 0x42, 0x20, 0xfe, 
-	0x0a, 0x00, 0x00, 0x06, 0xe3, 0x80, 0x04, 0x3f, 
-	0xe3, 0x80, 0x06, 0x0e, 0xe2, 0x22, 0x3b, 0x01, 
-	0xe3, 0x33, 0x00, 0x01, 0x11, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfe, 0x39, 
-	0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xa0, 0x06, 0x00, 
-	0xe2, 0x42, 0x20, 0x01, 0xe1, 0xb0, 0x00, 0x80, 
-	0x4a, 0x00, 0x00, 0x02, 0xe1, 0xb0, 0x10, 0x81, 
-	0x23, 0x80, 0x0a, 0x01, 0xea, 0xff, 0xff, 0xf9, 
-	0xe1, 0xa0, 0x04, 0xc0, 0xe3, 0xc0, 0x05, 0x01, 
-	0xe1, 0x8c, 0x01, 0x20, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0xc0, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x35, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x83, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x0a, 0x00, 0x00, 0x02, 
-	0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0xd1, 0x11, 0x02, 
-	0x0a, 0x00, 0x00, 0x15, 0xe1, 0xb0, 0x38, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x03, 0xa0, 0xc0, 0x10, 
-	0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x8c, 0xc0, 0x08, 
-	0xe1, 0xb0, 0x3e, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x8c, 0xc0, 0x02, 
-	0xe1, 0xb0, 0x3f, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x8c, 0xc0, 0x01, 0xe2, 0x6c, 0x30, 0x20, 
-	0xe1, 0x81, 0x13, 0x32, 0xe1, 0xa0, 0x2c, 0x12, 
-	0xe0, 0x40, 0x00, 0x0c, 0xe2, 0x80, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0x38, 0x22, 
-	0x01, 0xa0, 0x28, 0x02, 0x03, 0xa0, 0xc0, 0x10, 
-	0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x22, 
-	0x01, 0xa0, 0x24, 0x02, 0x02, 0x8c, 0xc0, 0x08, 
-	0xe1, 0xb0, 0x3e, 0x22, 0x01, 0xa0, 0x22, 0x02, 
-	0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x22, 
-	0x01, 0xa0, 0x21, 0x02, 0x02, 0x8c, 0xc0, 0x02, 
-	0xe1, 0xb0, 0x3f, 0xa2, 0x01, 0xa0, 0x20, 0x82, 
-	0x02, 0x8c, 0xc0, 0x01, 0xe1, 0xa0, 0x10, 0x02, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x40, 0x00, 0x1f, 
-	0xe0, 0x40, 0x00, 0x0c, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, 
-	0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, 
-	0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, 
-	0x3a, 0x00, 0x00, 0x11, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xf2, 
-	0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, 
-	0xea, 0xff, 0xfd, 0xef, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe8, 
-	0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00, 
-	0x83, 0xa0, 0x00, 0x01, 0x93, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe0, 
-	0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01, 
-	0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x00, 
-	0x83, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, 
-	0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x02, 0x30, 
-	0xeb, 0x00, 0x03, 0x38, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x86, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe8, 0x93, 0x00, 0x38, 0xe3, 0x10, 0x01, 0x01, 
-	0x03, 0x13, 0x01, 0x01, 0x1a, 0x00, 0x00, 0x03, 
-	0xeb, 0x00, 0x03, 0x5e, 0xeb, 0x00, 0x03, 0x2b, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x4f, 0xe0, 0x14, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xea, 0x00, 0x03, 0xf8, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0xd1, 0xc0, 0x80, 
-	0x41, 0xd4, 0xc0, 0x83, 0x5a, 0x00, 0x00, 0x04, 
-	0xe3, 0xa0, 0xb0, 0x04, 0xeb, 0x00, 0x04, 0x3f, 
-	0xeb, 0x00, 0x03, 0x1c, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x08, 0xe3, 0x10, 0x01, 0x01, 
-	0x03, 0x13, 0x01, 0x01, 0x02, 0x4f, 0xe0, 0x24, 
-	0xe3, 0xa0, 0xb0, 0x04, 0x0a, 0x00, 0x05, 0x5b, 
-	0xe0, 0x23, 0x00, 0x00, 0xe2, 0x00, 0x01, 0x02, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x14, 0x01, 0x02, 0x03, 0xa0, 0x34, 0x62, 
-	0x13, 0xa0, 0x34, 0x61, 0xea, 0x00, 0x02, 0x9d, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0x40, 0x01, 
-	0xe1, 0xa0, 0x50, 0x02, 0xe3, 0x10, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0x35, 
-	0xeb, 0x00, 0x03, 0x02, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x03, 0xcf, 
-	0xb4, 0x77, 0x46, 0x76, 0x1e, 0x5d, 0x9b, 0x06, 
-	0x1c, 0x1c, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x8c, 
-	0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x6e, 
-	0x46, 0x6b, 0xf7, 0xff, 0xff, 0x85, 0x1e, 0x6d, 
-	0xd1, 0xf6, 0xb0, 0x03, 0x46, 0xb6, 0xbc, 0x70, 
-	0x47, 0x70, 0x00, 0x00, 0xb4, 0x77, 0x46, 0x76, 
-	0x1e, 0x5d, 0x9b, 0x06, 0x1c, 0x1c, 0x34, 0x0c, 
-	0xf7, 0xff, 0xff, 0x5c, 0x46, 0x6b, 0xf7, 0xff, 
-	0xff, 0x73, 0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff, 
-	0xff, 0x55, 0x1e, 0x6d, 0xd1, 0xf6, 0xb0, 0x03, 
-	0x46, 0xb6, 0xbc, 0x70, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0x10, 0x00, 
-	0xe2, 0x00, 0x01, 0x02, 0x42, 0x61, 0x10, 0x00, 
-	0xe3, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x80, 0x09, 0x01, 0xe3, 0x80, 0x00, 0x1e, 
-	0xe1, 0xb0, 0xc8, 0x21, 0x01, 0xa0, 0x18, 0x01, 
-	0x02, 0x40, 0x00, 0x10, 0xe1, 0xb0, 0xcc, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x40, 0x00, 0x08, 
-	0xe1, 0xb0, 0xce, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x40, 0x00, 0x04, 0xe1, 0xb0, 0xcf, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x40, 0x00, 0x02, 
-	0xe1, 0xb0, 0xcf, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x40, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe8, 0x93, 0x00, 0x38, 0xe2, 0x23, 0x31, 0x02, 
-	0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x01, 0xbe, 
-	0xeb, 0x00, 0x02, 0xc6, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x14, 
-	0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe1, 0xa0, 0x20, 0x01, 0xe8, 0x80, 0x00, 0x0e, 
-	0xe5, 0x9f, 0xc0, 0x38, 0xe5, 0x8c, 0xd0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0x20, 0x28, 0xe5, 0x92, 0x20, 0x00, 
-	0xe5, 0x91, 0x40, 0x2c, 0xe5, 0x91, 0xc0, 0x34, 
-	0xe1, 0x5c, 0x00, 0x02, 0x23, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9c, 0xd0, 0x00, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x2e, 0x08, 0x21, 0x90, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0xc0, 0xe4, 
-	0xe5, 0x9c, 0x00, 0x00, 0xe3, 0x50, 0x00, 0x00, 
-	0xe3, 0xa0, 0x00, 0x04, 0x15, 0x8c, 0x00, 0x04, 
-	0x0b, 0x00, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0xcc, 
-	0xea, 0xff, 0xfd, 0x6b, 0xe3, 0xa0, 0x10, 0x0a, 
-	0xe3, 0x50, 0x01, 0x02, 0x13, 0x50, 0x01, 0x06, 
-	0x13, 0x50, 0x01, 0x16, 0x03, 0xa0, 0x10, 0x03, 
-	0xe3, 0x50, 0x01, 0x0a, 0x13, 0x50, 0x01, 0x0e, 
-	0x03, 0xa0, 0x10, 0x05, 0xe5, 0x9f, 0x20, 0xa8, 
-	0xe1, 0x50, 0x00, 0x02, 0xe2, 0x82, 0x20, 0xff, 
-	0x21, 0x52, 0x00, 0x00, 0x23, 0xa0, 0x10, 0x02, 
-	0xe3, 0x50, 0x01, 0x82, 0x03, 0xa0, 0x10, 0x02, 
-	0xe3, 0x50, 0x01, 0x86, 0x03, 0xa0, 0x10, 0x07, 
-	0xe5, 0x9f, 0x20, 0x88, 0xe0, 0x50, 0x20, 0x02, 
-	0x13, 0x52, 0x00, 0x01, 0x03, 0xa0, 0x10, 0x05, 
-	0xe1, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x02, 
-	0xe1, 0xa0, 0x30, 0x00, 0xeb, 0xff, 0xff, 0xe4, 
-	0xe8, 0xbd, 0x40, 0x02, 0xe5, 0x9f, 0xc0, 0x50, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xcc, 0x20, 0x00, 
-	0xe9, 0x2d, 0x00, 0x0a, 0xeb, 0xff, 0xff, 0xdc, 
-	0xea, 0x00, 0x00, 0x09, 0x47, 0x78, 0x00, 0x00, 
-	0xe5, 0x9f, 0xc0, 0x30, 0xe3, 0xa0, 0x10, 0x00, 
-	0xe5, 0x8c, 0x10, 0x00, 0xe5, 0x9c, 0x00, 0x04, 
-	0xe3, 0x50, 0x00, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe5, 0x8c, 0x10, 0x04, 0xea, 0xff, 0xff, 0xd2, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0xc0, 0x0d, 
-	0xe9, 0x2d, 0xd9, 0xf0, 0xe2, 0x4c, 0xb0, 0x04, 
-	0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfd, 0x88, 
-	0x2e, 0x08, 0x20, 0xb4, 0x2e, 0x08, 0x20, 0xc6, 
-	0x2e, 0x01, 0xb5, 0xe1, 0x80, 0x00, 0x02, 0x00, 
-	0x80, 0x80, 0x0e, 0xa0, 0xb5, 0xff, 0xa6, 0x23, 
-	0xa5, 0x22, 0xa4, 0x22, 0x68, 0x5a, 0x68, 0x1f, 
-	0x4b, 0x21, 0x60, 0x5a, 0x23, 0x00, 0x4a, 0x21, 
-	0x70, 0x13, 0x70, 0x53, 0x70, 0x93, 0x4a, 0x20, 
-	0x2a, 0x00, 0xd0, 0x02, 0x9a, 0x02, 0xf7, 0xff, 
-	0xff, 0xfe, 0x48, 0x1e, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1c, 0x28, 0x00, 
-	0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1b, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfc, 0xb2, 
-	0x48, 0x19, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x48, 0x18, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x01, 0xfb, 0x18, 0x48, 0x16, 0x28, 0x00, 
-	0xd0, 0x01, 0xf0, 0x01, 0xfc, 0x89, 0x48, 0x15, 
-	0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 
-	0xf7, 0xff, 0xff, 0xa0, 0x48, 0x12, 0x28, 0x00, 
-	0xd0, 0x04, 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x22, 
-	0xf0, 0x01, 0xfe, 0xa6, 0x2f, 0x00, 0xd0, 0x01, 
-	0xf7, 0xfe, 0xfd, 0xcc, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x3a, 0x74, 0x74, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb9, 0x91, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0x71, 
-	0x2e, 0x01, 0xb9, 0x5d, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xbd, 0xb5, 0xb5, 0x90, 0x28, 0x00, 
-	0xd0, 0x04, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xff, 0xfe, 0x4f, 0x10, 0x68, 0x78, 
-	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0x94, 
-	0x20, 0x00, 0x60, 0x78, 0x4f, 0x0d, 0x78, 0x78, 
-	0x24, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x70, 0x7c, 
-	0x48, 0x0b, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x78, 0xb8, 0x28, 0x00, 0xd1, 0x05, 
-	0x70, 0xbc, 0x48, 0x08, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x01, 0xfe, 0xb2, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xbe, 0x55, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x21, 0x01, 0x1c, 0x17, 
-	0xf0, 0x01, 0xfa, 0xbc, 0x21, 0x00, 0x1c, 0x20, 
-	0xf0, 0x01, 0xfa, 0xb8, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x01, 0xfa, 0xb4, 0x20, 0x01, 0xf7, 0xff, 
-	0xfa, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf1, 0x20, 0x00, 0xb0, 0x89, 0x90, 0x06, 
-	0x26, 0x00, 0x90, 0x05, 0x20, 0x01, 0x90, 0x04, 
-	0x27, 0x00, 0x20, 0x00, 0x90, 0x03, 0x90, 0x02, 
-	0x25, 0x00, 0x90, 0x01, 0xf0, 0x01, 0xfb, 0xe2, 
-	0x1c, 0x04, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x17, 
-	0x49, 0xe3, 0x5d, 0xe0, 0x5c, 0x08, 0x08, 0x40, 
-	0xd3, 0x06, 0x37, 0x01, 0x5d, 0xe0, 0x5c, 0x08, 
-	0x08, 0x40, 0xd2, 0xfa, 0xe0, 0x00, 0x37, 0x01, 
-	0x5d, 0xe0, 0x5c, 0x0a, 0x08, 0x52, 0xd2, 0x01, 
-	0x28, 0x00, 0xd1, 0xf8, 0x98, 0x04, 0x30, 0x01, 
-	0x90, 0x04, 0x5d, 0xe0, 0x28, 0x00, 0xd1, 0xe8, 
-	0x98, 0x04, 0x00, 0x80, 0xf0, 0x01, 0xfc, 0x16, 
-	0x4b, 0xd6, 0x93, 0x08, 0x60, 0x18, 0x1c, 0x78, 
-	0xf0, 0x01, 0xfc, 0x10, 0x9b, 0x08, 0x60, 0x58, 
-	0x48, 0xd3, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0xfe, 0x21, 0x00, 0x20, 0x00, 0x90, 0x04, 
-	0x48, 0xd0, 0x90, 0x07, 0x78, 0x27, 0x34, 0x01, 
-	0x2e, 0x00, 0xd1, 0x58, 0x2f, 0x22, 0xd0, 0x01, 
-	0x2f, 0x27, 0xd1, 0x02, 0x97, 0x05, 0x1c, 0x3e, 
-	0xe0, 0x93, 0x98, 0x06, 0x42, 0x81, 0xd1, 0x4e, 
-	0x98, 0x03, 0x28, 0x00, 0xd1, 0x4b, 0x25, 0x00, 
-	0x43, 0xed, 0x1c, 0x2a, 0x95, 0x01, 0x22, 0x00, 
-	0xab, 0x00, 0x70, 0x1a, 0x70, 0x5a, 0x1e, 0x60, 
-	0x78, 0x02, 0x2a, 0x30, 0xdb, 0x04, 0x2a, 0x39, 
-	0xdc, 0x02, 0x30, 0x01, 0x1f, 0xd5, 0x3d, 0x29, 
-	0x78, 0x02, 0x2a, 0x3e, 0xd0, 0x01, 0x2a, 0x3c, 
-	0xd1, 0x35, 0x2a, 0x3e, 0xd1, 0x0e, 0x22, 0x77, 
-	0xab, 0x00, 0x70, 0x1a, 0x2d, 0x00, 0xd0, 0x63, 
-	0x2d, 0x02, 0xdc, 0x62, 0x78, 0x42, 0x30, 0x01, 
-	0x2a, 0x3e, 0xd1, 0x13, 0x22, 0x61, 0x70, 0x1a, 
-	0x30, 0x01, 0xe0, 0x0f, 0x30, 0x01, 0x1c, 0x02, 
-	0xe0, 0x02, 0x2b, 0x3e, 0xd0, 0x56, 0x32, 0x01, 
-	0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x2b, 0x20, 
-	0xd1, 0xf7, 0x2d, 0x00, 0xdc, 0x4d, 0x22, 0x72, 
-	0xab, 0x00, 0x70, 0x1a, 0x78, 0x02, 0x2a, 0x26, 
-	0xd1, 0x24, 0x23, 0x01, 0x42, 0xdd, 0xd0, 0x19, 
-	0x2d, 0x00, 0xdd, 0x5e, 0x78, 0x42, 0x30, 0x01, 
-	0x2a, 0x30, 0xdb, 0x5b, 0x2a, 0x32, 0xdc, 0x3c, 
-	0x30, 0x01, 0x1c, 0x2b, 0xd5, 0x04, 0x07, 0xdb, 
-	0x0f, 0xdb, 0x42, 0x5b, 0xe0, 0x02, 0xe0, 0x42, 
-	0x07, 0xdb, 0x0f, 0xdb, 0x33, 0x31, 0x42, 0x9a, 
-	0xd1, 0x63, 0x22, 0x00, 0xab, 0x00, 0x70, 0x1a, 
-	0x95, 0x01, 0xe0, 0x11, 0x22, 0x02, 0x92, 0x01, 
-	0xaa, 0x00, 0x78, 0x12, 0x30, 0x01, 0x2a, 0x72, 
-	0xd0, 0x09, 0xe0, 0x06, 0x23, 0x01, 0x42, 0xdd, 
-	0xd1, 0x06, 0xaa, 0x00, 0x78, 0x12, 0x2a, 0x72, 
-	0xd0, 0x01, 0x25, 0x01, 0xe0, 0x00, 0x25, 0x00, 
-	0xaa, 0x00, 0x78, 0x12, 0x2a, 0x00, 0xd0, 0x16, 
-	0x22, 0x01, 0x92, 0x03, 0x4a, 0x8c, 0x78, 0x03, 
-	0x5c, 0xd3, 0x08, 0x5b, 0xd3, 0x04, 0x78, 0x43, 
-	0x5c, 0xd3, 0x30, 0x01, 0x08, 0x5b, 0xd2, 0xfa, 
-	0x78, 0x02, 0x2a, 0x22, 0xd0, 0x01, 0x2a, 0x27, 
-	0xd1, 0x0c, 0x30, 0x01, 0x1c, 0x16, 0xe0, 0x09, 
-	0xe0, 0x6a, 0xe0, 0xfb, 0xe0, 0x23, 0x78, 0x02, 
-	0x2a, 0x00, 0xd0, 0x03, 0x4b, 0x80, 0x5c, 0x9a, 
-	0x08, 0x52, 0xd3, 0x61, 0x22, 0x01, 0x92, 0x02, 
-	0x1c, 0x04, 0x78, 0x27, 0x34, 0x01, 0x2e, 0x00, 
-	0xd0, 0x15, 0x2f, 0x5c, 0xd1, 0x0b, 0x78, 0x20, 
-	0x28, 0x22, 0xd0, 0x03, 0x28, 0x5c, 0xd0, 0x01, 
-	0x28, 0x27, 0xd1, 0x04, 0x34, 0x01, 0x1c, 0x07, 
-	0xe0, 0x09, 0xe0, 0xdf, 0xe0, 0xde, 0x1c, 0x30, 
-	0x42, 0xb7, 0xd1, 0x04, 0x40, 0x7e, 0x78, 0x27, 
-	0x34, 0x01, 0x42, 0x87, 0xd0, 0xfa, 0x2f, 0x00, 
-	0xd0, 0x0c, 0x2e, 0x00, 0xd1, 0x03, 0x48, 0x6e, 
-	0x5d, 0xc0, 0x08, 0x40, 0xd2, 0x06, 0x1c, 0x08, 
-	0x9b, 0x08, 0x68, 0x5a, 0x54, 0x17, 0x31, 0x01, 
-	0xe0, 0x97, 0xe0, 0xc7, 0x98, 0x06, 0x42, 0x81, 
-	0xd1, 0x08, 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 
-	0x98, 0x02, 0x28, 0x00, 0xd0, 0x74, 0x98, 0x03, 
-	0x28, 0x00, 0xd1, 0x72, 0x22, 0x00, 0x1c, 0x08, 
-	0x9b, 0x08, 0x68, 0x5b, 0x54, 0x1a, 0x98, 0x02, 
-	0x31, 0x01, 0x28, 0x00, 0xd0, 0x6a, 0x98, 0x03, 
-	0x28, 0x00, 0xd0, 0x13, 0x01, 0xa8, 0x99, 0x07, 
-	0x18, 0x42, 0x9b, 0x08, 0x68, 0x58, 0x99, 0x06, 
-	0x18, 0x40, 0x46, 0x69, 0xf0, 0x01, 0xfc, 0x72, 
-	0x28, 0x00, 0xd1, 0x07, 0x9b, 0x08, 0x68, 0x58, 
-	0x99, 0x06, 0x18, 0x41, 0xa2, 0x58, 0xa0, 0x5e, 
-	0xf7, 0xff, 0xfe, 0xb6, 0x23, 0x01, 0x98, 0x01, 
-	0x42, 0xd8, 0xdd, 0x51, 0x98, 0x01, 0x28, 0x00, 
-	0xda, 0x03, 0x40, 0x18, 0x42, 0x40, 0xe0, 0x02, 
-	0xe0, 0x90, 0x07, 0xc0, 0x0f, 0xc0, 0x1c, 0x41, 
-	0x98, 0x01, 0xf0, 0x01, 0xfd, 0x61, 0x01, 0x80, 
-	0x99, 0x07, 0x18, 0x40, 0xf0, 0x01, 0xf9, 0xfc, 
-	0x28, 0x00, 0xd1, 0x3d, 0xb0, 0x82, 0x98, 0x03, 
-	0x01, 0x80, 0x99, 0x09, 0x18, 0x40, 0x90, 0x01, 
-	0x9a, 0x03, 0x2a, 0x00, 0xda, 0x03, 0x07, 0xd2, 
-	0x0f, 0xd2, 0x42, 0x52, 0xe0, 0x01, 0x07, 0xd2, 
-	0x0f, 0xd2, 0x01, 0x90, 0x99, 0x09, 0x18, 0x40, 
-	0x30, 0x40, 0x90, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0xf0, 0x01, 0xfa, 0xe0, 0x1c, 0x01, 0x23, 0xff, 
-	0x22, 0x01, 0x02, 0x52, 0x98, 0x01, 0x33, 0x01, 
-	0xf0, 0x01, 0xfd, 0x56, 0x98, 0x01, 0x68, 0xc0, 
-	0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 0x99, 0x01, 
-	0x60, 0xc8, 0x08, 0xd8, 0xf0, 0x01, 0xfa, 0xce, 
-	0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52, 
-	0x98, 0x00, 0x33, 0x01, 0xf0, 0x01, 0xfd, 0x44, 
-	0x98, 0x00, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb, 
-	0x43, 0x18, 0x99, 0x00, 0x60, 0xc8, 0xe0, 0x02, 
-	0xe0, 0x13, 0xe0, 0x12, 0xe0, 0x05, 0xb0, 0x02, 
-	0x20, 0x00, 0x90, 0x02, 0x90, 0x03, 0x99, 0x06, 
-	0xe0, 0x0b, 0x9b, 0x08, 0x68, 0x58, 0x9a, 0x06, 
-	0x18, 0x82, 0x98, 0x04, 0x1c, 0x43, 0x93, 0x04, 
-	0x00, 0x80, 0x9b, 0x08, 0x68, 0x1b, 0x50, 0x1a, 
-	0x91, 0x06, 0x2f, 0x00, 0xd0, 0x01, 0x26, 0x00, 
-	0x96, 0x05, 0x2f, 0x00, 0xd0, 0x00, 0xe6, 0x9d, 
-	0x2e, 0x00, 0xd0, 0x0a, 0xb0, 0x81, 0xab, 0x00, 
-	0x70, 0x1e, 0x22, 0x00, 0x70, 0x5a, 0x46, 0x69, 
-	0xa2, 0x24, 0xa0, 0x25, 0xf7, 0xff, 0xfe, 0x3c, 
-	0xb0, 0x01, 0x22, 0x00, 0x98, 0x04, 0x00, 0x80, 
-	0x9b, 0x08, 0x68, 0x19, 0x50, 0x0a, 0x98, 0x04, 
-	0x28, 0x00, 0xdd, 0x0f, 0x9b, 0x08, 0x68, 0x18, 
-	0x68, 0x01, 0x68, 0x09, 0x4b, 0x21, 0x40, 0x19, 
-	0xa2, 0x21, 0x68, 0x12, 0x42, 0x91, 0xd1, 0x05, 
-	0x9b, 0x04, 0x3b, 0x01, 0x93, 0x04, 0x30, 0x04, 
-	0x9b, 0x08, 0x60, 0x18, 0x9a, 0x09, 0x9b, 0x08, 
-	0x68, 0x19, 0x98, 0x04, 0xf7, 0xff, 0xf8, 0x0f, 
-	0xf7, 0xff, 0xf8, 0x88, 0x1e, 0x61, 0xa2, 0x19, 
-	0xa0, 0x19, 0xf7, 0xff, 0xfe, 0x15, 0xb0, 0x09, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x21, 0xac, 0x2e, 0x08, 0x21, 0x9c, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, 
-	0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, 0x00, 
-	0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x70, 
-	0x65, 0x6e, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00, 
-	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 
-	0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0xdf, 0xdf, 0xdf, 0xdf, 
-	0x52, 0x55, 0x4e, 0x00, 0x27, 0x0a, 0x00, 0x00, 
-	0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 
-	0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x69, 
-	0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x49, 
-	0x2f, 0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27, 
-	0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe1, 0xa0, 0x68, 0x80, 0xe0, 0x56, 0x88, 0x83, 
-	0xe0, 0x20, 0xe0, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe1, 0xa0, 0x38, 0xa6, 0x8a, 0x00, 0x00, 0x1a, 
-	0x01, 0xa0, 0x90, 0x08, 0x0a, 0x00, 0x00, 0x2e, 
-	0xe2, 0x68, 0x60, 0x00, 0xe1, 0xa0, 0x68, 0xa6, 
-	0xe0, 0x83, 0x30, 0x06, 0xe1, 0xa0, 0x92, 0xa6, 
-	0xe1, 0xc6, 0x62, 0x89, 0xe3, 0x59, 0x00, 0x02, 
-	0x33, 0x39, 0x00, 0x00, 0xe2, 0x66, 0x90, 0x20, 
-	0xe1, 0xa0, 0x89, 0x12, 0xe1, 0xa0, 0x26, 0x32, 
-	0xe1, 0x82, 0x29, 0x11, 0xe1, 0xa0, 0x16, 0x31, 
-	0x0a, 0x00, 0x00, 0x03, 0x11, 0x88, 0x81, 0x08, 
-	0x11, 0x82, 0x81, 0x28, 0x11, 0xa0, 0x20, 0x01, 
-	0x13, 0xa0, 0x10, 0x00, 0x3a, 0x00, 0x00, 0x04, 
-	0x21, 0x88, 0x80, 0x02, 0x21, 0x88, 0x81, 0x08, 
-	0x21, 0x81, 0x81, 0x28, 0x23, 0xa0, 0x20, 0x00, 
-	0x23, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x90, 0x00, 
-	0xea, 0x00, 0x00, 0x15, 0xe1, 0xa0, 0x68, 0xa8, 
-	0xe1, 0xa0, 0x82, 0xa6, 0xe1, 0xc6, 0x62, 0x88, 
-	0xe3, 0x58, 0x00, 0x02, 0x33, 0x38, 0x00, 0x00, 
-	0xe2, 0x66, 0x80, 0x20, 0xe1, 0xa0, 0x98, 0x15, 
-	0xe1, 0xa0, 0x56, 0x35, 0xe1, 0x85, 0x58, 0x14, 
-	0xe1, 0xa0, 0x46, 0x34, 0x0a, 0x00, 0x00, 0x03, 
-	0x11, 0x89, 0x91, 0x09, 0x11, 0x85, 0x91, 0x29, 
-	0x11, 0xa0, 0x50, 0x04, 0x13, 0xa0, 0x40, 0x00, 
-	0x3a, 0x00, 0x00, 0x04, 0x21, 0x89, 0x90, 0x05, 
-	0x21, 0x89, 0x91, 0x09, 0x21, 0x84, 0x91, 0x29, 
-	0x23, 0xa0, 0x50, 0x00, 0x23, 0xa0, 0x40, 0x00, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe3, 0x1e, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x09, 0xe0, 0x98, 0x60, 0x09, 
-	0xe0, 0xb2, 0x20, 0x05, 0xe0, 0xb1, 0x10, 0x04, 
-	0x38, 0xbd, 0x80, 0x00, 0xe2, 0x83, 0x30, 0x01, 
-	0xe1, 0xb0, 0x10, 0x61, 0xe1, 0xb0, 0x20, 0x62, 
-	0xe1, 0x86, 0x60, 0x86, 0xe1, 0xa0, 0x60, 0x66, 
-	0xe8, 0xbd, 0x80, 0x00, 0xe0, 0x58, 0x60, 0x09, 
-	0xe0, 0xd2, 0x20, 0x05, 0xe0, 0xd1, 0x10, 0x04, 
-	0x2a, 0x00, 0x00, 0x03, 0xe2, 0x20, 0x01, 0x02, 
-	0xe2, 0x76, 0x60, 0x00, 0xe2, 0xf2, 0x20, 0x00, 
-	0xe2, 0xe1, 0x10, 0x00, 0xe3, 0x11, 0x01, 0x02, 
-	0x18, 0xbd, 0x80, 0x00, 0xe0, 0x96, 0x60, 0x06, 
-	0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe3, 0x11, 0x01, 0x02, 
-	0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02, 
-	0x1b, 0x00, 0x06, 0x90, 0x18, 0xbd, 0x80, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, 
-	0xe2, 0x8d, 0xd0, 0x04, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x98, 0x83, 
-	0xe3, 0x79, 0x08, 0x02, 0x30, 0x09, 0x90, 0x04, 
-	0xe0, 0x19, 0x90, 0x83, 0xe1, 0xa0, 0x88, 0x80, 
-	0xe3, 0x78, 0x08, 0x02, 0x30, 0x08, 0x80, 0x01, 
-	0xe0, 0x18, 0x80, 0x80, 0x4a, 0x00, 0x00, 0x14, 
-	0xe3, 0x19, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x22, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe0, 0x11, 0x60, 0x80, 
-	0x43, 0xc1, 0x11, 0x02, 0x42, 0x80, 0x00, 0x01, 
-	0xe0, 0x14, 0x60, 0x83, 0x43, 0xc4, 0x41, 0x02, 
-	0x42, 0x83, 0x30, 0x01, 0xe3, 0x10, 0x01, 0x01, 
-	0x11, 0xb0, 0x68, 0x80, 0x1b, 0x00, 0x05, 0xf8, 
-	0xe3, 0x13, 0x01, 0x01, 0x11, 0xb0, 0x68, 0x83, 
-	0x1b, 0x00, 0x06, 0x2f, 0xeb, 0xff, 0xff, 0x8a, 
-	0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, 
-	0xe1, 0x91, 0xe0, 0x02, 0x1b, 0x00, 0x06, 0x6d, 
-	0xe8, 0xbd, 0x80, 0x00, 0xe3, 0x19, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, 
-	0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, 
-	0x1a, 0x00, 0x06, 0xb7, 0xe0, 0x23, 0x85, 0x0b, 
-	0xe0, 0x38, 0x80, 0x00, 0x52, 0x00, 0x81, 0x02, 
-	0x5a, 0x00, 0x00, 0x0a, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, 
-	0x1a, 0x00, 0x06, 0xc0, 0xe2, 0x00, 0x81, 0x02, 
-	0xea, 0x00, 0x00, 0x04, 0xe1, 0x95, 0x80, 0x84, 
-	0x1a, 0x00, 0x06, 0xb3, 0xe2, 0x03, 0x81, 0x02, 
-	0xe3, 0x1b, 0x06, 0x02, 0x12, 0x28, 0x81, 0x02, 
-	0xe3, 0x1b, 0x06, 0x01, 0x12, 0x28, 0x81, 0x02, 
-	0xe2, 0x8f, 0x00, 0x14, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe5, 0x9f, 0x20, 0x6c, 
-	0xe5, 0x92, 0x10, 0x00, 0xe1, 0xa0, 0xc1, 0x83, 
-	0xe1, 0xa0, 0xcd, 0xac, 0xe1, 0x81, 0x10, 0x0c, 
-	0xe5, 0x82, 0x10, 0x00, 0xe3, 0x13, 0x03, 0x01, 
-	0x1a, 0x00, 0x00, 0x05, 0xe3, 0x13, 0x04, 0x02, 
-	0x1a, 0x00, 0x00, 0x07, 0xe3, 0x11, 0x08, 0x01, 
-	0x0a, 0x00, 0x00, 0x44, 0xe2, 0x8f, 0x00, 0x54, 
-	0xea, 0x00, 0x00, 0x06, 0xe3, 0x11, 0x07, 0x01, 
-	0x0a, 0x00, 0x00, 0x34, 0xe2, 0x8f, 0x00, 0x74, 
-	0xea, 0x00, 0x00, 0x02, 0xe3, 0x11, 0x08, 0x02, 
-	0x0a, 0x00, 0x00, 0x30, 0xe2, 0x8f, 0x00, 0x8c, 
-	0xe5, 0x9f, 0x10, 0x1c, 0xe2, 0x4e, 0xe0, 0x04, 
-	0xe5, 0x81, 0xe0, 0x3c, 0xe3, 0xa0, 0xec, 0xde, 
-	0xe3, 0x8e, 0xe0, 0xad, 0xe1, 0x8e, 0xe8, 0x0e, 
-	0xe8, 0x81, 0x7f, 0xff, 0xea, 0x00, 0x00, 0x01, 
-	0x2e, 0x08, 0x22, 0xac, 0x2e, 0x08, 0x22, 0xb0, 
-	0xe5, 0x9f, 0xc1, 0x2c, 0xe3, 0x5c, 0x00, 0x00, 
-	0x11, 0x2f, 0xff, 0x1c, 0xe6, 0x00, 0x00, 0x10, 
-	0x80, 0x00, 0x02, 0x00, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x49, 0x6e, 
-	0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4f, 0x70, 
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 
-	0x80, 0x00, 0x02, 0x01, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4f, 0x76, 
-	0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x00, 
-	0x80, 0x00, 0x02, 0x02, 0x46, 0x6c, 0x6f, 0x61, 
-	0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69, 
-	0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 
-	0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x44, 0x69, 
-	0x76, 0x69, 0x64, 0x65, 0x20, 0x42, 0x79, 0x20, 
-	0x5a, 0x65, 0x72, 0x6f, 0x00, 0x00, 0x00, 0x00, 
-	0xe2, 0x00, 0x21, 0x02, 0xe3, 0x13, 0x07, 0x0f, 
-	0x1a, 0x00, 0x00, 0x13, 0xe3, 0x13, 0x05, 0x02, 
-	0x12, 0x8f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03, 
-	0x05, 0x9f, 0x00, 0x0c, 0xe1, 0x80, 0x00, 0x02, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x7f, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0xe3, 0x13, 0x07, 0x0f, 0x12, 0x00, 0x21, 0x02, 
-	0x1a, 0x00, 0x00, 0x07, 0xe3, 0x13, 0x05, 0x02, 
-	0x12, 0x8f, 0x00, 0x08, 0x18, 0x90, 0x00, 0x03, 
-	0x05, 0x9f, 0x00, 0x08, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0xe3, 0x13, 0x07, 0x02, 
-	0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x10, 0x00, 
-	0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x07, 0x01, 
-	0x13, 0xe0, 0x00, 0x00, 0x13, 0xe0, 0x10, 0x00, 
-	0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x06, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x11, 0x02, 
-	0x03, 0xa0, 0x01, 0x02, 0xe3, 0x32, 0x01, 0x02, 
-	0x11, 0xe0, 0x00, 0x00, 0x11, 0xe0, 0x10, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x01, 0x96, 0x91, 
-	0xe3, 0x10, 0x02, 0x06, 0x1a, 0x00, 0x00, 0x0d, 
-	0xe1, 0xb0, 0x80, 0x86, 0x0a, 0x00, 0x00, 0x0d, 
-	0x22, 0x92, 0x20, 0x01, 0x22, 0x91, 0x10, 0x01, 
-	0x23, 0xa0, 0x11, 0x02, 0xe2, 0xb3, 0x30, 0x00, 
-	0x4a, 0x00, 0x00, 0x0a, 0xe2, 0x83, 0xc0, 0x01, 
-	0xe3, 0xcc, 0xc1, 0x01, 0xe3, 0x5c, 0x09, 0x02, 
-	0xc3, 0xa0, 0x33, 0x19, 0xe2, 0x00, 0x01, 0x02, 
-	0xe1, 0x83, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x21, 0xb0, 0x80, 0xa2, 0xea, 0xff, 0xff, 0xef, 
-	0xe3, 0x11, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x04, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe2, 0x00, 0x01, 0x02, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xb0, 0xc8, 0x21, 
-	0x01, 0xa0, 0xc8, 0x22, 0x01, 0x8c, 0x18, 0x01, 
-	0x02, 0x83, 0x30, 0x10, 0xe1, 0xb0, 0xcc, 0x21, 
-	0x01, 0xa0, 0xcc, 0x22, 0x01, 0x8c, 0x14, 0x01, 
-	0x02, 0x83, 0x30, 0x08, 0xe1, 0xb0, 0xce, 0x21, 
-	0x01, 0xa0, 0xce, 0x22, 0x01, 0x8c, 0x12, 0x01, 
-	0x02, 0x83, 0x30, 0x04, 0xe1, 0xb0, 0xcf, 0x21, 
-	0x01, 0xa0, 0xcf, 0x22, 0x01, 0x8c, 0x11, 0x01, 
-	0x02, 0x83, 0x30, 0x02, 0xe1, 0xb0, 0xcf, 0xa1, 
-	0x01, 0xa0, 0xcf, 0xa2, 0x01, 0x8c, 0x10, 0x81, 
-	0x02, 0x83, 0x30, 0x01, 0xe1, 0xb0, 0x30, 0x03, 
-	0x4a, 0xff, 0xff, 0xe4, 0x5a, 0xff, 0xff, 0xda, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, 
-	0xe2, 0x43, 0x30, 0xfe, 0xe3, 0x32, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x5d, 0xe3, 0x35, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x3d, 0xe9, 0x2d, 0x48, 0x81, 
-	0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, 
-	0xe1, 0xa0, 0x68, 0x24, 0xe1, 0xc4, 0x88, 0x06, 
-	0xe0, 0x09, 0x06, 0x90, 0xe0, 0x06, 0x06, 0x97, 
-	0xe0, 0x07, 0x07, 0x98, 0xe0, 0x97, 0x78, 0x06, 
-	0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x90, 
-	0xe0, 0x97, 0x78, 0x08, 0xe0, 0xa9, 0x08, 0x28, 
-	0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, 
-	0xe1, 0xa0, 0x68, 0x25, 0xe1, 0xc5, 0x88, 0x06, 
-	0xe0, 0x09, 0x06, 0x9b, 0xe0, 0x06, 0x06, 0x9e, 
-	0xe0, 0x0e, 0x0e, 0x98, 0xe0, 0x9e, 0xe8, 0x06, 
-	0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x9b, 
-	0xe0, 0x9e, 0xe8, 0x08, 0xe0, 0xa9, 0xb8, 0x28, 
-	0xe0, 0x97, 0x70, 0x0b, 0xe2, 0xa0, 0x00, 0x00, 
-	0xe0, 0x97, 0xb0, 0x0e, 0xe0, 0xb7, 0x70, 0x00, 
-	0xe2, 0xa0, 0x00, 0x00, 0xe0, 0x51, 0x80, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x60, 0x00, 
-	0x31, 0xe0, 0x10, 0x01, 0x30, 0x44, 0x60, 0x05, 
-	0x10, 0x55, 0x90, 0x04, 0x03, 0xa0, 0x10, 0x00, 
-	0x31, 0xe0, 0x10, 0x01, 0x30, 0x46, 0x60, 0x08, 
-	0xe1, 0xa0, 0x48, 0x28, 0xe1, 0xc8, 0x58, 0x04, 
-	0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, 
-	0xe0, 0x22, 0x68, 0x94, 0xe0, 0x08, 0x08, 0x95, 
-	0xe0, 0x06, 0x05, 0x99, 0xe0, 0x96, 0x68, 0x08, 
-	0xe0, 0xa2, 0x28, 0x28, 0xe0, 0x09, 0x09, 0x94, 
-	0xe0, 0x96, 0x68, 0x09, 0xe0, 0xa2, 0x28, 0x29, 
-	0xe0, 0x9b, 0x60, 0x06, 0xe0, 0xb7, 0x20, 0x02, 
-	0xe0, 0xb0, 0x10, 0x01, 0xe1, 0x8e, 0xe1, 0x0e, 
-	0xe1, 0x86, 0x61, 0x2e, 0x48, 0xbd, 0x88, 0x81, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe8, 0xbd, 0x88, 0x81, 0xe1, 0xa0, 0x58, 0x24, 
-	0xe1, 0xc4, 0x68, 0x05, 0xe1, 0xa0, 0x88, 0x21, 
-	0xe1, 0xc1, 0x98, 0x08, 0xe0, 0x04, 0x08, 0x95, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x01, 0x06, 0x99, 
-	0xe0, 0x91, 0x18, 0x08, 0xe0, 0xa4, 0x48, 0x28, 
-	0xe0, 0x09, 0x09, 0x95, 0xe0, 0x91, 0x18, 0x09, 
-	0xe0, 0xa4, 0x48, 0x29, 0xe1, 0xa0, 0x88, 0x22, 
-	0xe1, 0xc2, 0x98, 0x08, 0xe0, 0x02, 0x08, 0x95, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, 
-	0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa2, 0x28, 0x28, 
-	0xe0, 0x09, 0x09, 0x95, 0xe0, 0x96, 0x68, 0x09, 
-	0xe0, 0xa2, 0x58, 0x29, 0xe0, 0x95, 0x20, 0x01, 
-	0xe2, 0xb4, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x35, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x24, 0xe1, 0xa0, 0x28, 0x21, 
-	0xe1, 0xc1, 0x68, 0x02, 0xe1, 0xa0, 0x88, 0x24, 
-	0xe1, 0xc4, 0x98, 0x08, 0xe0, 0x01, 0x08, 0x92, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x04, 0x06, 0x99, 
-	0xe0, 0x94, 0x48, 0x08, 0xe0, 0xa1, 0x18, 0x28, 
-	0xe0, 0x09, 0x09, 0x92, 0xe0, 0x94, 0x48, 0x09, 
-	0xe0, 0xa1, 0x18, 0x29, 0xe1, 0xa0, 0x88, 0x25, 
-	0xe1, 0xc5, 0x98, 0x08, 0xe0, 0x05, 0x08, 0x92, 
-	0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, 
-	0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa5, 0x58, 0x28, 
-	0xe0, 0x09, 0x09, 0x92, 0xe0, 0x96, 0x68, 0x09, 
-	0xe0, 0xa5, 0x28, 0x29, 0xe0, 0x92, 0x20, 0x04, 
-	0xe2, 0xb1, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, 
-	0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xc0, 0x81, 0x03, 
-	0xe3, 0xc3, 0x91, 0x03, 0xe0, 0x20, 0x00, 0x03, 
-	0xe2, 0x00, 0x01, 0x02, 0xe0, 0x88, 0x30, 0x09, 
-	0xe2, 0x43, 0x3c, 0x3f, 0xe2, 0x43, 0x30, 0xfe, 
-	0xe1, 0xa0, 0x58, 0x24, 0xe1, 0xc4, 0x68, 0x05, 
-	0xe1, 0xa0, 0x88, 0x21, 0xe1, 0xc1, 0x98, 0x08, 
-	0xe0, 0x01, 0x08, 0x95, 0xe0, 0x08, 0x08, 0x96, 
-	0xe0, 0x02, 0x06, 0x99, 0xe0, 0x92, 0x28, 0x08, 
-	0xe0, 0xa1, 0x18, 0x28, 0xe0, 0x09, 0x09, 0x95, 
-	0xe0, 0x92, 0x28, 0x09, 0xe0, 0xb1, 0x18, 0x29, 
-	0xe3, 0xa0, 0x60, 0x00, 0x41, 0xa0, 0xf0, 0x0e, 
-	0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, 
-	0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, 
-	0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, 
-	0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, 
-	0x4a, 0x00, 0x00, 0x1f, 0xe3, 0x19, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x2f, 0xe1, 0x91, 0x80, 0x02, 
-	0x11, 0x94, 0x80, 0x05, 0x0a, 0x00, 0x00, 0x13, 
-	0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, 
-	0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, 
-	0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, 
-	0xe2, 0x43, 0x30, 0xfe, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x04, 0xed, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x05, 0x04, 
-	0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xff, 0x44, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe3, 0xa0, 0x30, 0x00, 0xe3, 0xa0, 0x60, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x19, 0x01, 0x02, 
-	0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, 
-	0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, 
-	0x1a, 0x00, 0x05, 0x2d, 0xe0, 0x20, 0x80, 0x03, 
-	0xe2, 0x08, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x44, 
-	0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, 
-	0x1a, 0x00, 0x05, 0x36, 0xe1, 0x94, 0x80, 0x05, 
-	0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84, 
-	0x1a, 0x00, 0x05, 0x27, 0xe1, 0x91, 0x80, 0x02, 
-	0x1a, 0xff, 0xff, 0xef, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe1, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, 
-	0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, 
-	0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, 
-	0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, 
-	0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x48, 0x89, 
-	0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, 
-	0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, 
-	0xe2, 0x8f, 0x6e, 0x36, 0xe7, 0xd6, 0x64, 0x20, 
-	0xe0, 0x28, 0x66, 0x90, 0xe2, 0x68, 0x85, 0x02, 
-	0xe0, 0x06, 0x06, 0x98, 0xe1, 0xa0, 0x69, 0xa6, 
-	0xe2, 0x86, 0x60, 0x02, 0xe1, 0xa0, 0x86, 0xa1, 
-	0xe0, 0x29, 0x66, 0x98, 0xe2, 0x69, 0x92, 0x02, 
-	0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, 
-	0xe0, 0x02, 0x06, 0x99, 0xe0, 0x01, 0x06, 0x98, 
-	0xe0, 0x81, 0x68, 0x22, 0xe1, 0xa0, 0x63, 0x26, 
-	0xe1, 0xb0, 0x40, 0xa4, 0xe1, 0xb0, 0x50, 0x65, 
-	0x33, 0xa0, 0x30, 0x00, 0x23, 0xa0, 0x31, 0x02, 
-	0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, 
-	0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, 
-	0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, 
-	0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, 
-	0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, 
-	0xe1, 0xa0, 0x18, 0x09, 0xe1, 0xa0, 0x81, 0x24, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, 
-	0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, 
-	0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, 
-	0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, 
-	0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, 
-	0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, 
-	0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, 
-	0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x81, 0x11, 0x89, 
-	0xe5, 0x9d, 0x80, 0x0c, 0xe3, 0x18, 0x00, 0x01, 
-	0x1a, 0x00, 0x00, 0x94, 0xe1, 0xa0, 0x87, 0xa4, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x55, 0x50, 0x08, 
-	0xe0, 0x08, 0x09, 0x90, 0xe0, 0xc4, 0x40, 0x08, 
-	0xe0, 0x08, 0x0e, 0x99, 0xe0, 0x53, 0x38, 0x08, 
-	0xe0, 0xd5, 0x58, 0x28, 0xe0, 0x08, 0x07, 0x99, 
-	0x30, 0x45, 0x58, 0x08, 0x20, 0x55, 0x58, 0x08, 
-	0xe0, 0xc4, 0x48, 0x28, 0xe1, 0xa0, 0x2b, 0x09, 
-	0xe0, 0x81, 0x15, 0x29, 0xe1, 0xa0, 0x81, 0x24, 
-	0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, 
-	0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, 
-	0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, 
-	0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, 
-	0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, 
-	0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, 
-	0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, 
-	0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, 
-	0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x92, 0x24, 0x89, 
-	0xe2, 0xa1, 0x10, 0x00, 0xe5, 0x9d, 0x80, 0x0c, 
-	0xe3, 0x18, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x3f, 
-	0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, 
-	0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, 
-	0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, 
-	0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, 
-	0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, 
-	0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, 
-	0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, 
-	0xe1, 0xa0, 0x47, 0x04, 0xe1, 0x84, 0x49, 0x25, 
-	0xe1, 0xa0, 0x57, 0x05, 0xe1, 0x85, 0x59, 0x23, 
-	0xe1, 0xa0, 0x37, 0x03, 0xe1, 0xa0, 0x6e, 0x09, 
-	0xe0, 0x92, 0x22, 0x29, 0xe2, 0xa1, 0x10, 0x00, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe1, 0x94, 0x80, 0x05, 0x13, 0x86, 0x60, 0x01, 
-	0xe0, 0x96, 0x6e, 0x0e, 0xe2, 0xb2, 0x20, 0x00, 
-	0xe2, 0xb1, 0x10, 0x00, 0x48, 0xbd, 0x88, 0x89, 
-	0xe8, 0xbd, 0x48, 0x89, 0xe0, 0x96, 0x60, 0x06, 
-	0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xa4, 0x40, 0x04, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0xe0, 0xae, 0xe0, 0x0e, 0xe1, 0x84, 0x60, 0x05, 
-	0xe0, 0x92, 0x24, 0x8e, 0xe2, 0xb1, 0x10, 0x00, 
-	0x48, 0xbd, 0x88, 0x89, 0xe8, 0xbd, 0x48, 0x89, 
-	0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xa4, 0x40, 0x04, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x20, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, 
-	0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, 
-	0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, 
-	0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, 
-	0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, 
-	0x22, 0x81, 0x10, 0x10, 0xe3, 0xa0, 0xb0, 0x00, 
-	0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, 
-	0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, 
-	0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, 
-	0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, 
-	0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x08, 
-	0xe1, 0x84, 0x60, 0x05, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe3, 0x31, 0x00, 0x00, 0x48, 0xbd, 0x88, 0x89, 
-	0xe8, 0xbd, 0x48, 0x89, 0xe1, 0xa0, 0x10, 0x81, 
-	0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 
-	0x79, 0x78, 0x77, 0x76, 0x76, 0x75, 0x74, 0x73, 
-	0x72, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6d, 
-	0x6c, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, 
-	0x67, 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x63, 
-	0x62, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, 
-	0x5e, 0x5d, 0x5d, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 
-	0x5a, 0x59, 0x59, 0x58, 0x58, 0x57, 0x57, 0x56, 
-	0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, 
-	0x52, 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x50, 
-	0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 
-	0x4c, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 
-	0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, 
-	0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45, 
-	0x45, 0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 
-	0x43, 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 
-	0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, 
-	0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, 
-	0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, 
-	0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, 
-	0x4a, 0x00, 0x00, 0x20, 0xe3, 0x19, 0x01, 0x02, 
-	0x1a, 0x00, 0x00, 0x32, 0xe3, 0x1b, 0x00, 0x04, 
-	0x1a, 0x00, 0x00, 0x08, 0xe1, 0xa0, 0x80, 0x00, 
-	0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, 
-	0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, 
-	0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, 
-	0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, 
-	0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, 
-	0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, 
-	0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, 
-	0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x03, 0xa1, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x03, 0x86, 
-	0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xfe, 0xb6, 
-	0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x05, 
-	0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, 
-	0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xb6, 
-	0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x03, 0xc3, 
-	0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, 
-	0xe3, 0x1b, 0x00, 0x04, 0x02, 0x8f, 0x00, 0x50, 
-	0x12, 0x8f, 0x00, 0x40, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xae, 
-	0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, 
-	0xe3, 0x1b, 0x00, 0x04, 0x12, 0x8f, 0x00, 0x20, 
-	0x02, 0x8f, 0x00, 0x10, 0xe8, 0x90, 0x00, 0x07, 
-	0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, 
-	0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xb5, 0x00, 0x49, 0x02, 0xf0, 0x00, 0xf9, 0x2a, 
-	0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xff, 0xfd, 
-	0xb5, 0x80, 0x1c, 0x07, 0x28, 0x0a, 0xd2, 0x14, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x10, 0x04, 0x10, 0x06, 0x08, 0x0a, 0x0c, 0x10, 
-	0x0e, 0x0e, 0xa0, 0x0f, 0xe0, 0x0c, 0xa0, 0x1a, 
-	0xe0, 0x0a, 0xa0, 0x33, 0xe0, 0x08, 0xa0, 0x3f, 
-	0xe0, 0x06, 0xa0, 0x4b, 0xe0, 0x04, 0xa0, 0x52, 
-	0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xff, 0x89, 
-	0x21, 0x03, 0xf0, 0x00, 0xf9, 0x27, 0x2f, 0x04, 
-	0xd1, 0x05, 0x20, 0x01, 0xf7, 0xfe, 0xf8, 0xd4, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
-	0xfd, 0xb3, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x41, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 
-	0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
-	0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x2e, 
-	0x67, 0x2e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 
-	0x28, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 
-	0x69, 0x6f, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00, 
-	0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 
-	0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 
-	0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x61, 0x6c, 
-	0x6c, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x6e, 
-	0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
-	0x6e, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, 
-	0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 
-	0x29, 0x0a, 0x5b, 0x69, 0x73, 0x20, 0x74, 0x68, 
-	0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69, 
-	0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 
-	0x20, 0x65, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 
-	0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 
-	0x6c, 0x65, 0x64, 0x3f, 0x5d, 0x00, 0x00, 0x00, 
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 
-	0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 
-	0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 
-	0x75, 0x73, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x70, 
-	0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x74, 
-	0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 
-	0x64, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x6c, 0x65, 
-	0x67, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 
-	0x65, 0x73, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, 
-	0x2e, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x6c, 0x79, 
-	0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 
-	0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 
-	0x6f, 0x75, 0x6e, 0x64, 0x73, 0x29, 0x00, 0x00, 
-	0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 
-	0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 
-	0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 
-	0x69, 0x76, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 
-	0x55, 0x73, 0x65, 0x72, 0x2d, 0x64, 0x65, 0x66, 
-	0x69, 0x6e, 0x65, 0x64, 0x20, 0x73, 0x69, 0x67, 
-	0x6e, 0x61, 0x6c, 0x00, 0xb5, 0x00, 0x20, 0x01, 
-	0x49, 0x05, 0x70, 0x08, 0xa0, 0x05, 0x21, 0x03, 
-	0xf0, 0x00, 0xf8, 0x78, 0x20, 0x64, 0xf7, 0xfe, 
-	0xf8, 0x27, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x94, 0x53, 0x74, 0x61, 0x63, 
-	0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 
-	0x6f, 0x77, 0x0a, 0x00, 0xb5, 0x00, 0x28, 0x07, 
-	0xd1, 0x03, 0xf7, 0xff, 0xff, 0xe3, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xff, 0xff, 0x19, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xf2, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x28, 0x00, 
-	0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x05, 0x20, 0x03, 
-	0x49, 0x0b, 0x60, 0x08, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x87, 0x4b, 0x09, 0x59, 0xd9, 
-	0x4a, 0x09, 0x42, 0x91, 0xd1, 0x02, 0xf7, 0xff, 
-	0xff, 0xdd, 0xe0, 0x05, 0x4c, 0x07, 0x42, 0xa1, 
-	0xd0, 0x02, 0x51, 0xda, 0xf7, 0xfd, 0xfa, 0xee, 
-	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0x2e, 0x08, 0x94, 0xac, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 
-	0x28, 0x00, 0xdd, 0x09, 0x28, 0x0b, 0xda, 0x07, 
-	0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 0x49, 0x04, 
-	0x42, 0x88, 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xac, 
-	0xff, 0xff, 0xff, 0xff, 0x28, 0x00, 0xdd, 0x01, 
-	0x28, 0x0b, 0xdb, 0x01, 0x48, 0x03, 0x47, 0x70, 
-	0x00, 0x83, 0x4a, 0x03, 0x58, 0xd0, 0x50, 0xd1, 
-	0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 
-	0x2e, 0x08, 0x94, 0xac, 0xb5, 0x90, 0x27, 0x01, 
-	0x4c, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0xe9, 0x37, 0x01, 0x2f, 0x0b, 0xdb, 0xf8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xb5, 0x90, 0x1c, 0x0c, 
-	0x1c, 0x07, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x09, 
-	0x48, 0x11, 0x78, 0x00, 0x28, 0x00, 0xd1, 0x05, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 0xfb, 0x44, 
-	0x28, 0x00, 0xd1, 0x13, 0x08, 0x60, 0xd3, 0x02, 
-	0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xd3, 0x78, 0x38, 
-	0x28, 0x00, 0xd0, 0x06, 0x78, 0x38, 0x37, 0x01, 
-	0xf0, 0x00, 0xf8, 0xcc, 0x78, 0x38, 0x28, 0x00, 
-	0xd1, 0xf8, 0x08, 0xa0, 0xd3, 0x02, 0x20, 0x0a, 
-	0xf0, 0x00, 0xf8, 0xc4, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x01, 0xbd, 0x35, 
-	0x2e, 0x08, 0x21, 0x94, 0xb5, 0x80, 0xb0, 0x83, 
-	0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x1e, 
-	0x90, 0x02, 0x46, 0x69, 0x20, 0x01, 0xf0, 0x01, 
-	0xf8, 0x61, 0x23, 0x01, 0x1c, 0x07, 0x42, 0xd8, 
-	0xd1, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 
-	0xf8, 0x59, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x02, 0xf0, 0x01, 
-	0xf8, 0x49, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x43, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
-	0x92, 0x02, 0x46, 0x69, 0x20, 0x05, 0xf0, 0x01, 
-	0xf8, 0x31, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x2b, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
-	0x92, 0x02, 0x93, 0x03, 0x46, 0x69, 0x20, 0x06, 
-	0xf0, 0x01, 0xf8, 0x18, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x12, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x00, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x08, 0xf0, 0x01, 
-	0xf8, 0x01, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0x69, 0x40, 0xb0, 0x81, 0x90, 0x00, 
-	0x46, 0x69, 0x20, 0x09, 0xf0, 0x00, 0xff, 0xf6, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 
-	0xb0, 0x82, 0x90, 0x00, 0x91, 0x01, 0x46, 0x69, 
-	0x20, 0x0a, 0xf0, 0x00, 0xff, 0xeb, 0x1c, 0x07, 
-	0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 
-	0xff, 0xe5, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x0b, 0xf0, 0x00, 
-	0xff, 0xd5, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x00, 0xff, 0xcf, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 
-	0x20, 0x0c, 0xf0, 0x00, 0xff, 0xbf, 0xb0, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xb0, 0x83, 
-	0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, 
-	0x20, 0x0d, 0xf0, 0x00, 0xff, 0xb3, 0xb0, 0x03, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x01, 0x46, 0x69, 
-	0x20, 0x03, 0xf0, 0x00, 0xff, 0xab, 0xb0, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, 
-	0x90, 0x00, 0xf7, 0xfd, 0xfa, 0x5b, 0x90, 0x01, 
-	0x46, 0x69, 0x20, 0x12, 0xf0, 0x00, 0xff, 0x9e, 
-	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
-	0xf0, 0x00, 0xff, 0x98, 0x49, 0x03, 0x60, 0x08, 
-	0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfd, 
-	0xfa, 0x41, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e, 
-	0xf0, 0x00, 0xff, 0x84, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x7e, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84, 
-	0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x26, 
-	0x90, 0x01, 0x97, 0x02, 0x1c, 0x38, 0xf7, 0xfd, 
-	0xfa, 0x21, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f, 
-	0xf0, 0x00, 0xff, 0x64, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x5e, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x82, 
-	0x4f, 0x08, 0x97, 0x00, 0x20, 0xff, 0x30, 0x01, 
-	0x90, 0x01, 0x46, 0x69, 0x20, 0x15, 0xf0, 0x00, 
-	0xff, 0x49, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x00, 
-	0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xdc, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
-	0xff, 0x39, 0x49, 0x02, 0x68, 0x09, 0x1a, 0x40, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xa4, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
-	0xff, 0x2d, 0x49, 0x02, 0x60, 0x08, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xa4, 
-	0xb5, 0x80, 0x21, 0x00, 0x1c, 0x07, 0x20, 0x11, 
-	0xf0, 0x00, 0xff, 0x20, 0x2f, 0x00, 0xd0, 0x00, 
-	0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x47, 0x70, 0xb4, 0x80, 0x20, 0x03, 
-	0x43, 0xc0, 0x23, 0x00, 0x49, 0x07, 0x54, 0x0b, 
-	0x30, 0x01, 0xd4, 0xfc, 0x20, 0x00, 0x4a, 0x06, 
-	0x5c, 0x17, 0x54, 0x0f, 0x18, 0x0f, 0x37, 0x80, 
-	0x70, 0x3b, 0x30, 0x01, 0x28, 0x80, 0xd3, 0xf7, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x21, 0xac, 
-	0x2e, 0x03, 0x3b, 0x58, 0xb5, 0x80, 0x49, 0x07, 
-	0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x13, 0x1c, 0x07, 
-	0xd1, 0x03, 0xa1, 0x05, 0xa0, 0x05, 0xf0, 0x00, 
-	0xfc, 0xe7, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xa8, 
-	0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x73, 
-	0x74, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x65, 0x66, 
-	0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, 
-	0x4f, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 
-	0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 
-	0x6c, 0x69, 0x6b, 0x65, 0x00, 0x00, 0x00, 0x00, 
-	0x23, 0x80, 0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 
-	0x21, 0x00, 0x60, 0x01, 0x60, 0x81, 0x47, 0x70, 
-	0xb5, 0xf7, 0x68, 0xd5, 0x69, 0x56, 0x1c, 0x0c, 
-	0x1c, 0x17, 0x0d, 0x68, 0xd3, 0x05, 0x23, 0x10, 
-	0x43, 0x1d, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xfc, 
-	0x61, 0xb8, 0x48, 0x12, 0x40, 0x28, 0xd0, 0x08, 
-	0x69, 0xb9, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xc7, 
-	0x28, 0x00, 0xdb, 0x10, 0x4b, 0x0e, 0x40, 0x1d, 
-	0x60, 0xfd, 0x99, 0x00, 0x1c, 0x30, 0x1c, 0x22, 
-	0x1c, 0x2b, 0xf7, 0xff, 0xfe, 0x75, 0x00, 0x41, 
-	0x08, 0x49, 0x1a, 0x61, 0x69, 0xba, 0x18, 0x51, 
-	0x61, 0xb9, 0x28, 0x00, 0xd0, 0x08, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xce, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xe7, 0xf9, 0x00, 0x02, 0x00, 0x10, 
-	0xff, 0xfd, 0xff, 0xef, 0xb5, 0xb0, 0x48, 0x15, 
-	0x68, 0xc1, 0x4b, 0x15, 0x40, 0x19, 0x1c, 0x1d, 
-	0x42, 0x99, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xd6, 
-	0x48, 0x12, 0x68, 0xc1, 0x4b, 0x10, 0x40, 0x19, 
-	0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xce, 
-	0x48, 0x0f, 0x68, 0xc1, 0x4b, 0x0c, 0x40, 0x19, 
-	0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xc6, 
-	0x27, 0x00, 0x4c, 0x0c, 0x01, 0xb8, 0x19, 0x00, 
-	0x68, 0xc1, 0x4b, 0x07, 0x40, 0x19, 0x42, 0xa9, 
-	0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xbb, 0x37, 0x01, 
-	0x2f, 0x0d, 0xdb, 0xf3, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x1c, 
-	0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x96, 0x9c, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x04, 0x6a, 0xc0, 
-	0x68, 0x79, 0x42, 0x88, 0xd9, 0x00, 0x1c, 0x01, 
-	0x68, 0xf8, 0x4b, 0x13, 0x40, 0x18, 0x07, 0x82, 
-	0x0f, 0x92, 0x25, 0x00, 0x60, 0xf8, 0x2a, 0x01, 
-	0xd0, 0x1a, 0x22, 0x82, 0x40, 0x02, 0x15, 0x1e, 
-	0x2a, 0x02, 0xd1, 0x0a, 0x0c, 0x40, 0xd3, 0x13, 
-	0x42, 0xa1, 0xd0, 0x0a, 0x1b, 0x09, 0x1c, 0x20, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x62, 0xfc, 0x60, 0x7c, 0x60, 0xbd, 
-	0x68, 0xf8, 0x4b, 0x04, 0x40, 0x18, 0x60, 0xf8, 
-	0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0x68, 0xc0, 0x23, 0x20, 
-	0x43, 0xdb, 0x40, 0x18, 0x60, 0xf8, 0x69, 0xb8, 
-	0x6a, 0xb9, 0x42, 0x88, 0xd0, 0x0d, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xbe, 0x68, 0xf8, 0x4b, 0x08, 
-	0x40, 0x18, 0x23, 0x10, 0x43, 0x18, 0x60, 0xf8, 
-	0x6a, 0xb8, 0x61, 0xb8, 0x69, 0x38, 0x62, 0xf8, 
-	0x60, 0x78, 0x68, 0xf8, 0x4b, 0x03, 0x40, 0x18, 
-	0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xbf, 0xbf, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x40, 0xb0, 0x83, 
-	0x90, 0x01, 0x69, 0x38, 0x90, 0x00, 0x25, 0x00, 
-	0x68, 0xfe, 0x07, 0xb0, 0xd1, 0x01, 0x43, 0xc0, 
-	0xe0, 0x48, 0x09, 0x30, 0xd2, 0x40, 0x24, 0x10, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x3f, 0x1c, 0x05, 
-	0x0d, 0x70, 0xd3, 0x1b, 0x24, 0x00, 0x49, 0x21, 
-	0x91, 0x02, 0x01, 0xa0, 0x99, 0x02, 0x18, 0x40, 
-	0x42, 0xb8, 0xd0, 0x10, 0x68, 0xc1, 0x07, 0x8a, 
-	0xd0, 0x0d, 0x69, 0x42, 0x9b, 0x01, 0x42, 0x9a, 
-	0xd1, 0x09, 0x0d, 0x49, 0xd3, 0x07, 0x68, 0xc1, 
-	0x4b, 0x19, 0x40, 0x19, 0x60, 0xc1, 0x68, 0xf8, 
-	0x40, 0x18, 0x60, 0xf8, 0xe0, 0x02, 0x34, 0x01, 
-	0x2c, 0x10, 0xdb, 0xe6, 0x2c, 0x10, 0xd1, 0x06, 
-	0x98, 0x01, 0xf7, 0xff, 0xfd, 0x83, 0x28, 0x00, 
-	0xda, 0x01, 0x25, 0x00, 0x43, 0xed, 0x0b, 0x30, 
-	0xd3, 0x04, 0x98, 0x00, 0x49, 0x0f, 0x68, 0x09, 
-	0xf7, 0xfc, 0xff, 0xe0, 0x0d, 0xf0, 0x05, 0xc0, 
-	0x23, 0xa5, 0x05, 0xdb, 0x42, 0xd8, 0xd1, 0x07, 
-	0x48, 0x0b, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xff, 0xfe, 0x1c, 0x05, 
-	0x22, 0x40, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xfd, 
-	0xf8, 0x8f, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xac, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xf7, 0x1c, 0x10, 
-	0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0x98, 
-	0x78, 0x20, 0x34, 0x01, 0x28, 0x61, 0xd0, 0x09, 
-	0x28, 0x72, 0xd0, 0x04, 0x28, 0x77, 0xd1, 0x25, 
-	0x26, 0x02, 0x25, 0x04, 0xe0, 0x04, 0x26, 0x01, 
-	0x25, 0x00, 0xe0, 0x01, 0x4e, 0x1a, 0x25, 0x08, 
-	0x78, 0x20, 0x34, 0x01, 0x28, 0x2b, 0xd0, 0x06, 
-	0x28, 0x62, 0xd1, 0x09, 0x23, 0x04, 0x43, 0x1e, 
-	0x23, 0x01, 0x43, 0x1d, 0xe7, 0xf4, 0x23, 0x03, 
-	0x43, 0x1e, 0x23, 0x02, 0x43, 0x1d, 0xe7, 0xef, 
-	0x1f, 0xe0, 0x38, 0x19, 0x7f, 0xc0, 0x28, 0x74, 
-	0xd1, 0x01, 0x23, 0x10, 0x43, 0x1d, 0x98, 0x00, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x0b, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x04, 0x20, 0x00, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 
-	0x60, 0x79, 0x61, 0x39, 0x21, 0x01, 0x03, 0x09, 
-	0x61, 0x78, 0x61, 0xf9, 0x60, 0xfe, 0x09, 0x28, 
-	0xd3, 0x04, 0x22, 0x02, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x00, 0xfb, 0xc4, 0x1c, 0x38, 0xe7, 0xea, 
-	0x00, 0x00, 0x80, 0x02, 0xb5, 0x90, 0x23, 0x03, 
-	0x4f, 0x08, 0x01, 0x9a, 0x19, 0xd2, 0x68, 0xd4, 
-	0x07, 0xa4, 0xd1, 0x04, 0xf7, 0xff, 0xff, 0xaa, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x33, 0x01, 
-	0x2b, 0x10, 0xdb, 0xf2, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x10, 
-	0x68, 0xe8, 0x08, 0x80, 0xd3, 0x18, 0x20, 0x01, 
-	0x4e, 0x0e, 0x70, 0x30, 0x40, 0x38, 0xd0, 0x03, 
-	0x20, 0x0a, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x1e, 
-	0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x2c, 
-	0x08, 0xb8, 0xd3, 0x03, 0x20, 0x0a, 0x1c, 0x29, 
-	0xf0, 0x00, 0xfc, 0x14, 0x20, 0x00, 0x70, 0x30, 
-	0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x21, 0x94, 
-	0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x06, 0x21, 0x01, 
-	0xf7, 0xff, 0xfc, 0x80, 0x21, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfc, 0x7c, 0x20, 0x01, 0xf7, 0xfd, 
-	0xfc, 0x25, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 
-	0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x00, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 
-	0x48, 0x20, 0x22, 0x01, 0x02, 0x92, 0x21, 0x00, 
-	0x1c, 0x06, 0xf7, 0xfc, 0xff, 0xd5, 0x4a, 0x1e, 
-	0x1c, 0x28, 0xa1, 0x1e, 0xf7, 0xff, 0xff, 0x4e, 
-	0x28, 0x00, 0xd1, 0x02, 0x1c, 0x28, 0xf7, 0xff, 
-	0xff, 0xd3, 0x1c, 0x20, 0x1c, 0x32, 0xa1, 0x1a, 
-	0xf7, 0xff, 0xff, 0x44, 0x28, 0x00, 0xd1, 0x02, 
-	0x1c, 0x20, 0xf7, 0xff, 0xff, 0xc9, 0x4a, 0x17, 
-	0x1c, 0x38, 0x1c, 0x15, 0xa1, 0x13, 0xf7, 0xff, 
-	0xff, 0x39, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xff, 0xbe, 0x1c, 0x30, 0x26, 0x01, 
-	0x03, 0x36, 0x08, 0xf2, 0x21, 0x00, 0x1c, 0x33, 
-	0xf0, 0x00, 0xf8, 0x52, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x20, 0xf7, 0xff, 0xff, 0xb1, 0x22, 0x01, 
-	0x02, 0x52, 0x21, 0x00, 0x1c, 0x28, 0x1c, 0x33, 
-	0xf0, 0x00, 0xf8, 0x46, 0x28, 0x00, 0xd0, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa5, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 
-	0x2e, 0x08, 0x96, 0x5c, 0x77, 0x00, 0x00, 0x00, 
-	0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x1c, 
-	0xb5, 0x90, 0x27, 0x03, 0x4c, 0x09, 0x01, 0xb8, 
-	0x19, 0x00, 0xf7, 0xff, 0xfe, 0xa5, 0x37, 0x01, 
-	0x2f, 0x10, 0xdb, 0xf8, 0x27, 0x00, 0x01, 0xb8, 
-	0x19, 0x00, 0xf7, 0xff, 0xfe, 0x9d, 0x37, 0x01, 
-	0x2f, 0x03, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 
-	0xb5, 0xb0, 0x01, 0x80, 0x1c, 0x0f, 0x4c, 0x0a, 
-	0x19, 0x00, 0x1c, 0x05, 0xf7, 0xff, 0xfe, 0x8c, 
-	0x01, 0xb8, 0x19, 0x00, 0x23, 0x01, 0x05, 0x1b, 
-	0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 0x4b, 0x05, 
-	0x40, 0x19, 0x60, 0xe9, 0x69, 0x40, 0x61, 0x68, 
-	0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x95, 0xdc, 0x00, 0x10, 0x8f, 0x03, 
-	0xb4, 0xf0, 0x1c, 0x1f, 0x68, 0xc3, 0x07, 0x9e, 
-	0x0f, 0xb6, 0x25, 0x01, 0x1c, 0x1c, 0x2e, 0x00, 
-	0xd0, 0x13, 0x1c, 0x1e, 0x0d, 0xf3, 0xd2, 0x10, 
-	0x02, 0x2b, 0x42, 0x9a, 0xd0, 0x09, 0x00, 0x5b, 
-	0x42, 0x9a, 0xd0, 0x06, 0x00, 0x5b, 0x42, 0x9a, 
-	0xd1, 0x07, 0x27, 0x01, 0x1d, 0xc1, 0x31, 0x1d, 
-	0xe0, 0x06, 0x1e, 0x7e, 0x4b, 0x08, 0x42, 0x9e, 
-	0xd3, 0x02, 0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70, 
-	0x61, 0x01, 0x23, 0x0f, 0x02, 0x1b, 0x43, 0x9c, 
-	0x60, 0x41, 0x61, 0xc7, 0x1c, 0x21, 0x43, 0x11, 
-	0x60, 0xc1, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 
-	0x00, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x01, 0x02, 
-	0xe3, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x19, 0x31, 
-	0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20, 
-	0xe1, 0x81, 0x16, 0x32, 0xe1, 0xa0, 0x28, 0x12, 
-	0x30, 0x40, 0x00, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16, 
-	0xe1, 0xb0, 0x10, 0x02, 0x01, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xa0, 0x80, 0x20, 
-	0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, 
-	0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, 
-	0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, 
-	0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, 
-	0x81, 0xa0, 0x19, 0x31, 0x30, 0x40, 0x00, 0x09, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6, 
-	0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x18, 0x11, 
-	0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x03, 0x31, 0x02, 
-	0xe3, 0x34, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x24, 
-	0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, 
-	0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, 
-	0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, 
-	0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x49, 0x34, 
-	0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20, 
-	0xe1, 0x84, 0x46, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0x30, 0x43, 0x30, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16, 
-	0xe1, 0xb0, 0x40, 0x05, 0x01, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0xa0, 0x50, 0x00, 0xe3, 0xa0, 0x80, 0x20, 
-	0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, 
-	0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, 
-	0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, 
-	0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, 
-	0x81, 0xa0, 0x49, 0x34, 0x30, 0x43, 0x30, 0x09, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6, 
-	0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x48, 0x14, 
-	0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x20, 0x00, 
-	0xe2, 0x16, 0x01, 0x02, 0x12, 0x66, 0x10, 0x00, 
-	0x01, 0xb0, 0x10, 0x06, 0x03, 0xa0, 0x30, 0x00, 
-	0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x39, 0x01, 
-	0xe3, 0x83, 0x30, 0x1e, 0xe3, 0xa0, 0x60, 0x00, 
-	0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02, 
-	0x03, 0xa0, 0x20, 0x00, 0x02, 0x43, 0x30, 0x20, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32, 
-	0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x43, 0x30, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x34, 0x00, 0x00, 
-	0x01, 0xa0, 0x40, 0x05, 0x03, 0xa0, 0x50, 0x00, 
-	0x02, 0x43, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, 
-	0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, 
-	0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, 
-	0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, 
-	0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, 
-	0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, 
-	0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, 
-	0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, 
-	0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, 
-	0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15, 
-	0xe0, 0x43, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02, 
-	0x03, 0xa0, 0x20, 0x00, 0x02, 0x83, 0x30, 0x20, 
-	0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21, 
-	0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, 
-	0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, 
-	0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, 
-	0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, 
-	0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, 
-	0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, 
-	0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, 
-	0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32, 
-	0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x83, 0x30, 0x08, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe1, 0x92, 0x80, 0x81, 
-	0x0a, 0x00, 0x00, 0x05, 0xe3, 0x11, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x0c, 0xe1, 0x95, 0x80, 0x84, 
-	0x0a, 0x00, 0x00, 0x0a, 0xe3, 0x14, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x08, 0xe3, 0x14, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x28, 0xe1, 0xa0, 0x00, 0x03, 
-	0xe1, 0xa0, 0x10, 0x04, 0xe1, 0xa0, 0x20, 0x05, 
-	0xea, 0x00, 0x00, 0x04, 0xe3, 0x11, 0x01, 0x01, 
-	0x0a, 0x00, 0x00, 0x22, 0xea, 0x00, 0x00, 0x01, 
-	0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x1f, 
-	0xe3, 0x1b, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x16, 
-	0xe3, 0x1b, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x0c, 
-	0xe3, 0x1b, 0x0c, 0x02, 0x1a, 0x00, 0x00, 0x05, 
-	0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xa0, 0x90, 0xff, 
-	0xe3, 0x89, 0x9c, 0x43, 0xe1, 0x58, 0x00, 0x09, 
-	0x33, 0xc2, 0x20, 0x01, 0x03, 0x82, 0x20, 0x01, 
-	0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0xff, 
-	0xe3, 0x80, 0x0c, 0x7f, 0xe1, 0x30, 0x00, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03, 
-	0xe3, 0x80, 0x00, 0xff, 0xe3, 0x80, 0x0c, 0x43, 
-	0xe1, 0xa0, 0x25, 0xa2, 0xe1, 0xa0, 0x25, 0x82, 
-	0xe3, 0x81, 0x11, 0x02, 0xe1, 0x30, 0x00, 0x00, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03, 
-	0xe3, 0x80, 0x00, 0x7f, 0xe3, 0x80, 0x09, 0x01, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xc1, 0x10, 0xff, 
-	0xe3, 0x81, 0x11, 0x02, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xb5, 0x80, 0x1c, 0x0f, 0x29, 0x0f, 0xdd, 0x04, 
-	0x11, 0x39, 0xf7, 0xff, 0xff, 0xf9, 0x07, 0x3f, 
-	0x0f, 0x3f, 0x2f, 0x09, 0xdd, 0x02, 0x1d, 0xf9, 
-	0x31, 0x29, 0xe0, 0x01, 0x1d, 0xf9, 0x31, 0x50, 
-	0x70, 0x01, 0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x48, 0x0d, 
-	0x68, 0x01, 0x29, 0x00, 0xd1, 0x12, 0x4c, 0x0c, 
-	0x1c, 0x20, 0xa1, 0x0c, 0x22, 0x14, 0xf7, 0xfc, 
-	0xfc, 0xa1, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39, 
-	0xf7, 0xff, 0xff, 0xda, 0x21, 0x29, 0x70, 0x01, 
-	0x21, 0x00, 0x70, 0x41, 0x1c, 0x20, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x30, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xcc, 
-	0x2e, 0x08, 0x99, 0xdc, 0x55, 0x6e, 0x6b, 0x6e, 
-	0x6f, 0x77, 0x6e, 0x20, 0x53, 0x69, 0x67, 0x6e, 
-	0x61, 0x6c, 0x20, 0x28, 0x30, 0x78, 0x00, 0x00, 
-	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0xa0, 0x09, 
-	0x21, 0x01, 0xf7, 0xff, 0xf9, 0x6f, 0x21, 0x00, 
-	0x1c, 0x20, 0xf7, 0xff, 0xf9, 0x6b, 0x21, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x67, 0x20, 0x01, 
-	0xf7, 0xfd, 0xf9, 0x10, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2a, 0x2a, 0x2a, 0x20, 
-	0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 
-	0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x72, 
-	0x75, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 
-	0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x68, 0xc0, 0x07, 0x81, 0xd0, 0x1f, 0x23, 0x20, 
-	0x40, 0x18, 0xd0, 0x01, 0x6a, 0xbd, 0xe0, 0x04, 
-	0x68, 0x79, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a, 
-	0x1a, 0x8d, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfb, 0xa2, 0x68, 0xf8, 0x4b, 0x0a, 
-	0x40, 0x18, 0x60, 0xf8, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfb, 0x67, 0x1c, 0x04, 0x22, 0x00, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x27, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xff, 0xff, 0xcf, 0xff, 0xb5, 0xb0, 0x24, 0x00, 
-	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xff, 0xff, 0xce, 
-	0x1c, 0x04, 0xe0, 0x0c, 0x27, 0x00, 0x4d, 0x08, 
-	0x01, 0xb8, 0x19, 0x40, 0xf7, 0xff, 0xff, 0xc6, 
-	0x28, 0x00, 0xd0, 0x01, 0x24, 0x00, 0x43, 0xe4, 
-	0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf4, 0x1c, 0x20, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xf7, 0x68, 0xc5, 
-	0x69, 0x46, 0x1c, 0x0c, 0x1c, 0x07, 0xb0, 0x81, 
-	0x48, 0x3c, 0x40, 0x28, 0xd0, 0x04, 0x1c, 0x38, 
-	0xf7, 0xff, 0xf9, 0x92, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x02, 0xe0, 0x6a, 0x9a, 0x03, 0x2a, 0x00, 
-	0xd0, 0x26, 0x2a, 0x01, 0xd0, 0x0b, 0x2a, 0x02, 
-	0xd1, 0x24, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0xbc, 
-	0x28, 0x00, 0xda, 0x09, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0xa7, 0x20, 0x01, 0xe0, 0x59, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x8c, 0x19, 0x04, 0xe0, 0x13, 
-	0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x00, 
-	0x1c, 0x11, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a, 
-	0x1a, 0x89, 0x68, 0xfa, 0x09, 0x92, 0xd3, 0x03, 
-	0x6a, 0xba, 0x42, 0x8a, 0xdd, 0x00, 0x1c, 0x11, 
-	0x42, 0x81, 0xdd, 0x00, 0x1c, 0x08, 0x18, 0x24, 
-	0x2c, 0x00, 0xda, 0x03, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0x87, 0xe7, 0xcd, 0x0b, 0xa8, 0xd3, 0x04, 
-	0x68, 0x78, 0x6a, 0xf9, 0x42, 0x81, 0xd2, 0x00, 
-	0x62, 0xf8, 0x69, 0xb8, 0x42, 0xa0, 0xdc, 0x10, 
-	0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x01, 
-	0x1c, 0x13, 0xe0, 0x00, 0x1c, 0x0b, 0x18, 0x1b, 
-	0x69, 0x3e, 0x1b, 0x9b, 0x42, 0xa3, 0xdb, 0x04, 
-	0x6b, 0x3b, 0x93, 0x00, 0x18, 0xc3, 0x42, 0xa3, 
-	0xdc, 0x06, 0x20, 0x20, 0x43, 0x28, 0x21, 0x00, 
-	0x60, 0x39, 0x60, 0xb9, 0x62, 0xbc, 0xe0, 0x14, 
-	0x1a, 0x24, 0x08, 0xa8, 0xd3, 0x03, 0x9b, 0x00, 
-	0x1b, 0x18, 0x42, 0x40, 0x60, 0xb8, 0x08, 0x68, 
-	0xd3, 0x06, 0x42, 0x8a, 0xd9, 0x00, 0x1c, 0x11, 
-	0x1b, 0x88, 0x1b, 0x00, 0x42, 0x40, 0x60, 0x38, 
-	0x19, 0x30, 0x23, 0x20, 0x43, 0x9d, 0x60, 0x78, 
-	0x1c, 0x28, 0x4b, 0x05, 0x40, 0x18, 0x60, 0xf8, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x10, 0x00, 0x03, 
-	0xff, 0xf7, 0xcf, 0xbf, 0xb5, 0x00, 0x68, 0x8a, 
-	0x68, 0x4b, 0x3a, 0x01, 0xd5, 0x03, 0xf0, 0x00, 
-	0xf8, 0x3f, 0xbc, 0x08, 0x47, 0x18, 0x06, 0x00, 
-	0x0e, 0x00, 0x70, 0x18, 0x33, 0x01, 0x60, 0x8a, 
-	0x60, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x78, 0x00, 0x1c, 0x0c, 
-	0x37, 0x01, 0x28, 0x00, 0xd0, 0x0e, 0x25, 0x00, 
-	0x43, 0xed, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0xe8, 
-	0x42, 0xa8, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, 0x37, 0x01, 
-	0x28, 0x00, 0xd1, 0xf2, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0xc1, 0x07, 0x8a, 
-	0xd1, 0x04, 0x20, 0x01, 0x49, 0x09, 0x60, 0x08, 
-	0x42, 0x40, 0x47, 0x70, 0x09, 0x8a, 0xd3, 0x01, 
-	0x6a, 0x80, 0xe0, 0x04, 0x68, 0x42, 0x69, 0x83, 
-	0x18, 0xd2, 0x69, 0x00, 0x1a, 0x10, 0x0d, 0x09, 
-	0xd3, 0xf3, 0x28, 0x00, 0xdd, 0xf1, 0x38, 0x01, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x68, 0xc8, 0x1c, 0x0f, 
-	0x4b, 0x5a, 0x40, 0x18, 0x23, 0x01, 0x05, 0x9b, 
-	0x43, 0x18, 0x60, 0xc8, 0x09, 0x80, 0xd3, 0x02, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x95, 0x06, 0x26, 
-	0x0e, 0x36, 0x68, 0xb9, 0x29, 0x00, 0xda, 0x12, 
-	0x68, 0xf8, 0x0a, 0x82, 0xd2, 0x0f, 0x22, 0x00, 
-	0x43, 0xd2, 0x1a, 0x51, 0x23, 0x09, 0x03, 0x5b, 
-	0x43, 0x18, 0x60, 0xf8, 0x60, 0xb9, 0x68, 0x79, 
-	0x70, 0x0e, 0x31, 0x01, 0x60, 0x79, 0x1c, 0x30, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 
-	0x49, 0x49, 0x40, 0x01, 0x29, 0x02, 0xd0, 0x03, 
-	0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xcd, 0xe0, 0x7f, 
-	0x49, 0x46, 0x40, 0x01, 0x23, 0x01, 0x03, 0xdb, 
-	0x42, 0x99, 0xd1, 0x0b, 0x22, 0x02, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xfb, 0x68, 0xf8, 
-	0x09, 0x80, 0xd3, 0x02, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0x63, 0x68, 0xf8, 0x25, 0x09, 0x03, 0x6d, 
-	0x43, 0x05, 0x60, 0xfd, 0x69, 0x38, 0x28, 0x00, 
-	0xd1, 0x2f, 0x1c, 0x38, 0xf7, 0xff, 0xf8, 0x88, 
-	0x28, 0x00, 0xd0, 0x18, 0x68, 0xf8, 0x0a, 0x00, 
-	0x07, 0x80, 0xd0, 0x09, 0x69, 0xf8, 0xf7, 0xff, 
-	0xf9, 0x7d, 0x61, 0x38, 0x60, 0x78, 0x23, 0x01, 
-	0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8, 0xe0, 0x1a, 
-	0x1d, 0xf8, 0x30, 0x1d, 0x61, 0x38, 0x60, 0x78, 
-	0x20, 0x01, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, 
-	0x61, 0xf8, 0x60, 0xfd, 0xe0, 0x11, 0x69, 0xf8, 
-	0xf7, 0xff, 0xf9, 0x68, 0x61, 0x38, 0x60, 0x78, 
-	0x23, 0x01, 0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8, 
-	0x43, 0x28, 0x60, 0xf8, 0x0a, 0x29, 0x07, 0x89, 
-	0xd1, 0x03, 0x08, 0xdb, 0x43, 0x1d, 0x43, 0x28, 
-	0x60, 0xf8, 0x0a, 0x68, 0xd3, 0x19, 0x68, 0x78, 
-	0x6a, 0xf9, 0x69, 0x3c, 0x42, 0x81, 0xd9, 0x00, 
-	0x1c, 0x08, 0x1b, 0x01, 0xd0, 0x05, 0x1c, 0x20, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xf9, 0x7d, 0x28, 0x00, 
-	0xd1, 0x26, 0x1c, 0x60, 0x62, 0xf8, 0x60, 0x78, 
-	0x69, 0xf8, 0x1e, 0x41, 0x63, 0x38, 0x60, 0xb9, 
-	0x70, 0x26, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x69, 0x38, 0x68, 0x7a, 0x70, 0x14, 
-	0x32, 0x01, 0x60, 0x7a, 0x6a, 0xf9, 0x42, 0x91, 
-	0xd8, 0x00, 0x1c, 0x11, 0x1a, 0x09, 0x69, 0xfa, 
-	0x63, 0x3a, 0x0a, 0xeb, 0xd2, 0x03, 0x2e, 0x0a, 
-	0xd0, 0x01, 0x42, 0x8a, 0xdc, 0x0d, 0x62, 0xf8, 
-	0x22, 0x00, 0x60, 0x78, 0x60, 0xba, 0x1c, 0x3a, 
-	0xf7, 0xff, 0xf9, 0x56, 0x28, 0x00, 0xd0, 0x04, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 
-	0x00, 0x00, 0x10, 0x8a, 0x00, 0x00, 0xa0, 0x10, 
-	0xb5, 0x00, 0x68, 0x8a, 0x68, 0x4b, 0x3a, 0x01, 
-	0xd5, 0x03, 0xf7, 0xff, 0xff, 0x39, 0xbc, 0x08, 
-	0x47, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x70, 0x18, 
-	0x33, 0x01, 0x60, 0x8a, 0x60, 0x4b, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe2, 0x8f, 0xe0, 0x00, 
-	0xef, 0x12, 0x34, 0x56, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x10, 0x00, 
-	0xe3, 0xa0, 0x00, 0x18, 0xe5, 0x9f, 0x10, 0x18, 
-	0xef, 0x12, 0x34, 0x56, 0xea, 0xff, 0xff, 0xfe, 
-	0xe1, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x00, 0x18, 
-	0xe5, 0x9f, 0x10, 0x08, 0xef, 0x12, 0x34, 0x56, 
-	0xea, 0xff, 0xff, 0xfe, 0x00, 0x02, 0x00, 0x26, 
-	0x00, 0x02, 0x00, 0x23, 0xe8, 0xb0, 0x01, 0xf0, 
-	0xe8, 0xa1, 0x01, 0xf0, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8, 
-	0xe8, 0xa1, 0x01, 0xf8, 0xe2, 0x52, 0x20, 0xbc, 
-	0x1a, 0xff, 0xff, 0xed, 0xe8, 0xbd, 0x01, 0xf8, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe4, 0x90, 0x40, 0x04, 
-	0xe1, 0x85, 0x54, 0x24, 0xe4, 0x81, 0x50, 0x04, 
-	0xe1, 0xa0, 0x5c, 0x04, 0xe2, 0x53, 0x30, 0x04, 
-	0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x88, 
-	0xe4, 0x90, 0x40, 0x04, 0xe1, 0x85, 0x5c, 0x24, 
-	0xe4, 0x81, 0x50, 0x04, 0xe1, 0xa0, 0x54, 0x04, 
-	0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, 
-	0xe5, 0x9f, 0xf0, 0x70, 0xe4, 0x90, 0x40, 0x04, 
-	0xe1, 0xa0, 0x58, 0x24, 0xe0, 0xc1, 0x50, 0xb2, 
-	0xe0, 0xc1, 0x40, 0xb2, 0xe2, 0x53, 0x30, 0x04, 
-	0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x4c, 
-	0xe2, 0x03, 0x40, 0x0f, 0xe0, 0x53, 0x40, 0x04, 
-	0x0a, 0x00, 0x00, 0x0a, 0xe9, 0x2d, 0x00, 0xc4, 
-	0xe1, 0xa0, 0x20, 0x03, 0xe1, 0xa0, 0x30, 0x04, 
-	0xe8, 0xb0, 0x00, 0xf0, 0xe8, 0xa1, 0x00, 0xf0, 
-	0xe2, 0x53, 0x30, 0x10, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe1, 0xa0, 0x30, 0x02, 0xe8, 0xbd, 0x00, 0xc4, 
-	0xe2, 0x13, 0x30, 0x0f, 0x0a, 0x00, 0x00, 0x03, 
-	0xe4, 0x90, 0x40, 0x04, 0xe4, 0x81, 0x40, 0x04, 
-	0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xfb, 
-	0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xc9, 0xe4, 0x2e, 0x01, 0xc9, 0x88, 
-	0x2e, 0x01, 0xc9, 0xb8, 0xe9, 0x2d, 0x00, 0x38, 
-	0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3f, 
-	0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03, 
-	0x0a, 0x00, 0x00, 0x30, 0xe2, 0x10, 0x30, 0x01, 
-	0x0a, 0x00, 0x00, 0x03, 0xe4, 0xd0, 0x30, 0x01, 
-	0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x01, 
-	0x0a, 0x00, 0x00, 0x36, 0xe2, 0x10, 0x30, 0x02, 
-	0x0a, 0x00, 0x00, 0x05, 0xe0, 0xd0, 0x30, 0xb2, 
-	0xe1, 0xa0, 0x44, 0x23, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x02, 
-	0x0a, 0x00, 0x00, 0x2e, 0xe3, 0xe0, 0x30, 0x03, 
-	0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x1f, 
-	0xe2, 0x11, 0x40, 0x01, 0x0a, 0x00, 0x00, 0x19, 
-	0xe2, 0x11, 0x40, 0x02, 0x1a, 0x00, 0x00, 0x0b, 
-	0xe2, 0x41, 0x10, 0x01, 0xe5, 0x91, 0x50, 0x00, 
-	0xe1, 0xa0, 0x5c, 0x25, 0xe1, 0xa0, 0x5c, 0x05, 
-	0xe5, 0x9f, 0xf0, 0xa8, 0xe5, 0x91, 0x40, 0x00, 
-	0xe1, 0xa0, 0x44, 0x04, 0xe1, 0xa0, 0x44, 0x24, 
-	0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00, 
-	0xe2, 0x81, 0x10, 0x01, 0xea, 0x00, 0x00, 0x0f, 
-	0xe2, 0x41, 0x10, 0x03, 0xe5, 0x91, 0x50, 0x00, 
-	0xe1, 0xa0, 0x54, 0x25, 0xe1, 0xa0, 0x54, 0x05, 
-	0xe5, 0x9f, 0xf0, 0x7c, 0xe5, 0x91, 0x40, 0x00, 
-	0xe1, 0xa0, 0x4c, 0x04, 0xe1, 0xa0, 0x4c, 0x24, 
-	0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00, 
-	0xe2, 0x81, 0x10, 0x03, 0xea, 0x00, 0x00, 0x03, 
-	0xe2, 0x11, 0x40, 0x02, 0x0a, 0x00, 0x00, 0x00, 
-	0xe5, 0x9f, 0xf0, 0x5c, 0xe5, 0x9f, 0xf0, 0x48, 
-	0xe2, 0x12, 0x20, 0x03, 0x0a, 0x00, 0x00, 0x09, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x05, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x01, 
-	0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 
-	0xe8, 0xbd, 0x00, 0x38, 0xe3, 0x8e, 0xe0, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x01, 0xf8, 
-	0xe5, 0x9f, 0xf0, 0x18, 0x2e, 0x01, 0xc8, 0x58, 
-	0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xc8, 0xac, 
-	0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xc8, 0x74, 
-	0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xc8, 0x90, 
-	0x2e, 0x01, 0xc8, 0x08, 0xe9, 0x2d, 0x5f, 0xff, 
-	0xe1, 0x4f, 0x00, 0x00, 0xe9, 0x2d, 0x00, 0x01, 
-	0xe2, 0x8f, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, 
-	0x21, 0xff, 0x48, 0x37, 0x68, 0x00, 0x40, 0x52, 
-	0x42, 0x08, 0xd1, 0x0b, 0x32, 0x20, 0x0a, 0x00, 
-	0x42, 0x08, 0xd1, 0x07, 0x32, 0x20, 0x0a, 0x00, 
-	0x42, 0x08, 0xd1, 0x03, 0x0a, 0x00, 0x42, 0x08, 
-	0xd0, 0x23, 0x32, 0x20, 0x21, 0x0f, 0x42, 0x08, 
-	0xd1, 0x01, 0x32, 0x10, 0x09, 0x00, 0x21, 0x01, 
-	0x42, 0x08, 0xd1, 0x08, 0x1d, 0x12, 0x21, 0x02, 
-	0x42, 0x08, 0xd1, 0x04, 0x1d, 0x12, 0x21, 0x04, 
-	0x42, 0x08, 0xd1, 0x00, 0x1d, 0x12, 0x48, 0x25, 
-	0x68, 0x00, 0xb4, 0x01, 0x08, 0x90, 0x21, 0x01, 
-	0x40, 0x81, 0x48, 0x21, 0x60, 0x01, 0x48, 0x1d, 
-	0x58, 0x82, 0x48, 0x01, 0x46, 0x86, 0x47, 0x10, 
-	0x2e, 0x01, 0xca, 0xc1, 0xbc, 0x02, 0x48, 0x1d, 
-	0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x48, 0x12, 0x21, 0x20, 0x4a, 0x12, 0x60, 0x02, 
-	0x1d, 0x00, 0x1e, 0x49, 0xd1, 0xfb, 0x20, 0x00, 
-	0x47, 0x70, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x46, 0x73, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x00, 
-	0x47, 0x18, 0x46, 0x73, 0x49, 0x0c, 0x60, 0x08, 
-	0x20, 0x00, 0x47, 0x18, 0x46, 0x73, 0x48, 0x0b, 
-	0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x09, 
-	0x60, 0x08, 0x47, 0x18, 0x46, 0x73, 0x4a, 0x03, 
-	0x00, 0x80, 0x18, 0x12, 0x68, 0x10, 0x60, 0x11, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x3a, 0xf4, 
-	0x2e, 0x01, 0xca, 0xf0, 0x66, 0x00, 0x00, 0x10, 
-	0x66, 0x00, 0x00, 0x14, 0x66, 0x00, 0x00, 0x18, 
-	0x66, 0x00, 0x00, 0x1c, 0xe9, 0x2d, 0x5f, 0xf0, 
-	0xe1, 0x4f, 0x40, 0x00, 0xe3, 0x14, 0x00, 0x20, 
-	0x11, 0x5e, 0x40, 0xb2, 0x13, 0xc4, 0x4c, 0xff, 
-	0x05, 0x1e, 0x40, 0x04, 0x03, 0xc4, 0x44, 0xff, 
-	0xe5, 0x9f, 0x50, 0x14, 0xe7, 0x95, 0x51, 0x04, 
-	0xe5, 0x9f, 0xe0, 0x00, 0xe1, 0x2f, 0xff, 0x15, 
-	0x2e, 0x01, 0xcb, 0x70, 0xe8, 0xbd, 0x5f, 0xf0, 
-	0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xe8, 
-	0x00, 0x00, 0x00, 0xc0, 0x46, 0x73, 0x47, 0x78, 
-	0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00, 
-	0xe3, 0x81, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe2, 0x01, 0x00, 0x80, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x40, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x40, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00, 
-	0xe3, 0x81, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe2, 0x01, 0x00, 0x40, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x80, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x40, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, 
-	0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 
-	0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 
-	0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x04, 
-	0x46, 0x73, 0x48, 0x03, 0x68, 0x00, 0x47, 0x18, 
-	0x46, 0x73, 0x49, 0x01, 0x60, 0x08, 0x47, 0x18, 
-	0x66, 0x00, 0x00, 0x08, 0x00, 0x00, 0x46, 0x6c, 
-	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, 
-	0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x15, 
-	0x00, 0x03, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x04, 0x90, 0x85, 0x00, 0x00, 0xa6, 0xee, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x08, 0x08, 0xa0, 0x00, 0x08, 0x08, 0x28, 
-	0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0xa0, 0x98, 
-	0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0x28, 0x98, 
-	0x00, 0x08, 0xac, 0xf4, 0x00, 0x08, 0xb8, 0x7c, 
-	0x00, 0x02, 0x02, 0x88, 0x00, 0x02, 0x08, 0x22, 
-	0x00, 0x02, 0x88, 0xaa, 0x00, 0x02, 0x22, 0xaa, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x04, 0x24, 
-	0x00, 0x04, 0x28, 0x6c, 0x00, 0x04, 0x28, 0x6c, 
-	0x00, 0x01, 0x10, 0x44, 0x00, 0x01, 0x20, 0x44, 
-	0x00, 0x01, 0x11, 0xaa, 0x00, 0x01, 0x88, 0x55, 
-	0x00, 0x01, 0x44, 0xaa, 0x00, 0x01, 0x44, 0x55, 
-	0x00, 0x20, 0x80, 0xa0, 0x00, 0x20, 0x80, 0xc0, 
-	0x00, 0x20, 0x20, 0xa0, 0x00, 0x20, 0x40, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x10, 0x10, 0x16, 0x18, 0x1b, 0x1d, 0x22, 0x25, 
-	0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x22, 0x26, 
-	0x16, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x25, 0x28, 
-	0x16, 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 
-	0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 0x3a, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x26, 0x2e, 0x38, 0x45, 
-	0x1b, 0x1d, 0x23, 0x26, 0x2e, 0x38, 0x45, 0x53, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x04, 0xd6, 0x00, 0x00, 0x1b, 0x08, 0x00, 
-	0x00, 0x1f, 0xde, 0x00, 0x00, 0x00, 0x50, 0x00, 
-	0x00, 0x09, 0xce, 0x00, 0x00, 0x13, 0x4c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x05, 0x28, 0x20, 0x01, 
-	0x00, 0x00, 0x02, 0x40, 0x71, 0x01, 0x00, 0x68, 
-	0xe0, 0x7f, 0xb0, 0x7f, 0x60, 0x40, 0xe0, 0x1d, 
-	0x90, 0x10, 0xb4, 0x81, 0xe8, 0xc0, 0xe0, 0xc2, 
-	0x90, 0x18, 0x00, 0x8a, 0x70, 0xc0, 0x0f, 0x87, 
-	0xe3, 0xe8, 0xc0, 0x00, 0x70, 0x40, 0xe0, 0x01, 
-	0xe0, 0x86, 0x00, 0x26, 0xd0, 0x28, 0xe0, 0x0e, 
-	0xd0, 0x0e, 0x0f, 0x0b, 0x70, 0x1d, 0xe0, 0x67, 
-	0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 
-	0x0f, 0x87, 0x02, 0x20, 0xd0, 0x01, 0xe0, 0x25, 
-	0x0f, 0x45, 0x6f, 0x81, 0xdf, 0xa6, 0xe0, 0x36, 
-	0xe1, 0x30, 0xa0, 0x37, 0xc0, 0x00, 0xe0, 0x26, 
-	0x00, 0x33, 0xdf, 0x00, 0xe0, 0x32, 0x0f, 0xc5, 
-	0x0f, 0x87, 0x00, 0x27, 0xd0, 0x4c, 0xe0, 0x21, 
-	0x00, 0x33, 0xdf, 0x60, 0x00, 0x27, 0xd0, 0x56, 
-	0x60, 0x01, 0xe0, 0x2d, 0x03, 0xa0, 0xd0, 0x41, 
-	0xa0, 0x78, 0x00, 0x60, 0xd0, 0x41, 0xa0, 0x77, 
-	0x00, 0x22, 0xd0, 0x58, 0xa0, 0x76, 0x00, 0x21, 
-	0xd0, 0x7c, 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 
-	0x00, 0x06, 0x0f, 0x87, 0x00, 0x22, 0xdc, 0xf8, 
-	0xf0, 0x4a, 0xe1, 0x70, 0x07, 0xef, 0xdd, 0xbf, 
-	0x4f, 0x36, 0x1d, 0x99, 0x4d, 0x80, 0x10, 0x18, 
-	0xdd, 0x50, 0x60, 0x35, 0xdd, 0x72, 0xdd, 0x10, 
-	0x3d, 0xb4, 0xec, 0x57, 0x2d, 0x36, 0x1d, 0x03, 
-	0xbd, 0x04, 0xe4, 0x2b, 0x01, 0x46, 0x00, 0x06, 
-	0xac, 0xf6, 0x80, 0x3f, 0x0d, 0x0a, 0x10, 0x02, 
-	0x7d, 0x40, 0x10, 0x1e, 0xb0, 0x20, 0xbc, 0xe0, 
-	0x00, 0x06, 0x00, 0xc6, 0xe0, 0x52, 0xb7, 0x60, 
-	0xb7, 0x60, 0xc0, 0x5d, 0x30, 0x5f, 0xe4, 0x72, 
-	0xc7, 0x5e, 0x00, 0xed, 0xd0, 0x28, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0xc0, 0x1d, 0x30, 0x1c, 
-	0xf8, 0x7e, 0x00, 0x21, 0xd0, 0x01, 0x00, 0x26, 
-	0xd0, 0x78, 0xa0, 0x38, 0x80, 0x3f, 0x70, 0x01, 
-	0xb0, 0x3f, 0x60, 0x01, 0x0f, 0x87, 0x80, 0x34, 
-	0x03, 0xef, 0xd8, 0x3f, 0xa8, 0x38, 0x01, 0x35, 
-	0xdc, 0x33, 0xe0, 0x46, 0xc0, 0x1c, 0xe4, 0xa5, 
-	0x97, 0x2e, 0x30, 0x1c, 0xe8, 0x8e, 0x00, 0x21, 
-	0xd0, 0x00, 0xa0, 0x38, 0xc0, 0x5d, 0x00, 0x23, 
-	0xd0, 0x00, 0x30, 0x40, 0x30, 0x5e, 0xe4, 0x99, 
-	0x20, 0x5e, 0xc0, 0x01, 0x30, 0x1c, 0xec, 0xa4, 
-	0xe0, 0x9d, 0x20, 0x5f, 0xc0, 0x1c, 0x30, 0x01, 
-	0xf4, 0xa5, 0xc0, 0x1c, 0x30, 0x1d, 0xec, 0xa4, 
-	0xe4, 0xa5, 0x90, 0x38, 0x00, 0x1b, 0xe8, 0xa5, 
-	0xa0, 0x66, 0xb1, 0x3f, 0xe4, 0xb3, 0xe8, 0xb1, 
-	0xc0, 0x4b, 0x30, 0x44, 0xf8, 0xb3, 0x60, 0x45, 
-	0xb1, 0x7c, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x72, 0xc5, 0x00, 0x06, 0x90, 0x55, 
-	0xd0, 0x01, 0x00, 0x40, 0xa0, 0x55, 0x0f, 0x87, 
-	0x01, 0x46, 0x00, 0x06, 0x03, 0xef, 0xd0, 0x3f, 
-	0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, 
-	0x82, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 0x80, 0x34, 
-	0x80, 0x3f, 0xf2, 0x1a, 0xd8, 0x00, 0xd8, 0x40, 
-	0xd8, 0x80, 0xd8, 0xc0, 0xd9, 0x00, 0xd9, 0x40, 
-	0xd9, 0x80, 0xd9, 0xc0, 0xda, 0x00, 0xda, 0x40, 
-	0xda, 0x80, 0xda, 0xc0, 0xdb, 0x00, 0xdb, 0x40, 
-	0xdb, 0x80, 0xdb, 0xc0, 0xdc, 0x00, 0xdc, 0x40, 
-	0xdc, 0x80, 0xdc, 0xc0, 0xdd, 0x00, 0xdd, 0x40, 
-	0xdd, 0x80, 0xdd, 0xc0, 0xde, 0x00, 0xde, 0x40, 
-	0xde, 0x80, 0xde, 0xc0, 0xdf, 0x00, 0xdf, 0x40, 
-	0xdf, 0x80, 0xdf, 0xc0, 0xde, 0x80, 0xde, 0xc1, 
-	0x00, 0x28, 0xd0, 0x60, 0x6e, 0x81, 0x80, 0x00, 
-	0x80, 0x05, 0x00, 0xe3, 0xd1, 0x88, 0x00, 0x73, 
-	0xd5, 0x80, 0x60, 0x06, 0xb1, 0xbc, 0x00, 0xfa, 
-	0xd0, 0x80, 0x60, 0x06, 0x00, 0x26, 0xd0, 0x6c, 
-	0x6e, 0x81, 0x04, 0xf4, 0xdc, 0x00, 0x00, 0xee, 
-	0xd1, 0x94, 0x60, 0x06, 0x00, 0xed, 0xd0, 0x50, 
-	0x6e, 0x81, 0x00, 0x22, 0xd0, 0x70, 0x6e, 0x81, 
-	0x00, 0xee, 0xd0, 0x74, 0x6e, 0x81, 0xd0, 0x4c, 
-	0x6e, 0x81, 0xd0, 0x02, 0x00, 0xef, 0xd0, 0x6c, 
-	0x60, 0x01, 0xd0, 0x03, 0x00, 0xef, 0xd0, 0x70, 
-	0x60, 0x01, 0x00, 0xe0, 0xd0, 0x48, 0xd0, 0x02, 
-	0x60, 0x01, 0x00, 0x32, 0xdf, 0x20, 0xa0, 0x1c, 
-	0x00, 0x21, 0xd0, 0x60, 0xa0, 0x76, 0x00, 0x34, 
-	0xd5, 0x70, 0x80, 0x3f, 0x00, 0x23, 0xd0, 0x5c, 
-	0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 
-	0x00, 0x22, 0xd1, 0xa4, 0x6e, 0xc6, 0xd0, 0x58, 
-	0x6e, 0xc1, 0xd0, 0xc9, 0x00, 0xed, 0xd0, 0x54, 
-	0x60, 0xc1, 0x00, 0x22, 0xd0, 0x40, 0x60, 0xc1, 
-	0x00, 0x22, 0xd0, 0x60, 0x60, 0xc1, 0x82, 0x34, 
-	0x80, 0x3f, 0xd6, 0xd9, 0x01, 0x2d, 0xd6, 0x0c, 
-	0x16, 0x08, 0xd0, 0x55, 0xd0, 0x2c, 0x60, 0x40, 
-	0xd0, 0x70, 0x00, 0xfb, 0xd1, 0x00, 0x60, 0x01, 
-	0x00, 0x2b, 0xd4, 0x10, 0x00, 0x29, 0xd4, 0x40, 
-	0x00, 0x2b, 0xd0, 0x90, 0xc0, 0xc2, 0xd1, 0x18, 
-	0xd1, 0x44, 0xa1, 0x50, 0x00, 0x21, 0xd0, 0xb6, 
-	0xd0, 0xd7, 0x00, 0x29, 0xd0, 0x04, 0x64, 0x00, 
-	0xb0, 0x3c, 0x64, 0x40, 0x80, 0x34, 0x80, 0x3f, 
-	0xd0, 0x40, 0x00, 0x35, 0xd0, 0x00, 0x60, 0x01, 
-	0xd0, 0x48, 0x6e, 0x81, 0xd0, 0x44, 0x6e, 0x81, 
-	0x00, 0x64, 0xd1, 0x80, 0x6e, 0x86, 0x01, 0x3c, 
-	0xd2, 0x39, 0xe0, 0x46, 0xd0, 0x00, 0xd0, 0x40, 
-	0xd0, 0x80, 0xd0, 0xc0, 0xd1, 0x00, 0xd1, 0x40, 
-	0xd1, 0x80, 0xd1, 0xc0, 0xd2, 0x00, 0xd2, 0x40, 
-	0xd2, 0x80, 0xd2, 0xc0, 0xd3, 0x00, 0xd3, 0x40, 
-	0xd3, 0x80, 0xd3, 0xc0, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0xd5, 0x00, 0xd5, 0x40, 
-	0xd5, 0x80, 0xd5, 0xc0, 0xd6, 0x00, 0xd6, 0x40, 
-	0xd6, 0x80, 0xd6, 0xc0, 0xd7, 0x00, 0xd7, 0x40, 
-	0xd7, 0x80, 0xd7, 0xc0, 0x0f, 0xc5, 0x50, 0x00, 
-	0x01, 0x46, 0x00, 0x06, 0xde, 0x80, 0xde, 0xc1, 
-	0x03, 0x2f, 0xd0, 0x33, 0xa0, 0x38, 0xb0, 0x01, 
-	0xa0, 0x37, 0x80, 0x3f, 0x08, 0x20, 0xdf, 0x00, 
-	0x82, 0x34, 0x80, 0x3f, 0x00, 0xee, 0xd0, 0x08, 
-	0x77, 0xc0, 0xb0, 0x04, 0x77, 0x80, 0xb0, 0x04, 
-	0xc0, 0x5f, 0x30, 0x5e, 0x60, 0x40, 0xd7, 0x00, 
-	0xb7, 0x01, 0x80, 0x34, 0x80, 0x3f, 0x00, 0x60, 
-	0xd0, 0x80, 0x00, 0xec, 0xd0, 0x40, 0x60, 0x81, 
-	0xb0, 0x7c, 0x60, 0x81, 0x00, 0xa0, 0xd0, 0x80, 
-	0xb0, 0x74, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, 
-	0x00, 0x68, 0xd0, 0x80, 0x6e, 0x82, 0x00, 0xef, 
-	0xd0, 0x8c, 0x6e, 0x82, 0x00, 0x06, 0xd0, 0x11, 
-	0xa0, 0x38, 0x80, 0x3f, 0x08, 0x20, 0xd0, 0x40, 
-	0x10, 0x48, 0xa0, 0x4a, 0xa0, 0x5b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0xa0, 0x0a, 
-	0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 
-	0xa0, 0x4d, 0x80, 0x0a, 0x80, 0x07, 0x80, 0x1b, 
-	0x80, 0x27, 0x00, 0x60, 0xd0, 0x00, 0xa0, 0x09, 
-	0x80, 0x28, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, 
-	0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0xea, 0xd0, 0x00, 
-	0xd0, 0x4e, 0x0f, 0x0b, 0x70, 0x40, 0x00, 0x06, 
-	0x00, 0x21, 0xd0, 0x88, 0x00, 0xe1, 0xd0, 0x60, 
-	0x60, 0x81, 0x00, 0x2b, 0xd0, 0x80, 0x00, 0xe0, 
-	0xd0, 0x6c, 0x60, 0x81, 0xb0, 0x7c, 0x00, 0x29, 
-	0xd0, 0x80, 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x82, 
-	0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x85, 0x60, 0x81, 
-	0xb0, 0x7c, 0x03, 0xaa, 0xd0, 0x98, 0x60, 0x81, 
-	0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 0xd0, 0x40, 
-	0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0xb0, 0x7c, 
-	0x6e, 0x81, 0x00, 0x27, 0xd1, 0x90, 0x6e, 0x86, 
-	0x00, 0x21, 0xd1, 0xb8, 0x6e, 0x86, 0x00, 0x66, 
-	0xd1, 0xa0, 0xd0, 0x00, 0x01, 0x64, 0xd0, 0x58, 
-	0x30, 0x01, 0x60, 0x06, 0x00, 0xed, 0xd1, 0xbc, 
-	0x6e, 0x86, 0x00, 0xec, 0xd1, 0xb8, 0x6e, 0x86, 
-	0xb1, 0x84, 0x6e, 0x86, 0x00, 0xee, 0xd1, 0x84, 
-	0x70, 0x46, 0x00, 0x65, 0xd1, 0x94, 0x60, 0x46, 
-	0x00, 0x64, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0x65, 
-	0xd1, 0x80, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, 
-	0xb1, 0xbc, 0x6e, 0x86, 0x00, 0xed, 0xd1, 0xa8, 
-	0x6e, 0x86, 0xd0, 0x0e, 0xb1, 0xbc, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 
-	0x60, 0x06, 0x00, 0x28, 0xd1, 0xa4, 0x6e, 0x86, 
-	0x00, 0x27, 0xd1, 0x98, 0x6e, 0x86, 0x00, 0x64, 
-	0xd1, 0xa4, 0x6e, 0x86, 0xd2, 0x01, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0x00, 0x64, 0xd1, 0x80, 
-	0x70, 0x46, 0x6e, 0x86, 0x00, 0xef, 0xd1, 0x98, 
-	0x70, 0x86, 0x08, 0x20, 0xd0, 0xcf, 0x30, 0xc1, 
-	0xea, 0x42, 0xd0, 0x81, 0x00, 0x21, 0xd1, 0xa8, 
-	0x60, 0x86, 0x00, 0xed, 0xd1, 0xa0, 0x6e, 0xc6, 
-	0x00, 0x65, 0xd1, 0x98, 0x6e, 0xc6, 0x00, 0x22, 
-	0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xc6, 
-	0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x50, 0x00, 
-	0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x00, 0x64, 
-	0xd0, 0x60, 0x70, 0xc1, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0xb0, 0x7c, 0x71, 0xc1, 0xc0, 0x87, 
-	0x30, 0x86, 0xf9, 0x83, 0x10, 0xee, 0xe9, 0x76, 
-	0x10, 0xe1, 0xe9, 0x76, 0xe2, 0x57, 0x00, 0x63, 
-	0xd0, 0xbf, 0x72, 0x06, 0xb1, 0xbc, 0x41, 0x82, 
-	0x02, 0x1b, 0xe9, 0x8d, 0x72, 0x86, 0xb1, 0xbc, 
-	0x41, 0x82, 0xd0, 0x75, 0x30, 0x48, 0xe9, 0xfe, 
-	0xb0, 0x7f, 0xea, 0x00, 0x02, 0x1c, 0xe9, 0x96, 
-	0x15, 0xa3, 0xea, 0x57, 0x10, 0xf0, 0xe9, 0x9a, 
-	0x10, 0xfa, 0xf9, 0xa1, 0x15, 0xa3, 0xea, 0x57, 
-	0x00, 0x21, 0xd0, 0x4c, 0x70, 0x41, 0x10, 0x61, 
-	0xfa, 0x57, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, 
-	0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x64, 0x62, 0x01, 0x12, 0x2b, 0xe9, 0xeb, 
-	0x12, 0x3b, 0xe9, 0xd5, 0x00, 0xec, 0xd0, 0x40, 
-	0x61, 0x81, 0x12, 0x2d, 0xe9, 0xbf, 0x12, 0x30, 
-	0xe9, 0xd4, 0x12, 0x36, 0xe9, 0xd4, 0x12, 0x3a, 
-	0xe9, 0xd4, 0xd0, 0x62, 0x30, 0x48, 0xe9, 0xf2, 
-	0x12, 0x2e, 0xe9, 0xf9, 0xe1, 0x76, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, 
-	0x60, 0x40, 0xb0, 0x08, 0x00, 0x21, 0xd0, 0x41, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0xf2, 0x5a, 0x00, 0xed, 0xd0, 0x20, 0xd0, 0x41, 
-	0x60, 0x40, 0x10, 0xe1, 0xea, 0x3a, 0xe2, 0x57, 
-	0xe2, 0x53, 0x10, 0xee, 0xf9, 0xe9, 0x01, 0x46, 
-	0x82, 0x34, 0x80, 0x3f, 0x97, 0x2e, 0xc7, 0x5c, 
-	0xa7, 0x66, 0x81, 0x34, 0x80, 0x3f, 0x00, 0x21, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0xc6, 0x00, 0x21, 
-	0xd0, 0x15, 0x0b, 0x09, 0x00, 0x4d, 0xb0, 0x01, 
-	0xed, 0xe5, 0xd2, 0x1a, 0xe1, 0xec, 0xf1, 0x18, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xd0, 0x4e, 
-	0x60, 0x46, 0xe2, 0x54, 0xc0, 0x0a, 0x10, 0x06, 
-	0x52, 0x80, 0x00, 0xed, 0xd0, 0x40, 0x62, 0x81, 
-	0xe2, 0x53, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0xf2, 0x5a, 0xe1, 0x70, 0x12, 0xa3, 0xf6, 0x57, 
-	0x15, 0xa1, 0xfa, 0x57, 0x12, 0xa0, 0xea, 0x23, 
-	0x00, 0x65, 0xd1, 0x1c, 0xd0, 0x75, 0x30, 0x48, 
-	0xea, 0x0a, 0xb1, 0x3c, 0x71, 0x04, 0x11, 0x20, 
-	0xfa, 0x11, 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 
-	0xe2, 0x57, 0x12, 0xa1, 0xea, 0x33, 0x00, 0xe2, 
-	0xd0, 0x60, 0x70, 0x01, 0xb0, 0x7c, 0x70, 0x41, 
-	0x10, 0x0c, 0x50, 0x40, 0x0c, 0x30, 0xd0, 0x00, 
-	0x31, 0x01, 0xee, 0x21, 0x21, 0x00, 0xe6, 0x57, 
-	0xe2, 0x23, 0x31, 0x00, 0xfe, 0x57, 0xd0, 0x75, 
-	0x30, 0x48, 0xea, 0x28, 0xf2, 0x5a, 0xe2, 0x0d, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0x00, 0x63, 
-	0xd1, 0x3f, 0xb1, 0xbc, 0x41, 0x84, 0x61, 0x81, 
-	0xd0, 0x50, 0x60, 0x46, 0xe2, 0x57, 0x00, 0xed, 
-	0xd0, 0x7c, 0x70, 0x41, 0x08, 0x20, 0xd0, 0x00, 
-	0x10, 0x08, 0xe2, 0x1c, 0xd2, 0x84, 0x00, 0xed, 
-	0xd1, 0xa4, 0x62, 0x86, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc7, 0x5e, 
-	0x97, 0x2e, 0x81, 0x34, 0x80, 0x3f, 0x02, 0xe8, 
-	0xd0, 0x30, 0xa0, 0x37, 0xa0, 0x38, 0x08, 0x20, 
-	0xdf, 0x00, 0x80, 0x73, 0x80, 0x3f, 0x00, 0xc6, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0xf2, 0x5a, 
-	0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 0x02, 0x3c, 
-	0xdc, 0x89, 0xe0, 0x46, 0x00, 0x28, 0xd0, 0x64, 
-	0x70, 0x81, 0x00, 0x22, 0xd0, 0x00, 0x50, 0x80, 
-	0x60, 0x81, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x00, 0xef, 
-	0xd1, 0x90, 0x70, 0x46, 0x10, 0x5c, 0x10, 0x65, 
-	0xed, 0x7d, 0xd0, 0x46, 0xc0, 0x0a, 0x10, 0x40, 
-	0x60, 0x46, 0x00, 0x22, 0xd0, 0x73, 0x30, 0x54, 
-	0xe9, 0x8e, 0x12, 0xa4, 0xe9, 0xb5, 0x15, 0x20, 
-	0xe9, 0xc0, 0xb0, 0x7b, 0xe9, 0xc3, 0xb0, 0x41, 
-	0xe9, 0xc9, 0xc0, 0x54, 0x10, 0x5c, 0x10, 0x6e, 
-	0xe9, 0xc6, 0xe1, 0xb5, 0x00, 0x28, 0xd1, 0xb0, 
-	0xd0, 0x00, 0x60, 0x06, 0x12, 0xa4, 0xf9, 0xb2, 
-	0x00, 0xed, 0xd1, 0x9c, 0x62, 0x86, 0xd2, 0x80, 
-	0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 0xd0, 0x02, 
-	0x00, 0xec, 0xd1, 0xbc, 0x60, 0x06, 0x00, 0x64, 
-	0xd1, 0xa0, 0x72, 0x06, 0x12, 0x21, 0xf9, 0xa6, 
-	0xd2, 0x0d, 0x62, 0x06, 0x00, 0xed, 0xd1, 0xa0, 
-	0x61, 0x86, 0xd0, 0x0e, 0x00, 0xed, 0xd1, 0xac, 
-	0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 
-	0xd1, 0xa4, 0x60, 0x06, 0x01, 0x7e, 0xd2, 0x32, 
-	0xe1, 0xcb, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, 
-	0xd0, 0x00, 0x50, 0x40, 0xa0, 0x49, 0x80, 0x3f, 
-	0x00, 0xc6, 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0x70, 
-	0x01, 0xbf, 0xd0, 0x41, 0xe1, 0xcb, 0x01, 0xbb, 
-	0xda, 0x10, 0xe1, 0xcb, 0x01, 0xbd, 0xda, 0x0b, 
-	0xe1, 0xcb, 0x03, 0xb9, 0xd8, 0x10, 0x01, 0x46, 
-	0x90, 0x49, 0x00, 0x60, 0xd1, 0x00, 0x50, 0x44, 
-	0x30, 0x44, 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 
-	0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x00, 0x26, 0xd0, 0x18, 0xd0, 0x40, 
-	0x60, 0x40, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 
-	0xd0, 0x82, 0x50, 0x42, 0x60, 0x40, 0x00, 0xec, 
-	0xd0, 0xa4, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x81, 
-	0x00, 0xec, 0xd1, 0x98, 0xd0, 0x41, 0x60, 0x46, 
-	0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x8e, 0xd0, 0x40, 
-	0x60, 0x46, 0xe1, 0x81, 0xd0, 0x40, 0x00, 0xe6, 
-	0xd0, 0x10, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, 
-	0xb0, 0x3c, 0x60, 0x40, 0xd0, 0xe0, 0x00, 0xea, 
-	0xd0, 0x40, 0x00, 0xe8, 0xd0, 0x82, 0x01, 0x46, 
-	0x70, 0x01, 0xb0, 0x7c, 0x60, 0x02, 0xb0, 0xbc, 
-	0x00, 0x06, 0x00, 0xc6, 0xb0, 0xc1, 0xed, 0x9b, 
-	0x80, 0x49, 0xd6, 0x44, 0xd5, 0x43, 0x00, 0xe0, 
-	0xd1, 0x80, 0x00, 0x06, 0x0b, 0x09, 0x01, 0x0d, 
-	0x0b, 0x09, 0x61, 0x06, 0xb1, 0xbc, 0x01, 0x4d, 
-	0x09, 0x09, 0x61, 0x46, 0xb1, 0xbc, 0x00, 0xcd, 
-	0x09, 0x09, 0x10, 0xe4, 0xed, 0xb8, 0x60, 0xc6, 
-	0xb1, 0xbc, 0x00, 0xcd, 0x60, 0xc6, 0x00, 0xed, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xf9, 0xd8, 
-	0xd0, 0x0a, 0x40, 0x03, 0xe9, 0xc9, 0x10, 0xe2, 
-	0xe9, 0xc9, 0x10, 0xe7, 0xe9, 0xc9, 0x10, 0xe8, 
-	0xf9, 0xd8, 0x01, 0x46, 0x90, 0x10, 0x00, 0x20, 
-	0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6, 0xa0, 0x50, 
-	0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 
-	0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04, 0x60, 0x06, 
-	0x00, 0xee, 0xd1, 0xac, 0x73, 0x86, 0x10, 0xe3, 
-	0xe5, 0xe3, 0xe9, 0xe8, 0x00, 0xe7, 0xd0, 0x40, 
-	0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xec, 0x01, 0x24, 
-	0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6, 0xe1, 0xec, 
-	0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8, 0xd0, 0x90, 
-	0x13, 0xa0, 0xf9, 0xef, 0xc0, 0x42, 0x00, 0xe0, 
-	0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98, 0x0b, 0xc9, 
-	0x00, 0x4d, 0x09, 0x09, 0x10, 0x44, 0x00, 0x8d, 
-	0x20, 0x42, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xb8, 
-	0x00, 0x90, 0xea, 0x1c, 0x0a, 0x89, 0x00, 0x8d, 
-	0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x10, 0x00, 0xe8, 
-	0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xfa, 0x1c, 
-	0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x20, 0x00, 0xe9, 
-	0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xea, 0x20, 
-	0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40, 0x60, 0x46, 
-	0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0x46, 
-	0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86, 0xb0, 0xb0, 
-	0xee, 0x2a, 0xd0, 0x81, 0x00, 0x90, 0xea, 0x2d, 
-	0x20, 0x01, 0x10, 0x41, 0x10, 0x9f, 0x10, 0xa0, 
-	0xee, 0x2a, 0x10, 0x1c, 0x00, 0x65, 0xd1, 0xa8, 
-	0x60, 0x06, 0x01, 0xb4, 0xd6, 0x3a, 0xe0, 0x46, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x0c, 0x09, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xe9, 0xea, 
-	0xb0, 0x7d, 0xfa, 0x05, 0x09, 0x09, 0x01, 0xcd, 
-	0x11, 0xe1, 0xf9, 0xc7, 0x80, 0x09, 0x80, 0x27, 
-	0x0a, 0x09, 0xd6, 0x45, 0x00, 0xe1, 0xd1, 0xa0, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0x00, 0x50, 0xe9, 0x91, 
-	0xd4, 0x01, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0x00, 0xe0, 0xd1, 0x80, 0x08, 0x89, 
-	0x00, 0x4d, 0x08, 0x89, 0x10, 0x4c, 0x71, 0x06, 
-	0x21, 0x01, 0x61, 0x06, 0xb1, 0xbc, 0x00, 0x4d, 
-	0x0b, 0x49, 0x10, 0x4c, 0x71, 0x46, 0x21, 0x41, 
-	0x61, 0x46, 0xb1, 0xb0, 0x00, 0x4d, 0x10, 0x5f, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, 
-	0x10, 0x4a, 0x70, 0x86, 0x20, 0x81, 0x60, 0x86, 
-	0x00, 0xe1, 0xd1, 0xac, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x09, 0x49, 0x00, 0x8d, 
-	0x60, 0x86, 0xc0, 0x02, 0x00, 0xe0, 0xd1, 0xa8, 
-	0x70, 0xc6, 0x10, 0xc0, 0xd0, 0x20, 0x30, 0x01, 
-	0x10, 0xc0, 0x60, 0xc6, 0xe1, 0x75, 0x11, 0xe2, 
-	0xf9, 0x75, 0x00, 0xe2, 0xd1, 0x80, 0x08, 0xc9, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x10, 0x60, 
-	0xf9, 0xd7, 0xb1, 0xb4, 0xe1, 0xde, 0xd2, 0x03, 
-	0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0xb2, 0x01, 0xf9, 0xd8, 0x0b, 0xc9, 0x00, 0x4d, 
-	0x10, 0x49, 0x10, 0x56, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x89, 0x00, 0x4d, 0x10, 0x4a, 0x10, 0x56, 
-	0x60, 0x46, 0xe1, 0x75, 0x0b, 0x2c, 0xd4, 0x40, 
-	0xf3, 0xb0, 0xe1, 0x77, 0x00, 0xe0, 0xd0, 0x6c, 
-	0x00, 0xe0, 0xd1, 0x80, 0xd0, 0x0a, 0xf1, 0xfe, 
-	0x00, 0xe1, 0xd1, 0xb0, 0xd0, 0x02, 0xf1, 0xfe, 
-	0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0xb1, 0xbc, 
-	0x73, 0x46, 0xe2, 0x3c, 0x70, 0x81, 0x60, 0x86, 
-	0xb1, 0xbc, 0xb0, 0x7c, 0xb0, 0x01, 0xed, 0xfe, 
-	0x0f, 0xc5, 0x00, 0xe1, 0xd1, 0xa0, 0x70, 0x46, 
-	0xd0, 0x8f, 0x40, 0x42, 0x00, 0x25, 0xd0, 0xe0, 
-	0x00, 0x24, 0xd1, 0x20, 0x10, 0x6a, 0xea, 0x1e, 
-	0x00, 0x66, 0xd0, 0xe0, 0x00, 0x62, 0xd1, 0x00, 
-	0x10, 0x66, 0xea, 0x1e, 0x00, 0x6e, 0xd0, 0xc0, 
-	0x10, 0x64, 0xea, 0x1e, 0x00, 0x2b, 0xd0, 0xd0, 
-	0x00, 0x29, 0xd1, 0x00, 0x00, 0xe0, 0xd1, 0x80, 
-	0x76, 0x86, 0x16, 0xa0, 0xe9, 0xee, 0x30, 0xda, 
-	0xe5, 0xee, 0xb1, 0xbc, 0x73, 0x46, 0x13, 0x60, 
-	0xe9, 0xee, 0x31, 0x0d, 0xe5, 0xee, 0xd0, 0x82, 
-	0xb1, 0xbc, 0x70, 0x46, 0x10, 0x60, 0xe9, 0xee, 
-	0xb0, 0x81, 0xee, 0x2c, 0x00, 0xe0, 0xd0, 0x40, 
-	0x00, 0xe0, 0xd1, 0xac, 0xd0, 0x0a, 0xf1, 0xfe, 
-	0x00, 0xe1, 0xd0, 0x70, 0xd0, 0x02, 0xf1, 0xfe, 
-	0x00, 0xec, 0xd1, 0x98, 0xd0, 0x40, 0x60, 0x46, 
-	0x00, 0xe0, 0xd0, 0x8c, 0x70, 0x82, 0x00, 0x21, 
-	0xd0, 0x70, 0x60, 0x81, 0xd0, 0x40, 0x00, 0x25, 
-	0xd0, 0x20, 0x30, 0x1a, 0xfa, 0x50, 0x00, 0x24, 
-	0xd0, 0x20, 0x30, 0x0d, 0xfa, 0x50, 0xd0, 0x41, 
-	0x00, 0x21, 0xd1, 0x84, 0x60, 0x46, 0xb6, 0xb1, 
-	0x16, 0x9c, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x00, 0xec, 0xd0, 0xa8, 0x70, 0xc2, 
-	0x10, 0xe0, 0xf9, 0x77, 0x00, 0xec, 0xd1, 0x9c, 
-	0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 
-	0xe9, 0x84, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x77, 
-	0x0b, 0x49, 0x00, 0xe2, 0xd1, 0xa0, 0x00, 0x4d, 
-	0x10, 0x5f, 0x00, 0x6f, 0xd0, 0xff, 0x40, 0x43, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x61, 0xf9, 0x9b, 0xd3, 0xc2, 
-	0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0x0c, 0x09, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x9c, 0x00, 0x06, 
-	0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 
-	0xf9, 0xa9, 0x0b, 0xa0, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe1, 0xa0, 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x40, 
-	0x60, 0x46, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x0b, 0x09, 0x00, 0x4d, 0x0b, 0x09, 0x00, 0x4d, 
-	0x0a, 0x09, 0x01, 0x4d, 0x0a, 0x09, 0x00, 0x4d, 
-	0x01, 0x59, 0xe9, 0x96, 0x09, 0x09, 0x00, 0x4d, 
-	0x10, 0x5f, 0x10, 0x61, 0xf9, 0x96, 0x09, 0x09, 
-	0x01, 0x4d, 0x11, 0x5f, 0x0b, 0xc9, 0x00, 0x4d, 
-	0xc0, 0x01, 0x10, 0x5f, 0x11, 0x4e, 0x51, 0x41, 
-	0x08, 0x49, 0x00, 0x4d, 0x0b, 0xc9, 0x10, 0x0f, 
-	0x00, 0x4d, 0x50, 0x01, 0x00, 0xed, 0xd1, 0xb6, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x3c, 0xa1, 0x7d, 
-	0x60, 0x06, 0x00, 0xc6, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x00, 0xec, 0xd0, 0xac, 0x70, 0xc2, 0x10, 0xe0, 
-	0xf9, 0x70, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x41, 
-	0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x7f, 
-	0xd0, 0x40, 0x60, 0x46, 0xe1, 0x70, 0x0a, 0x89, 
-	0x0b, 0xcd, 0x00, 0xe3, 0xd1, 0x80, 0x6b, 0xc6, 
-	0x08, 0xc9, 0x05, 0x8d, 0x15, 0xa3, 0xee, 0x6e, 
-	0x15, 0xa0, 0xea, 0x6e, 0x90, 0x4d, 0xd0, 0x9f, 
-	0xd0, 0xdf, 0x40, 0x81, 0x10, 0x55, 0x40, 0xc1, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0x1d, 
-	0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0xd1, 0x23, 
-	0x31, 0x03, 0x11, 0x02, 0x38, 0x04, 0xb0, 0x8d, 
-	0x10, 0x9d, 0x28, 0x02, 0xc0, 0x60, 0x00, 0x65, 
-	0xd1, 0x94, 0x71, 0x06, 0x68, 0x06, 0x30, 0x44, 
-	0x00, 0xed, 0xd1, 0xa8, 0x70, 0x06, 0x10, 0x20, 
-	0xe9, 0xb0, 0x00, 0xee, 0xd0, 0xc0, 0x70, 0xc3, 
-	0x20, 0x43, 0xb0, 0x01, 0xf9, 0xac, 0x60, 0x06, 
-	0x00, 0x64, 0xd1, 0xbc, 0x71, 0x06, 0xc0, 0x04, 
-	0x21, 0x01, 0x61, 0x06, 0x10, 0x20, 0xf5, 0xbb, 
-	0x11, 0x20, 0xe5, 0xbb, 0xb0, 0x41, 0x00, 0x65, 
-	0xd1, 0x80, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, 
-	0x00, 0xed, 0xd1, 0xac, 0x71, 0x06, 0x15, 0xa1, 
-	0xe9, 0xcb, 0xb1, 0x3f, 0x61, 0x06, 0x15, 0xa3, 
-	0xf9, 0xd6, 0xd0, 0xbf, 0xe1, 0xd3, 0xd0, 0x40, 
-	0x60, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x61, 0x06, 
-	0x31, 0x02, 0xe5, 0xd3, 0x20, 0x84, 0x00, 0x65, 
-	0xd1, 0xa4, 0x60, 0x86, 0xd9, 0x40, 0x00, 0xec, 
-	0xd1, 0x94, 0x79, 0x06, 0xb1, 0x84, 0x78, 0xc6, 
-	0xc0, 0x63, 0x30, 0x64, 0xe9, 0xf8, 0x00, 0xa7, 
-	0xd0, 0xff, 0x7a, 0x63, 0x00, 0x65, 0xd0, 0x00, 
-	0x71, 0x00, 0x31, 0x29, 0xe5, 0xf8, 0xc0, 0x63, 
-	0xc8, 0xc1, 0xb0, 0x78, 0x40, 0x43, 0xc0, 0xa4, 
-	0x30, 0x81, 0xe9, 0xf2, 0x7a, 0x41, 0x31, 0x29, 
-	0xf5, 0xe8, 0x21, 0x29, 0x61, 0x00, 0xb8, 0xfc, 
-	0x79, 0x63, 0xb8, 0xfc, 0x48, 0xc3, 0x68, 0xc6, 
-	0x00, 0xed, 0xd1, 0xb8, 0x69, 0x46, 0x80, 0x28, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 
-	0x00, 0xe3, 0xd1, 0x84, 0x00, 0x8d, 0x20, 0x42, 
-	0x60, 0x46, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x86, 
-	0x10, 0xa1, 0xee, 0x18, 0xe6, 0x6b, 0x90, 0x86, 
-	0x00, 0x90, 0xea, 0x18, 0x00, 0xed, 0xd0, 0x1c, 
-	0x70, 0x80, 0xb0, 0x81, 0xe6, 0x6b, 0x60, 0x80, 
-	0xb1, 0xa8, 0x70, 0x86, 0x10, 0xa0, 0xfa, 0x6b, 
-	0x00, 0x21, 0xd0, 0x38, 0x70, 0x80, 0x10, 0xa0, 
-	0xfa, 0x6b, 0x0f, 0xef, 0xd0, 0xbf, 0x30, 0x81, 
-	0xfa, 0x22, 0x60, 0x00, 0x08, 0x20, 0xd0, 0x00, 
-	0x5f, 0x00, 0x15, 0xa3, 0xea, 0x6b, 0x00, 0xee, 
-	0xd1, 0x80, 0x79, 0x46, 0x00, 0xf8, 0xd0, 0x00, 
-	0xc4, 0x40, 0x00, 0xe3, 0xd1, 0x84, 0x78, 0x46, 
-	0x0f, 0xef, 0xd0, 0x3f, 0x30, 0x21, 0xea, 0x48, 
-	0x00, 0xe0, 0xd1, 0x90, 0x78, 0x06, 0xc0, 0xa1, 
-	0x18, 0x43, 0x28, 0x42, 0x18, 0x43, 0x28, 0x42, 
-	0x18, 0x1e, 0xd8, 0x80, 0x08, 0x11, 0xea, 0x41, 
-	0x28, 0xa1, 0x18, 0x01, 0x18, 0x5f, 0x18, 0x60, 
-	0xee, 0x3e, 0xc0, 0x51, 0x30, 0x62, 0xee, 0x4e, 
-	0xc8, 0x91, 0x18, 0x9f, 0x00, 0x21, 0xd1, 0xb8, 
-	0xd0, 0x01, 0x60, 0x06, 0x00, 0xef, 0xd0, 0x10, 
-	0xd0, 0x72, 0x60, 0x40, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc8, 0xdc, 0xc9, 0x1d, 0x81, 0x34, 
-	0x80, 0x3f, 0x00, 0xc6, 0x38, 0xe4, 0xee, 0x5e, 
-	0xea, 0x52, 0x28, 0xe5, 0x01, 0x46, 0x90, 0x6d, 
-	0x28, 0xc1, 0x00, 0xc6, 0x38, 0xe2, 0xf6, 0x6b, 
-	0xdb, 0x08, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x21, 
-	0xd1, 0xb4, 0x61, 0x86, 0xe2, 0x52, 0x01, 0xf7, 
-	0xd2, 0x19, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xdb, 0x09, 0x00, 0xe3, 0xd0, 0x1c, 
-	0x6b, 0x00, 0xda, 0xc1, 0x00, 0xe6, 0xd1, 0x98, 
-	0x70, 0x06, 0xb1, 0x84, 0x60, 0x06, 0xb1, 0x84, 
-	0x60, 0x06, 0x05, 0x9f, 0xe9, 0x9f, 0x08, 0x49, 
-	0xd1, 0x17, 0x46, 0x44, 0x00, 0x4d, 0x10, 0x43, 
-	0x26, 0x41, 0x08, 0xc9, 0x05, 0xcd, 0xb5, 0xc1, 
-	0xe5, 0xcc, 0xc0, 0x57, 0x15, 0xc6, 0x25, 0xc1, 
-	0x15, 0xa3, 0xf9, 0x9f, 0x08, 0x49, 0xd1, 0x0f, 
-	0x46, 0x44, 0x00, 0x4d, 0x10, 0x44, 0x26, 0x41, 
-	0x08, 0xc9, 0x06, 0x0d, 0xb6, 0x01, 0xe5, 0xcc, 
-	0xc0, 0x58, 0x16, 0x06, 0x26, 0x01, 0x08, 0x49, 
-	0x00, 0x4d, 0x10, 0x60, 0xe9, 0xa6, 0x0a, 0x09, 
-	0x00, 0x4d, 0xe1, 0x9f, 0x0c, 0x09, 0x90, 0x4d, 
-	0x10, 0x60, 0xe5, 0xa7, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xb3, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xab, 0xb0, 0x7d, 
-	0xf9, 0xb8, 0x02, 0x34, 0xd4, 0x44, 0xe0, 0x46, 
-	0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 
-	0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec, 0xd1, 0x80, 
-	0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 
-	0xe8, 0x46, 0x15, 0x63, 0xe9, 0xc9, 0x05, 0x5e, 
-	0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0xcc, 0xc0, 0xcd, 0x01, 0xcd, 0x42, 0xcd, 0x83, 
-	0x00, 0xa0, 0xd0, 0x01, 0xa0, 0x38, 0xc8, 0x7f, 
-	0xc8, 0x06, 0xb1, 0xbe, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x58, 0xc0, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 
-	0xc0, 0x22, 0xc0, 0x65, 0xc0, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0x00, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x92, 0x58, 0x80, 0xc0, 0x23, 0xc0, 0x62, 
-	0xd0, 0x88, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc8, 0xc0, 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 
-	0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 0xc0, 0x24, 
-	0xc0, 0x67, 0xd0, 0x90, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x80, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x96, 0xca, 0x00, 
-	0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xca, 0x40, 
-	0xf3, 0x92, 0x59, 0x00, 0xc0, 0x25, 0xc0, 0x64, 
-	0xd0, 0x98, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x40, 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 
-	0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x23, 
-	0xc0, 0x64, 0xd0, 0x84, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x59, 0x40, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x5a, 0x40, 
-	0xc0, 0x26, 0xc0, 0x69, 0xd0, 0xa0, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 
-	0x5a, 0x00, 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 
-	0x5a, 0x40, 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 
-	0x59, 0x80, 0xc0, 0x27, 0xc0, 0x66, 0xd0, 0xa8, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x58, 0xc0, 0xc0, 0x22, 0xc0, 0x63, 
-	0xd0, 0x8c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x59, 0x80, 0xc0, 0x25, 0xc0, 0x66, 0xd0, 0x94, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x28, 0xc0, 0x6a, 
-	0xd0, 0xb0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x29, 
-	0xc0, 0x65, 0xd0, 0xb8, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, 
-	0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x58, 0x80, 
-	0xc0, 0x24, 0xc0, 0x62, 0xd0, 0x9c, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x5a, 0x00, 0xc0, 0x27, 
-	0xc0, 0x68, 0xd0, 0xa4, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 
-	0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 
-	0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x5a, 0x80, 
-	0xc0, 0x23, 0xc0, 0x6a, 0xd0, 0xac, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x26, 
-	0xc0, 0x65, 0xd0, 0xb4, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 
-	0xc0, 0x29, 0xc0, 0x64, 0xd0, 0xbc, 0x20, 0x86, 
-	0xf3, 0x9a, 0xc0, 0x33, 0xc0, 0x74, 0xc0, 0xb5, 
-	0xc0, 0xf6, 0xd0, 0x40, 0x00, 0xa0, 0xd8, 0x00, 
-	0xa8, 0x38, 0x08, 0x45, 0x0a, 0x09, 0x00, 0x0d, 
-	0x0f, 0xc5, 0x50, 0x00, 0x0a, 0x09, 0x00, 0x0d, 
-	0x10, 0x08, 0x0f, 0xc5, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x7c, 0xa0, 0x3d, 0x60, 0x42, 0x00, 0xc6, 
-	0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x14, 0x48, 0xd0, 0x81, 0x00, 0xef, 0xd1, 0x8c, 
-	0x71, 0x46, 0x11, 0x60, 0xfb, 0xb1, 0x60, 0x86, 
-	0x71, 0x46, 0x31, 0x42, 0xfb, 0xb1, 0x00, 0xec, 
-	0xd1, 0x0c, 0x74, 0x84, 0x00, 0x68, 0xd0, 0x80, 
-	0x70, 0x02, 0x10, 0x20, 0xfb, 0xc4, 0xc4, 0x82, 
-	0xc4, 0xd2, 0xb4, 0xfc, 0xda, 0x00, 0xda, 0x4f, 
-	0x0a, 0x09, 0x0f, 0xef, 0xd0, 0x3f, 0xb4, 0x7f, 
-	0xca, 0x29, 0x1a, 0x18, 0x4a, 0x00, 0x1a, 0x48, 
-	0x00, 0x8d, 0x2a, 0x42, 0xd0, 0x03, 0x40, 0x11, 
-	0xfb, 0xe3, 0xb4, 0x44, 0x00, 0xa0, 0xd0, 0xc0, 
-	0x30, 0xd3, 0xff, 0xe3, 0xb4, 0xfe, 0x01, 0x46, 
-	0x00, 0x06, 0xaa, 0x3d, 0xaa, 0x7c, 0x6a, 0x53, 
-	0x00, 0xc6, 0xb4, 0xfe, 0xb4, 0x7c, 0x1a, 0x61, 
-	0xfb, 0xc8, 0xb4, 0x43, 0x00, 0xef, 0xd0, 0x3f, 
-	0x40, 0x11, 0xeb, 0xf7, 0xb0, 0xc4, 0xe7, 0xf7, 
-	0xeb, 0xee, 0x61, 0x53, 0x64, 0x52, 0x64, 0xc4, 
-	0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 0x00, 0x21, 
-	0xd0, 0x80, 0x50, 0x02, 0x60, 0x04, 0x61, 0x46, 
-	0x0a, 0x09, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25, 
-	0xdc, 0xd8, 0xf0, 0x4a, 0x09, 0x09, 0x01, 0xcd, 
-	0x11, 0xe8, 0xf9, 0xe2, 0x00, 0xe3, 0xd1, 0x9c, 
-	0x09, 0x09, 0x05, 0xcd, 0xb5, 0xc1, 0x09, 0x09, 
-	0x00, 0x4d, 0xb0, 0x41, 0x10, 0x46, 0x25, 0xc1, 
-	0x09, 0x09, 0x06, 0x0d, 0xb6, 0x01, 0x09, 0x09, 
-	0x00, 0x4d, 0x08, 0x89, 0xb0, 0x41, 0x10, 0x46, 
-	0x26, 0x01, 0x00, 0x8d, 0x08, 0x89, 0x10, 0x82, 
-	0xd0, 0x04, 0xc0, 0x55, 0x00, 0x40, 0x40, 0x40, 
-	0x05, 0x4d, 0x08, 0x49, 0x0b, 0x0d, 0xd1, 0x00, 
-	0x15, 0x63, 0xe9, 0xa2, 0xd1, 0x01, 0x55, 0x41, 
-	0xdb, 0x01, 0x4b, 0x15, 0xa1, 0x1b, 0x08, 0x89, 
-	0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 0xd1, 0x19, 
-	0x46, 0x44, 0x26, 0x41, 0x00, 0xcd, 0x08, 0x49, 
-	0x10, 0xc4, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 
-	0x20, 0x81, 0xa0, 0x89, 0x00, 0x4d, 0x10, 0x43, 
-	0x20, 0xc1, 0xa0, 0xe8, 0x08, 0x49, 0x00, 0x4d, 
-	0x1b, 0x03, 0x5b, 0x01, 0xbb, 0x3f, 0x6b, 0x06, 
-	0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 
-	0x08, 0x49, 0xb1, 0xbc, 0x0a, 0xcd, 0x1a, 0xc2, 
-	0x4a, 0xd9, 0x1a, 0xde, 0x6a, 0xc6, 0x08, 0x49, 
-	0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 
-	0xea, 0x3e, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0xc9, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x09, 0xc9, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xe2, 0x3e, 0x11, 0xe3, 0xfa, 0x00, 
-	0x00, 0xe7, 0xd0, 0xc0, 0xd0, 0x84, 0xb0, 0x81, 
-	0xe6, 0x3e, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x43, 
-	0xb0, 0xfc, 0x10, 0x60, 0xe9, 0xe7, 0x10, 0xa3, 
-	0xf9, 0xf4, 0x00, 0xe8, 0xd1, 0x80, 0xe1, 0xf8, 
-	0x10, 0xa2, 0xf9, 0xfa, 0x00, 0xe9, 0xd1, 0x80, 
-	0xf2, 0xb0, 0xe1, 0xe7, 0xd2, 0x3f, 0x0a, 0x09, 
-	0x00, 0x4d, 0xb2, 0x01, 0xf5, 0xfb, 0xe1, 0xe7, 
-	0x11, 0xe7, 0xfa, 0x3e, 0xd4, 0x01, 0x00, 0xe1, 
-	0xd0, 0x24, 0x70, 0x00, 0x10, 0x21, 0xea, 0x0d, 
-	0x15, 0x63, 0xfa, 0x0d, 0xd4, 0x03, 0x44, 0x2c, 
-	0xb4, 0x3f, 0x00, 0xe6, 0xd1, 0x90, 0x0b, 0x09, 
-	0x00, 0x4d, 0x09, 0x49, 0x10, 0x45, 0x00, 0x8d, 
-	0x50, 0x81, 0xd0, 0x40, 0x10, 0x87, 0x10, 0x98, 
-	0x30, 0x42, 0xf2, 0x61, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x09, 0x00, 0x0d, 0x09, 0x49, 0x00, 0x0d, 
-	0xb4, 0x01, 0xfa, 0x0f, 0x00, 0xe6, 0xd0, 0x18, 
-	0x30, 0x06, 0xe6, 0x29, 0x60, 0x46, 0xb1, 0xbc, 
-	0xe2, 0x22, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, 
-	0x10, 0x63, 0xea, 0x39, 0x10, 0x64, 0xea, 0x39, 
-	0x00, 0xe6, 0xd1, 0x90, 0xd0, 0x00, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0xe2, 0x3e, 0x00, 0xef, 0xd1, 0x84, 0x70, 0x46, 
-	0x10, 0x60, 0xfa, 0x30, 0x0c, 0x09, 0x90, 0x4d, 
-	0x10, 0x60, 0xe6, 0x3f, 0x00, 0x06, 0x05, 0x0d, 
-	0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xfa, 0x4b, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe2, 0x43, 0xb0, 0x7d, 
-	0xe9, 0x7a, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 
-	0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec, 
-	0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 
-	0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 0xea, 0x5e, 
-	0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 
-	0xe0, 0x46, 0x00, 0xe0, 0xd0, 0x00, 0x70, 0xc0, 
-	0x10, 0xc1, 0x00, 0xe0, 0xd0, 0x08, 0x70, 0x00, 
-	0x10, 0x23, 0xea, 0x75, 0xc0, 0x83, 0x10, 0x9d, 
-	0x30, 0xc2, 0x10, 0x9f, 0x30, 0xc2, 0x00, 0xef, 
-	0xd0, 0xac, 0x70, 0x82, 0x10, 0xa3, 0xea, 0x75, 
-	0x10, 0xc1, 0xc0, 0x83, 0x30, 0x81, 0xe6, 0x7e, 
-	0xc0, 0x83, 0x20, 0x81, 0xf6, 0x7f, 0xd0, 0x40, 
-	0x30, 0x43, 0x0f, 0xc5, 0xc0, 0x43, 0x0f, 0xc5, 
-	0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x15, 0xa3, 
-	0xee, 0x23, 0x15, 0xa1, 0xe6, 0x23, 0x08, 0x20, 
-	0xd0, 0x00, 0x5f, 0x00, 0xd8, 0xc4, 0x15, 0x63, 
-	0xe9, 0x7e, 0x48, 0xd5, 0x18, 0xde, 0x18, 0xe0, 
-	0xe9, 0xc2, 0x00, 0xed, 0xd1, 0xb4, 0x79, 0xc6, 
-	0x19, 0xe0, 0xe9, 0x8c, 0x00, 0xed, 0xd0, 0x3a, 
-	0x79, 0xc6, 0x69, 0xc0, 0xd9, 0xc0, 0x69, 0xc6, 
-	0x00, 0xed, 0xd0, 0x38, 0x79, 0x40, 0x19, 0x60, 
-	0xe9, 0x98, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 
-	0x02, 0x20, 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 
-	0x15, 0xa3, 0xe9, 0x9f, 0x00, 0xec, 0xd1, 0xb8, 
-	0x79, 0xc6, 0x69, 0x46, 0xc9, 0x67, 0x00, 0xec, 
-	0xd9, 0xb4, 0x70, 0x66, 0x00, 0xec, 0xd1, 0xbc, 
-	0x70, 0x06, 0x10, 0x20, 0xed, 0xbe, 0x10, 0x60, 
-	0xe9, 0xc1, 0x00, 0xe0, 0xda, 0xa8, 0x7a, 0xaa, 
-	0xc0, 0x2a, 0x10, 0x1f, 0x00, 0x22, 0xd0, 0xa0, 
-	0x70, 0x82, 0x20, 0x6a, 0x00, 0x9f, 0xe9, 0xb5, 
-	0x20, 0x40, 0x19, 0x60, 0xf9, 0xb8, 0xc9, 0x41, 
-	0xb0, 0x48, 0x30, 0x65, 0xf5, 0xbd, 0xb0, 0x70, 
-	0xed, 0xbe, 0xd9, 0x40, 0x00, 0xed, 0xd1, 0xbc, 
-	0x69, 0x46, 0x69, 0x66, 0x12, 0xa4, 0xea, 0x21, 
-	0x00, 0xec, 0xd1, 0xbc, 0x73, 0xc6, 0x15, 0xa3, 
-	0xe9, 0xdf, 0x33, 0xe3, 0xe5, 0xd3, 0xed, 0xd2, 
-	0x63, 0xc6, 0x00, 0x21, 0xd1, 0xa8, 0x63, 0xc6, 
-	0x00, 0xed, 0xd1, 0xa0, 0x63, 0xc6, 0x15, 0xa1, 
-	0xf9, 0xdc, 0x12, 0xa3, 0xe5, 0xe3, 0xd3, 0xc2, 
-	0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0xe1, 0xe3, 
-	0x12, 0xa3, 0xea, 0x21, 0xe1, 0xe3, 0x12, 0xa2, 
-	0xf6, 0x21, 0x13, 0xe0, 0xfa, 0x21, 0x00, 0xee, 
-	0xd1, 0x8c, 0x78, 0x06, 0xb1, 0xbc, 0x78, 0x46, 
-	0xb1, 0xbc, 0x78, 0x86, 0xd1, 0x88, 0x72, 0x46, 
-	0xd1, 0x84, 0x73, 0x06, 0x13, 0x20, 0xf9, 0xe3, 
-	0x00, 0x64, 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0xa2, 
-	0x30, 0x81, 0xe9, 0xff, 0x10, 0x70, 0xea, 0x11, 
-	0x10, 0x6d, 0xea, 0x14, 0x10, 0x76, 0xea, 0x19, 
-	0x10, 0x7a, 0xea, 0x28, 0xe2, 0x3b, 0x18, 0xe0, 
-	0xea, 0x3b, 0x00, 0xed, 0xd1, 0x80, 0x70, 0x86, 
-	0xb0, 0x81, 0xd0, 0x3f, 0x40, 0x02, 0x10, 0x20, 
-	0xea, 0x0c, 0x60, 0x86, 0xf3, 0x8a, 0xe1, 0xe3, 
-	0xc0, 0x02, 0x10, 0x1a, 0x50, 0x80, 0x60, 0x86, 
-	0xe2, 0x3b, 0x15, 0xa3, 0xea, 0x21, 0xe2, 0xe9, 
-	0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 
-	0xe3, 0x0c, 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 
-	0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 0x15, 0xa3, 
-	0xfb, 0x0c, 0xd5, 0x84, 0xe3, 0x0c, 0xd5, 0x00, 
-	0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 
-	0x50, 0x40, 0x60, 0x46, 0x15, 0xa2, 0xe7, 0x0c, 
-	0xee, 0x21, 0x00, 0x21, 0xd1, 0x8c, 0x18, 0xe0, 
-	0xfa, 0x39, 0x70, 0x46, 0x10, 0x61, 0xea, 0x70, 
-	0xe2, 0x21, 0x65, 0x86, 0xe2, 0x21, 0x18, 0xe0, 
-	0xea, 0x70, 0xd1, 0x80, 0x73, 0x06, 0x15, 0xa2, 
-	0xee, 0x68, 0x00, 0x22, 0xd1, 0x80, 0x70, 0x46, 
-	0x6b, 0x06, 0xcb, 0x01, 0xb1, 0xb4, 0x70, 0x46, 
-	0x6a, 0xc6, 0xca, 0xc1, 0x00, 0x65, 0xd1, 0x98, 
-	0x70, 0x46, 0x10, 0x61, 0xfa, 0x50, 0x02, 0x41, 
-	0xc3, 0x21, 0xc7, 0xe0, 0x02, 0x50, 0xea, 0x56, 
-	0xc3, 0x20, 0xc7, 0xe1, 0xd1, 0x88, 0xd0, 0x01, 
-	0x02, 0x40, 0x62, 0x46, 0x0f, 0xef, 0xd0, 0x7f, 
-	0x30, 0x6f, 0xfa, 0x5f, 0xc3, 0x20, 0xc7, 0x4c, 
-	0xd0, 0x00, 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 
-	0x60, 0x06, 0xb0, 0x41, 0x43, 0x01, 0xe2, 0x70, 
-	0xc3, 0x22, 0xc7, 0xcc, 0xc7, 0x60, 0xc7, 0xa1, 
-	0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xa0, 
-	0xdb, 0x80, 0xd1, 0x00, 0x00, 0xef, 0xd1, 0xa8, 
-	0x70, 0x46, 0x10, 0x60, 0xfa, 0x7a, 0x00, 0xe0, 
-	0xd1, 0x88, 0x70, 0x46, 0x00, 0x22, 0xd1, 0xb0, 
-	0x70, 0x86, 0x30, 0x81, 0xea, 0x82, 0x60, 0x46, 
-	0xd0, 0x20, 0xf3, 0x06, 0x10, 0x63, 0xea, 0x87, 
-	0x10, 0x64, 0xea, 0x87, 0xe2, 0x95, 0x00, 0xef, 
-	0xd1, 0x6c, 0x71, 0x45, 0xc0, 0x05, 0x30, 0x01, 
-	0xf6, 0x95, 0xdb, 0x82, 0xd1, 0x01, 0x10, 0x63, 
-	0xea, 0x95, 0xd1, 0x02, 0x11, 0x62, 0xea, 0x95, 
-	0xd1, 0x03, 0xd1, 0x8c, 0x61, 0x06, 0xdb, 0x40, 
-	0x00, 0xe0, 0xd0, 0x00, 0x71, 0x00, 0xc0, 0x84, 
-	0x10, 0x9c, 0xb0, 0x96, 0xfa, 0xa0, 0xb1, 0x38, 
-	0xb0, 0x96, 0xfa, 0xa3, 0xb1, 0x30, 0x00, 0x29, 
-	0xd1, 0x84, 0x00, 0x22, 0xd0, 0x74, 0x70, 0x86, 
-	0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 0xea, 0xae, 
-	0x60, 0x81, 0xdb, 0x41, 0xb0, 0x3c, 0xb1, 0xbc, 
-	0xb0, 0x7c, 0x71, 0x00, 0x70, 0x86, 0x70, 0xc1, 
-	0x61, 0x06, 0x30, 0xc2, 0xea, 0xb9, 0x60, 0x81, 
-	0xdb, 0x41, 0x00, 0xee, 0xd1, 0xb4, 0x70, 0x06, 
-	0xb1, 0xbc, 0x70, 0x46, 0x30, 0x40, 0xea, 0xc2, 
-	0x60, 0x06, 0xdb, 0x41, 0x00, 0x24, 0xd0, 0x60, 
-	0x30, 0x81, 0xea, 0xc7, 0x30, 0x81, 0x50, 0x02, 
-	0xea, 0xca, 0xd0, 0x01, 0x00, 0x22, 0xd1, 0xbc, 
-	0x70, 0x86, 0x30, 0x80, 0xea, 0xd2, 0x60, 0x06, 
-	0xd0, 0x10, 0xf3, 0x06, 0x00, 0x22, 0xd1, 0xa4, 
-	0x71, 0x06, 0xd0, 0x01, 0x41, 0x00, 0x5b, 0x44, 
-	0x5b, 0x6e, 0x6b, 0x46, 0x00, 0x28, 0xd0, 0x70, 
-	0x70, 0x41, 0x10, 0x62, 0xfa, 0xe6, 0xd1, 0x84, 
-	0x70, 0x06, 0x10, 0x20, 0xfa, 0xdf, 0x00, 0x22, 
-	0xd0, 0x00, 0xf3, 0x06, 0x02, 0x7d, 0xde, 0x68, 
-	0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 0x71, 0x06, 
-	0x01, 0x1f, 0xfa, 0xfd, 0xd0, 0x41, 0x41, 0x01, 
-	0xd0, 0x62, 0x00, 0x65, 0xd0, 0x30, 0x70, 0x00, 
-	0x10, 0x21, 0xea, 0xfa, 0xee, 0xf9, 0x1a, 0xe1, 
-	0xfa, 0xfa, 0xd0, 0x52, 0x51, 0x01, 0x61, 0x06, 
-	0xe3, 0x0c, 0x18, 0xe0, 0xea, 0x70, 0xc7, 0x60, 
-	0xc7, 0xe1, 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 
-	0xc7, 0xe0, 0xe2, 0x70, 0x00, 0x28, 0xdc, 0xa4, 
-	0x7c, 0x72, 0x5c, 0x40, 0x6c, 0x72, 0x0f, 0xc5, 
-	0x18, 0xe0, 0xeb, 0x82, 0xd9, 0x0d, 0x00, 0xee, 
-	0xd1, 0xa4, 0x70, 0x06, 0x10, 0x21, 0xfb, 0x7f, 
-	0xd9, 0x0c, 0x90, 0x06, 0x00, 0x10, 0xeb, 0x7f, 
-	0x00, 0x21, 0xd1, 0x88, 0x7a, 0x06, 0x1a, 0x20, 
-	0xeb, 0x7f, 0xd9, 0x00, 0x00, 0xed, 0xd1, 0xbc, 
-	0x79, 0x46, 0x19, 0x60, 0xeb, 0x7f, 0x39, 0x68, 
-	0xc0, 0xe5, 0xc0, 0x25, 0x10, 0x13, 0xb0, 0x0f, 
-	0xef, 0x7f, 0xb0, 0x22, 0xe7, 0x7f, 0x00, 0xe0, 
-	0xd1, 0xa8, 0x71, 0x46, 0x11, 0x5f, 0x29, 0x45, 
-	0x00, 0x22, 0xd0, 0x18, 0x00, 0x22, 0xd4, 0x54, 
-	0x00, 0x22, 0xd0, 0x9c, 0x70, 0x00, 0x74, 0x51, 
-	0x70, 0x42, 0x34, 0x40, 0xe7, 0x3c, 0xd0, 0x40, 
-	0x00, 0x22, 0xd4, 0x50, 0x74, 0x51, 0x34, 0x40, 
-	0xef, 0x42, 0x20, 0x45, 0x60, 0x42, 0x39, 0x41, 
-	0x19, 0x60, 0xf7, 0x5e, 0x00, 0x65, 0xd1, 0xa8, 
-	0x7a, 0x86, 0x29, 0x6a, 0x19, 0x59, 0xb9, 0x7e, 
-	0xf7, 0x75, 0x15, 0xa3, 0xf7, 0x57, 0x00, 0xed, 
-	0xd1, 0xac, 0x70, 0x06, 0x00, 0xed, 0xd1, 0xb0, 
-	0x70, 0x46, 0x30, 0x01, 0xfb, 0x7f, 0x00, 0x65, 
-	0xd1, 0x84, 0x70, 0x46, 0xb0, 0x7f, 0x60, 0x46, 
-	0xd5, 0x84, 0xe3, 0x7f, 0x11, 0x41, 0xd0, 0x4a, 
-	0x00, 0xed, 0xd1, 0xa0, 0x74, 0x46, 0xd0, 0x00, 
-	0x60, 0x06, 0x30, 0xc5, 0x39, 0x45, 0xe7, 0x6e, 
-	0x14, 0x60, 0xeb, 0x6b, 0xf3, 0x85, 0xb0, 0x41, 
-	0xef, 0x65, 0xe3, 0x71, 0x00, 0x66, 0xd1, 0xa0, 
-	0x60, 0xc6, 0x15, 0xa3, 0xeb, 0x7f, 0xf3, 0x85, 
-	0xe3, 0x7f, 0xd9, 0x01, 0x00, 0x66, 0xd1, 0xa0, 
-	0x70, 0x06, 0x30, 0x03, 0xe7, 0x7e, 0x10, 0x1d, 
-	0x10, 0x3b, 0xe7, 0x7f, 0x60, 0xc6, 0x00, 0x66, 
-	0xd1, 0xa4, 0x69, 0x06, 0x15, 0xa4, 0xea, 0x23, 
-	0xe2, 0x3b, 0x00, 0x65, 0xdd, 0x08, 0x7c, 0xf4, 
-	0xbc, 0xff, 0x6c, 0xf4, 0x00, 0xef, 0xdd, 0x10, 
-	0x7c, 0xf4, 0xbc, 0xfe, 0x6c, 0xf4, 0xc0, 0x3f, 
-	0xf1, 0x18, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x05, 
-	0x08, 0x20, 0xd0, 0x40, 0x5f, 0x01, 0x15, 0x63, 
-	0xe9, 0x77, 0x05, 0x5e, 0xeb, 0x08, 0x00, 0x22, 
-	0xd1, 0xa0, 0x6b, 0x06, 0x00, 0x22, 0xd1, 0xa8, 
-	0x6b, 0xc6, 0x00, 0x22, 0xd1, 0xac, 0x6a, 0xc6, 
-	0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, 
-	0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 0xb0, 0x3c, 
-	0xb1, 0xb4, 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 
-	0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x10, 0xd0, 0x83, 
-	0x70, 0x40, 0x60, 0x46, 0xb0, 0x3c, 0xb1, 0xbc, 
-	0xb0, 0x81, 0xed, 0x90, 0x00, 0xee, 0xd0, 0x0c, 
-	0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x4c, 
-	0xe9, 0xa3, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, 
-	0x30, 0x4c, 0xe9, 0xa3, 0xb1, 0xb4, 0x00, 0xe6, 
-	0xd0, 0x00, 0x61, 0x80, 0x00, 0x21, 0xd1, 0xb4, 
-	0x70, 0x06, 0x10, 0x20, 0xe9, 0xae, 0xd0, 0x00, 
-	0x60, 0x06, 0xf1, 0x18, 0x00, 0x21, 0xd1, 0x8c, 
-	0x70, 0x46, 0x65, 0x86, 0xde, 0xc0, 0x00, 0xee, 
-	0xd0, 0x20, 0x70, 0x00, 0x10, 0x22, 0xfd, 0xb9, 
-	0xde, 0xc2, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x21, 0xe9, 0xc0, 0x15, 0xa3, 0xe9, 0xdc, 
-	0xd0, 0x02, 0x4c, 0x00, 0x10, 0x63, 0xe9, 0xc5, 
-	0xcc, 0x3b, 0xd0, 0x04, 0x63, 0x00, 0xd0, 0x00, 
-	0x70, 0x00, 0x30, 0x1f, 0xfb, 0x08, 0xd0, 0x18, 
-	0x70, 0x00, 0x10, 0x20, 0xed, 0xc7, 0xd0, 0x04, 
-	0x70, 0x80, 0x10, 0xa0, 0xeb, 0x08, 0xf1, 0x16, 
-	0x00, 0x21, 0xd0, 0x9a, 0xc0, 0x39, 0x30, 0x1f, 
-	0x10, 0x18, 0x30, 0x02, 0xfd, 0xcf, 0xe3, 0x08, 
-	0x00, 0xe0, 0xd9, 0x04, 0x79, 0x24, 0xb9, 0x38, 
-	0x19, 0x1c, 0xdc, 0x88, 0x4c, 0xac, 0xd0, 0x02, 
-	0x40, 0x2c, 0x10, 0x02, 0x0c, 0x80, 0x10, 0x63, 
-	0xea, 0x70, 0x15, 0x63, 0xf9, 0xec, 0xf1, 0x18, 
-	0x00, 0xef, 0xdc, 0x00, 0x7c, 0x30, 0x00, 0x24, 
-	0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xf9, 0xf6, 
-	0xbc, 0x3b, 0xe1, 0xfd, 0x10, 0x22, 0xf9, 0xfa, 
-	0xbc, 0x38, 0xe1, 0xfd, 0x10, 0x23, 0xf9, 0xfd, 
-	0xbc, 0x3c, 0x1e, 0xe0, 0xea, 0x03, 0x15, 0x63, 
-	0xfa, 0x02, 0xbe, 0xfc, 0xdc, 0x12, 0x0e, 0xde, 
-	0xfa, 0x09, 0xc0, 0x24, 0x30, 0x30, 0xf6, 0x09, 
-	0x2c, 0x00, 0xd0, 0x2c, 0x6c, 0x00, 0x1e, 0xe0, 
-	0xea, 0x0f, 0xcc, 0x24, 0x1c, 0x1f, 0xd9, 0x40, 
-	0x06, 0x50, 0xea, 0x22, 0xc0, 0x24, 0xb0, 0x12, 
-	0xfe, 0x22, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f, 
-	0x30, 0x25, 0xee, 0x1b, 0x29, 0x40, 0x19, 0x5f, 
-	0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24, 
-	0xe6, 0x22, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40, 
-	0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b, 
-	0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3, 
-	0x10, 0xb2, 0xf6, 0x2f, 0xd0, 0x92, 0x02, 0xe4, 
-	0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81, 
-	0xee, 0x32, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xac, 
-	0xd0, 0x20, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23, 
-	0xd4, 0x64, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f, 
-	0xfa, 0x5b, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x47, 
-	0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x42, 0xc0, 0xc0, 
-	0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 
-	0x20, 0xf1, 0x15, 0x63, 0xfa, 0x5c, 0xf2, 0x54, 
-	0xc1, 0x11, 0xc0, 0x83, 0xf2, 0xa5, 0xe2, 0x6f, 
-	0xb1, 0x01, 0xe6, 0x5a, 0x68, 0x40, 0x28, 0x60, 
-	0xb0, 0x3c, 0xe2, 0x54, 0x0f, 0xc5, 0xd9, 0x40, 
-	0xb1, 0x12, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x54, 
-	0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x6f, 0x20, 0x31, 
-	0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60, 
-	0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31, 
-	0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x61, 0xe2, 0xf7, 
-	0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80, 
-	0x00, 0xa8, 0xd1, 0x44, 0x00, 0xac, 0xd0, 0x20, 
-	0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0xb3, 0xd9, 0x78, 
-	0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5, 
-	0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6, 
-	0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f, 
-	0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44, 
-	0xf6, 0x8e, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83, 
-	0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70, 
-	0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xc3, 0x20, 0xb1, 
-	0xf2, 0xa5, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85, 
-	0x30, 0xb1, 0xf2, 0xa5, 0xc1, 0x11, 0xc0, 0x83, 
-	0x0c, 0x9d, 0xfa, 0xa3, 0xb0, 0xbc, 0xf2, 0xa5, 
-	0xe2, 0xec, 0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42, 
-	0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0xa5, 
-	0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42, 0xb0, 0xb8, 
-	0x60, 0x40, 0xb0, 0x38, 0xe2, 0xac, 0x00, 0xac, 
-	0xd0, 0x24, 0xc1, 0x23, 0xb1, 0x12, 0xf2, 0xac, 
-	0xd1, 0x24, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84, 
-	0xf2, 0xac, 0xd1, 0x12, 0x00, 0xa8, 0xd0, 0x84, 
-	0xc0, 0x03, 0xf2, 0xac, 0xe2, 0xec, 0xd8, 0x82, 
-	0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xd9, 
-	0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22, 
-	0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0xe2, 0xc6, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1, 
-	0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xec, 0x70, 0x42, 
-	0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, 
-	0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xdd, 
-	0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04, 
-	0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xf7, 
-	0x1e, 0xe0, 0xea, 0xf7, 0xbc, 0x3c, 0x00, 0xac, 
-	0xd0, 0xa0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20, 
-	0xd1, 0x24, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xfd, 0xd0, 0x30, 
-	0x30, 0x30, 0xef, 0x03, 0xd0, 0x04, 0x63, 0x00, 
-	0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba, 
-	0xde, 0x3c, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0x46, 0xd0, 0x08, 0x94, 0x89, 0xd0, 0x8c, 
-	0x44, 0x82, 0x14, 0x9e, 0x30, 0x12, 0xd0, 0x88, 
-	0x10, 0x80, 0x00, 0xe8, 0xd1, 0x80, 0x70, 0xc6, 
-	0x00, 0x06, 0xa0, 0xbd, 0xa0, 0xfc, 0x80, 0x3f, 
-	0xb1, 0xbe, 0x60, 0xc6, 0x00, 0x06, 0x80, 0xa9, 
-	0x80, 0x3f, 0x80, 0x2a, 0x80, 0x3f, 0x00, 0x21, 
-	0xd0, 0x3c, 0x00, 0x0a, 0xb1, 0x82, 0xd0, 0x6b, 
-	0x70, 0x46, 0x00, 0x06, 0x80, 0x07, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, 
-	0x80, 0x2b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0x90, 0x09, 0xd0, 0x41, 0x40, 0x01, 
-	0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0xa0, 0x27, 
-	0x80, 0x3f, 0x00, 0xc6, 0x15, 0x63, 0xe9, 0xae, 
-	0x05, 0x5e, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x40, 
-	0x70, 0x81, 0x10, 0x9c, 0xb0, 0x96, 0xf9, 0xb7, 
-	0x00, 0x21, 0xd0, 0x40, 0xe1, 0xbb, 0xb0, 0x96, 
-	0xf9, 0xbe, 0x00, 0x22, 0xd0, 0x40, 0x27, 0xc1, 
-	0x27, 0x41, 0x27, 0x81, 0x90, 0x83, 0x00, 0x64, 
-	0xd0, 0x10, 0x60, 0x80, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0x00, 0x64, 0xd0, 0x14, 0x67, 0x40, 
-	0x80, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0x90, 0xae, 
-	0x00, 0x64, 0xd0, 0x18, 0x60, 0x80, 0x90, 0xa6, 
-	0x00, 0x64, 0xd0, 0x1c, 0x60, 0x80, 0x15, 0x63, 
-	0xe9, 0xe3, 0x0c, 0x1f, 0xe9, 0xe3, 0x05, 0x50, 
-	0xf9, 0xe3, 0x15, 0xa3, 0xf9, 0xe3, 0x90, 0x4d, 
-	0x10, 0x60, 0xe5, 0xdb, 0x00, 0x06, 0x05, 0x0d, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x15, 0xa3, 
-	0xf9, 0xfb, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x21, 0xe9, 0xfb, 0xd0, 0x38, 0x70, 0x00, 
-	0x15, 0x63, 0xe9, 0xef, 0x10, 0x1f, 0x15, 0x21, 
-	0xe5, 0xe0, 0xd0, 0x64, 0x30, 0x54, 0xe5, 0xe0, 
-	0xc0, 0x40, 0xb0, 0x7f, 0x30, 0x54, 0xe9, 0xfb, 
-	0x0c, 0x09, 0x05, 0x0d, 0xe1, 0xef, 0xc0, 0x5f, 
-	0x10, 0x58, 0x10, 0x48, 0x00, 0xee, 0xd0, 0x8c, 
-	0xd0, 0xc3, 0x70, 0x02, 0x30, 0x01, 0xea, 0x10, 
-	0xb0, 0xbc, 0xb0, 0xc1, 0xee, 0x01, 0x00, 0x26, 
-	0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0x15, 0xa3, 0xea, 0x0f, 0xb0, 0x88, 0x77, 0xc2, 
-	0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 
-	0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 
-	0x00, 0x4d, 0x00, 0x50, 0xfa, 0x1a, 0x0c, 0x49, 
-	0x00, 0x8d, 0xc0, 0x42, 0x10, 0x60, 0xea, 0x2a, 
-	0xb0, 0x5e, 0xb0, 0x43, 0xfe, 0x34, 0xd0, 0x61, 
-	0x23, 0x81, 0xe2, 0x1f, 0x0c, 0x09, 0x05, 0x0d, 
-	0x15, 0x20, 0xfe, 0x31, 0xd0, 0x65, 0x30, 0x54, 
-	0xee, 0x10, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0xc6, 0xd4, 0xb6, 0xc1, 0xe6, 0x31, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfe, 0x31, 0xd7, 0x00, 0xb7, 0x01, 
-	0xd3, 0x81, 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x81, 
-	0x60, 0x80, 0x15, 0x63, 0xfa, 0x54, 0x00, 0x22, 
-	0xdc, 0xd8, 0x03, 0xf8, 0xd0, 0x10, 0xf0, 0x4a, 
-	0x15, 0xa3, 0xfa, 0x51, 0x02, 0xf7, 0xdc, 0x26, 
-	0x0c, 0x10, 0xf8, 0x46, 0x02, 0xfc, 0xd8, 0x22, 
-	0xe0, 0x46, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46, 
-	0x00, 0x22, 0xdc, 0xd8, 0x03, 0xfa, 0xd0, 0x10, 
-	0xf0, 0x4a, 0x03, 0x35, 0xda, 0x20, 0x15, 0xa3, 
-	0xe8, 0x46, 0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xe0, 0xe1, 0xec, 0xe2, 0x12, 
-	0xe2, 0x14, 0xe1, 0xc7, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xde, 
-	0xf9, 0xba, 0x03, 0xdf, 0xe9, 0x99, 0xd3, 0x40, 
-	0xca, 0x50, 0xd1, 0x42, 0xe2, 0xea, 0xc0, 0x50, 
-	0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 
-	0x10, 0xe0, 0xe5, 0xa8, 0xc0, 0x01, 0x10, 0x01, 
-	0x20, 0x40, 0xc0, 0x02, 0x10, 0x01, 0x20, 0x80, 
-	0x10, 0x60, 0xfd, 0xab, 0xb0, 0x7f, 0x10, 0xa0, 
-	0xfd, 0xae, 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 
-	0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 
-	0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 
-	0x50, 0x42, 0x0f, 0xc5, 0xcb, 0xaa, 0xcb, 0xeb, 
-	0xca, 0x50, 0xd0, 0xc0, 0xb0, 0xc1, 0xf1, 0x9b, 
-	0xcb, 0x01, 0xd0, 0xc1, 0xf1, 0x9b, 0xcb, 0x41, 
-	0xba, 0x7f, 0xbb, 0x3f, 0xe2, 0xea, 0xcc, 0x5b, 
-	0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 
-	0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0x06, 0xd0, 0xe9, 0xd5, 0x01, 0x69, 0xd0, 0x20, 
-	0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 
-	0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 
-	0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 
-	0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe5, 
-	0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xec, 0x80, 0x07, 
-	0xd4, 0x00, 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 
-	0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xfa, 0x06, 0x5e, 
-	0xfa, 0x03, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xfa, 0xd3, 0xc4, 0x06, 0x5e, 0xfa, 0x03, 
-	0xd0, 0x43, 0x40, 0x4c, 0xea, 0x03, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xea, 0x0a, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xea, 0x10, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xd3, 0xe1, 0xdc, 0xe2, 0x00, 
-	0xe2, 0x02, 0xe1, 0xac, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, 
-	0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, 
-	0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, 
-	0xe9, 0xa1, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, 
-	0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x52, 
-	0xe1, 0xa5, 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 
-	0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 
-	0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xd2, 0x00, 0xa8, 0xd0, 0x00, 
-	0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, 
-	0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, 
-	0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc4, 0x3c, 0x80, 
-	0x0e, 0xd9, 0xe9, 0xc7, 0x3e, 0xc0, 0x3e, 0xf2, 
-	0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xd3, 0xc2, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xd8, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xdc, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xe8, 0x06, 0x5e, 0xf9, 0xf1, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xe8, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xf9, 0xf1, 0xd0, 0x43, 0x40, 0x4c, 
-	0xe9, 0xf1, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xf8, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xe9, 0xfe, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xc1, 0xe1, 0xca, 0xe1, 0xee, 
-	0xe1, 0xf0, 0xe1, 0xa8, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, 
-	0xe9, 0x9d, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, 
-	0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x52, 
-	0xe1, 0xa1, 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 
-	0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 
-	0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xb6, 0x01, 0x69, 
-	0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 
-	0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xc6, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xca, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xd6, 0x06, 0x5e, 
-	0xf9, 0xdf, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xd6, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xdf, 
-	0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xdf, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe6, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xe9, 0xec, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xdb, 0xe1, 0xe9, 0xe2, 0x00, 
-	0xe2, 0x02, 0xe1, 0xc3, 0xe1, 0x65, 0x30, 0x5a, 
-	0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, 
-	0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, 
-	0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, 
-	0xf9, 0x98, 0xca, 0x50, 0x03, 0xde, 0xf9, 0x9a, 
-	0xd1, 0x42, 0xe2, 0xea, 0xcb, 0xaa, 0xcb, 0xeb, 
-	0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 
-	0x10, 0x92, 0xd0, 0xc1, 0x05, 0x50, 0xe9, 0xa5, 
-	0xb0, 0xc2, 0x10, 0x60, 0xfd, 0xa8, 0xb0, 0x7f, 
-	0x10, 0xa0, 0xfd, 0xab, 0xb0, 0xbf, 0x10, 0x5f, 
-	0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 
-	0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 
-	0x40, 0x80, 0x50, 0x42, 0xd0, 0x81, 0x14, 0x1f, 
-	0x14, 0x01, 0x05, 0x50, 0xe9, 0xbd, 0x50, 0x42, 
-	0xe1, 0xbe, 0x54, 0x02, 0xca, 0x10, 0xca, 0x50, 
-	0xcb, 0x01, 0xcb, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 
-	0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 
-	0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 
-	0xf9, 0xd2, 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 
-	0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4, 
-	0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe0, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xe9, 0x80, 0x07, 0xd4, 0x02, 
-	0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 0xd3, 0x08, 
-	0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 
-	0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xf7, 
-	0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xf6, 
-	0xd3, 0xc4, 0xe1, 0xf7, 0xb3, 0xc1, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xfe, 
-	0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x02, 0x44, 0x15, 
-	0x14, 0x1f, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xc9, 0xe1, 0xd2, 0xe1, 0xe7, 
-	0xe1, 0xe9, 0xe1, 0xab, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, 
-	0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, 
-	0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, 
-	0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, 
-	0xf9, 0xa0, 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 
-	0xf9, 0xa7, 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa4, 
-	0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x53, 
-	0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 
-	0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 
-	0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 
-	0xf9, 0xc8, 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 
-	0x20, 0x1b, 0x05, 0x50, 0xf9, 0xb8, 0xb0, 0x3f, 
-	0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 
-	0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc1, 
-	0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 
-	0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 
-	0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xce, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xd2, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xde, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xdd, 0xd3, 0xc4, 
-	0xe1, 0xde, 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 
-	0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe5, 0x09, 0x49, 
-	0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 
-	0xfa, 0x7f, 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 
-	0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xa3, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfd, 0xb4, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, 
-	0xd3, 0x40, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 
-	0xe9, 0x98, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 
-	0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xf2, 0xd3, 
-	0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc8, 
-	0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 
-	0xe9, 0xbf, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 
-	0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc8, 
-	0x0f, 0x17, 0xf9, 0xb4, 0x0f, 0x49, 0xf2, 0xd3, 
-	0x0f, 0x19, 0xf9, 0xb8, 0xdf, 0x00, 0x00, 0x06, 
-	0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 
-	0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc8, 0x0f, 0x17, 
-	0xf9, 0xc3, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46, 
-	0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xb5, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, 
-	0x30, 0x5b, 0xfd, 0xc6, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x30, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, 
-	0xd3, 0x40, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xb4, 
-	0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, 
-	0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, 
-	0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, 
-	0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xa6, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xa9, 
-	0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, 
-	0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 
-	0x30, 0x5a, 0xe5, 0xda, 0x00, 0x26, 0xd0, 0x00, 
-	0x70, 0x00, 0x10, 0x20, 0xe9, 0xd1, 0x00, 0xe0, 
-	0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, 
-	0xb0, 0x41, 0xed, 0xda, 0x0f, 0x17, 0xf9, 0xc6, 
-	0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xca, 
-	0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 
-	0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 
-	0xe5, 0xda, 0x0f, 0x17, 0xf9, 0xd5, 0x02, 0xf7, 
-	0xdc, 0x26, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 
-	0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xa2, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x65, 0x30, 0x5a, 
-	0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, 
-	0x30, 0x5b, 0xfd, 0xb3, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x11, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, 
-	0xd3, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 
-	0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 0xf9, 0x99, 
-	0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 
-	0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 
-	0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 
-	0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc7, 0x00, 0x26, 
-	0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbe, 
-	0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, 
-	0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc7, 0x0f, 0x17, 
-	0xf9, 0xb3, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 
-	0xf9, 0xb7, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 
-	0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 
-	0xb0, 0x7e, 0xe5, 0xc7, 0x0f, 0x17, 0xf9, 0xc2, 
-	0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46, 0xd3, 0x08, 
-	0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 
-	0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8, 
-	0xf0, 0x4a, 0xe1, 0xac, 0xc0, 0x00, 0xc0, 0x00, 
-	0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, 
-	0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, 
-	0x30, 0x5b, 0xfd, 0xbd, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x20, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, 
-	0xd3, 0x41, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xab, 
-	0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 
-	0x05, 0x50, 0xf9, 0x9b, 0xb0, 0x3f, 0x10, 0x02, 
-	0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa4, 0x3c, 0x80, 
-	0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 
-	0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 
-	0xe5, 0xd1, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0xc8, 0x00, 0xe0, 0xd0, 0x44, 
-	0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, 
-	0xed, 0xd1, 0x0f, 0x17, 0xf9, 0xbd, 0x0f, 0x49, 
-	0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xc1, 0xdf, 0x00, 
-	0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xd1, 
-	0x0f, 0x17, 0xf9, 0xcc, 0x03, 0x35, 0xda, 0x20, 
-	0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 
-	0xd0, 0x61, 0x23, 0x81, 0x0c, 0x49, 0xd0, 0x61, 
-	0x00, 0x8d, 0x10, 0xa0, 0xea, 0x3b, 0x30, 0x42, 
-	0xe6, 0x30, 0x23, 0x82, 0x0f, 0xc5, 0x0c, 0x09, 
-	0x05, 0x0d, 0x15, 0x20, 0xfe, 0x45, 0xd0, 0x65, 
-	0x15, 0x63, 0xea, 0x43, 0xd0, 0x53, 0x30, 0x54, 
-	0xee, 0x4a, 0x0f, 0x17, 0xfa, 0x45, 0x03, 0xb4, 
-	0xd6, 0x29, 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0x00, 0x4d, 0xa0, 0x6c, 0xd0, 0xa1, 0x00, 0x88, 
-	0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x53, 
-	0xf2, 0x32, 0xd3, 0x80, 0xe1, 0x76, 0xd1, 0xc2, 
-	0x41, 0xcf, 0x11, 0xdf, 0xd0, 0x41, 0x01, 0xc1, 
-	0x00, 0xef, 0xd0, 0xbe, 0x03, 0x10, 0xf9, 0x77, 
-	0x80, 0x07, 0x21, 0x96, 0x11, 0xa2, 0xe9, 0x78, 
-	0x03, 0x1d, 0xea, 0x73, 0xc0, 0xd7, 0xc2, 0x90, 
-	0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x72, 
-	0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x03, 0x1e, 
-	0xea, 0x8d, 0xc0, 0xd8, 0xc2, 0x92, 0xf2, 0xa4, 
-	0xc4, 0x8a, 0x03, 0xd0, 0xea, 0x7d, 0xc2, 0x93, 
-	0xf2, 0xa4, 0xc4, 0xca, 0xe2, 0x8d, 0xd3, 0xc0, 
-	0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, 
-	0x03, 0xd0, 0xea, 0x88, 0xc2, 0x91, 0xf2, 0xa4, 
-	0xc4, 0x4a, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x61, 
-	0xf8, 0x11, 0x03, 0x1f, 0xea, 0x93, 0x0d, 0xc9, 
-	0x00, 0x4d, 0xd0, 0x1a, 0xe2, 0x98, 0x03, 0x10, 
-	0xfa, 0x97, 0xd0, 0x1d, 0xe2, 0x98, 0xd0, 0x18, 
-	0x0f, 0x16, 0xfa, 0x98, 0xd0, 0x4c, 0x40, 0x4c, 
-	0x10, 0x6c, 0xea, 0xa2, 0x03, 0xde, 0xfa, 0xa2, 
-	0x0f, 0x12, 0xfa, 0xa0, 0x00, 0x08, 0xe2, 0xd9, 
-	0xd2, 0x00, 0x13, 0xe1, 0xee, 0xa9, 0x08, 0x49, 
-	0x02, 0x0d, 0x00, 0xc8, 0xc2, 0xca, 0x12, 0x94, 
-	0xd0, 0x1f, 0x30, 0x07, 0x12, 0xc0, 0xc2, 0x43, 
-	0x12, 0x5a, 0x00, 0x0d, 0x03, 0xde, 0xea, 0xb6, 
-	0x0e, 0xc9, 0x04, 0x8d, 0x02, 0x48, 0x22, 0x80, 
-	0x12, 0x88, 0xd0, 0x0b, 0x30, 0x03, 0x12, 0x80, 
-	0xd0, 0x19, 0x20, 0x03, 0x12, 0x80, 0x00, 0x0d, 
-	0x22, 0xc0, 0x12, 0xc8, 0xd0, 0x0b, 0x30, 0x09, 
-	0x12, 0xc0, 0x12, 0xd8, 0xd0, 0x16, 0x20, 0x09, 
-	0x20, 0x07, 0x12, 0xc0, 0x42, 0xc2, 0x22, 0x8b, 
-	0x22, 0x88, 0x03, 0xde, 0xea, 0xd2, 0x0e, 0xc9, 
-	0xc4, 0x4a, 0x04, 0xcd, 0x0f, 0xc5, 0x01, 0x46, 
-	0x90, 0x4d, 0x00, 0xc6, 0x10, 0x60, 0xe6, 0xd3, 
-	0x0f, 0xc5, 0x01, 0xb5, 0xd4, 0x00, 0xca, 0x9d, 
-	0xcb, 0x9e, 0xca, 0xea, 0xcb, 0xee, 0x2a, 0xc0, 
-	0x2b, 0xc0, 0xca, 0x10, 0xca, 0x51, 0xcb, 0x12, 
-	0xcb, 0x53, 0xd1, 0x40, 0xd3, 0x41, 0xb7, 0x3f, 
-	0xc0, 0x5c, 0xe1, 0x7b, 0xd0, 0xc0, 0xc1, 0x28, 
-	0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x0f, 0x17, 
-	0xfa, 0xef, 0xcc, 0xe8, 0xcd, 0x29, 0xcd, 0x6c, 
-	0xcd, 0xad, 0xc8, 0x08, 0xc8, 0x49, 0xca, 0x0a, 
-	0xca, 0x4b, 0xf3, 0x31, 0xd0, 0xc1, 0xc1, 0x34, 
-	0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x00, 0x28, 
-	0xd9, 0xc0, 0xc8, 0x88, 0xc8, 0xc9, 0xa9, 0xf8, 
-	0xca, 0x8a, 0xca, 0xcb, 0x11, 0x62, 0xe9, 0x79, 
-	0xd0, 0xc0, 0xc1, 0x35, 0xc2, 0x2e, 0xc2, 0xaf, 
-	0xf1, 0x7a, 0xc9, 0x08, 0xc9, 0x49, 0xa9, 0xf8, 
-	0xcb, 0x0a, 0xcb, 0x4b, 0xd0, 0xc1, 0xc1, 0x36, 
-	0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc0, 0x27, 
-	0xc9, 0x88, 0xc9, 0xc9, 0xa0, 0x38, 0xcb, 0x8a, 
-	0xcb, 0xcb, 0xe1, 0x79, 0x5f, 0x0d, 0x07, 0x7d, 
-	0xde, 0x07, 0x11, 0x5e, 0x30, 0x05, 0xcd, 0xc0, 
-	0x00, 0x28, 0xd0, 0x00, 0xa0, 0x38, 0x11, 0x61, 
-	0xf9, 0x75, 0x00, 0xe2, 0xd0, 0x00, 0x0f, 0x1d, 
-	0xeb, 0x29, 0x00, 0x2d, 0xdf, 0x4b, 0xf3, 0x3f, 
-	0xe1, 0x75, 0x04, 0xeb, 0xd0, 0x00, 0x11, 0x62, 
-	0xeb, 0x36, 0xb0, 0x20, 0x0f, 0x19, 0xfb, 0x36, 
-	0xac, 0xe0, 0x01, 0xa4, 0xde, 0x00, 0x5e, 0x0d, 
-	0x00, 0x2d, 0xdf, 0x7a, 0xdd, 0xc0, 0xd8, 0x80, 
-	0xd9, 0x00, 0xd9, 0x80, 0x5f, 0x00, 0x01, 0x46, 
-	0x00, 0x28, 0xd0, 0x01, 0x00, 0x06, 0xa0, 0x37, 
-	0x80, 0x3f, 0x00, 0xc6, 0x0f, 0xc5, 0xad, 0xda, 
-	0xc6, 0xb1, 0xd0, 0x01, 0x01, 0xa3, 0xde, 0x1d, 
-	0x40, 0x30, 0x3e, 0x00, 0x80, 0x3f, 0x0e, 0x0a, 
-	0x66, 0xda, 0xc8, 0x28, 0xc8, 0x69, 0xc8, 0xaa, 
-	0xc8, 0xeb, 0x0c, 0x1e, 0xfb, 0x68, 0x26, 0xba, 
-	0x07, 0x7d, 0xdc, 0x00, 0x1d, 0xcf, 0x1d, 0xd1, 
-	0x5d, 0xc0, 0x00, 0x2d, 0xdf, 0x64, 0x0f, 0x87, 
-	0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 
-	0xc9, 0x2c, 0xc9, 0x6d, 0xc9, 0xae, 0xc9, 0xef, 
-	0x0f, 0x2f, 0xd0, 0x37, 0x4f, 0x00, 0x0f, 0x1a, 
-	0xeb, 0xbe, 0x01, 0xa4, 0xde, 0x20, 0xd0, 0x01, 
-	0x40, 0x3c, 0x2e, 0x00, 0x00, 0x2d, 0xdf, 0x7a, 
-	0xac, 0xe0, 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe0, 
-	0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x1b, 0xeb, 0x9e, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe1, 0xbf, 0x79, 
-	0xbe, 0x34, 0x18, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0x20, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe2, 
-	0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe3, 0x0f, 0x1b, 0xeb, 0xb3, 0xbf, 0x77, 
-	0xbe, 0x0c, 0x19, 0x20, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0x60, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe4, 
-	0xbe, 0x3c, 0xbf, 0x75, 0x0f, 0x15, 0xf8, 0x1c, 
-	0x1f, 0x0a, 0x1f, 0x16, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe5, 0xbf, 0x79, 0xbe, 0x34, 0x19, 0xa0, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0xa0, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe6, 0xbe, 0x3c, 0xbf, 0x79, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe7, 0x0f, 0x15, 
-	0xeb, 0xbe, 0x00, 0x2f, 0xdf, 0x72, 0x1d, 0xe0, 
-	0xf8, 0x1c, 0x00, 0x28, 0xd0, 0x01, 0xa0, 0x38, 
-	0x80, 0x3f, 0x0f, 0x87, 0xd0, 0x01, 0x4d, 0xc0, 
-	0x1f, 0x0f, 0x1f, 0x11, 0x00, 0x2f, 0xdf, 0x76, 
-	0xc6, 0xb2, 0x03, 0x7d, 0xde, 0x0e, 0x01, 0xa3, 
-	0xde, 0x2d, 0x5d, 0xc0, 0x0f, 0x87, 0x1e, 0xe1, 
-	0xeb, 0xdb, 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 
-	0x66, 0xda, 0x0c, 0x1e, 0xfb, 0xe4, 0x26, 0xbb, 
-	0x03, 0xff, 0xdd, 0xff, 0x4d, 0xc0, 0x00, 0xa3, 
-	0xde, 0x2d, 0xbf, 0x56, 0x0f, 0x87, 0x07, 0x7d, 
-	0xde, 0x0e, 0x5d, 0xc0, 0x00, 0xa3, 0xde, 0x1d, 
-	0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 
-	0xdf, 0x5c, 0xd0, 0x0e, 0x4f, 0x00, 0x0f, 0x87, 
-	0xd0, 0x06, 0x40, 0x3c, 0xeb, 0xf0, 0xbf, 0x3e, 
-	0xb0, 0x04, 0xe7, 0xf2, 0xeb, 0xf6, 0xbf, 0x0c, 
-	0xbf, 0x3a, 0x0f, 0x87, 0x0f, 0x1d, 0xfb, 0x4b, 
-	0xbf, 0x38, 0x0f, 0x87, 0x0f, 0x1c, 0xfb, 0xcb, 
-	0xbf, 0x30, 0x0f, 0x87, 0x50, 0x00, 0x50, 0x00, 
-	0x0f, 0x17, 0xf9, 0x70, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x72, 0x0f, 0x49, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x76, 0x0f, 0x19, 0xf9, 0x79, 0x01, 0x46, 
-	0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 
-	0xdf, 0x00, 0x00, 0x06, 0x08, 0x20, 0xd0, 0x00, 
-	0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x1b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x4d, 
-	0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 
-	0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x95, 
-	0xd0, 0x01, 0xa0, 0x09, 0x80, 0x1b, 0xa0, 0x27, 
-	0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 
-	0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 
-	0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 
-	0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 
-	0xdf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0xd0, 0x10, 0xa0, 0x38, 0x15, 0x63, 0xe9, 0xba, 
-	0x05, 0x5e, 0xf9, 0xfa, 0xc0, 0xdf, 0x00, 0xe0, 
-	0xd1, 0x80, 0x70, 0x06, 0x10, 0x1c, 0xc1, 0x40, 
-	0x11, 0x48, 0xd3, 0x10, 0x00, 0x21, 0xd0, 0x80, 
-	0xb0, 0x16, 0xe9, 0xca, 0xd3, 0x20, 0x10, 0x81, 
-	0xb0, 0x16, 0xf9, 0xfa, 0x30, 0xc2, 0xd2, 0x64, 
-	0xd0, 0x92, 0x00, 0xee, 0xd0, 0x54, 0x70, 0x41, 
-	0x30, 0x43, 0xed, 0xd7, 0xd2, 0x6c, 0x72, 0x49, 
-	0xc0, 0x89, 0xb0, 0xbf, 0x10, 0x9f, 0x22, 0x42, 
-	0x04, 0x31, 0xd0, 0x10, 0xc0, 0x42, 0x30, 0x49, 
-	0xe5, 0xde, 0x10, 0x03, 0xc1, 0x0c, 0xc1, 0x83, 
-	0xb1, 0xbe, 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 
-	0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 
-	0xb1, 0x01, 0xed, 0xe1, 0xc1, 0x0c, 0x21, 0x85, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 
-	0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 
-	0xed, 0xec, 0x02, 0xe4, 0xd0, 0x00, 0x20, 0xc0, 
-	0xb2, 0x41, 0xed, 0xd8, 0x15, 0xa3, 0xfa, 0x00, 
-	0xbc, 0x10, 0x0c, 0x1e, 0xfa, 0x00, 0xbc, 0x10, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xfa, 0x00, 
-	0x00, 0x27, 0xd0, 0x10, 0xd0, 0x40, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x14, 0x60, 0x40, 0xb0, 0x28, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0x28, 0xd1, 0xb0, 0x70, 0x06, 0xd0, 0x81, 
-	0x60, 0x86, 0x10, 0x20, 0xe9, 0xab, 0xb0, 0x3f, 
-	0x60, 0x06, 0x00, 0xec, 0xd1, 0x84, 0x70, 0x46, 
-	0xb1, 0x84, 0x70, 0x86, 0x30, 0x42, 0xe9, 0xab, 
-	0x70, 0x42, 0xd0, 0x35, 0x30, 0x40, 0xf9, 0xab, 
-	0x00, 0x63, 0xd0, 0x3f, 0xb0, 0xbc, 0x40, 0x80, 
-	0x70, 0xc2, 0x10, 0xe3, 0xe5, 0xab, 0xb0, 0xbc, 
-	0x40, 0x80, 0x60, 0x86, 0x00, 0x28, 0xd0, 0x24, 
-	0x70, 0x40, 0x00, 0x22, 0xd0, 0x80, 0x50, 0x42, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0xd0, 0x90, 
-	0x60, 0x81, 0x00, 0xed, 0xd1, 0x88, 0x70, 0x46, 
-	0x10, 0xe4, 0xe9, 0xa8, 0x00, 0x21, 0xd0, 0xe8, 
-	0xd0, 0x00, 0x60, 0x03, 0xd0, 0x81, 0x40, 0x42, 
-	0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0xe0, 0x46, 
-	0xd0, 0x82, 0x50, 0x42, 0x60, 0x46, 0x00, 0x23, 
-	0xd5, 0x3e, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x01, 0x46, 0xdf, 0x5c, 0x08, 0x20, 0xd1, 0x00, 
-	0xcf, 0x04, 0x11, 0x08, 0xa1, 0x0a, 0xa1, 0x1b, 
-	0x11, 0x1f, 0xa1, 0x27, 0xd2, 0x80, 0xb2, 0x81, 
-	0x90, 0x4d, 0xc0, 0x01, 0x10, 0x14, 0x00, 0x16, 
-	0xe9, 0x8d, 0x80, 0x33, 0x80, 0x3f, 0x92, 0x8b, 
-	0x00, 0x23, 0xd0, 0x3f, 0x42, 0x80, 0xe9, 0x8d, 
-	0x0f, 0xff, 0xdf, 0xff, 0x40, 0x01, 0xa0, 0x0d, 
-	0xe1, 0x94, 0xa1, 0x0a, 0x00, 0xea, 0xd0, 0x00, 
-	0xd0, 0x8e, 0x00, 0x06, 0x0f, 0x0b, 0x70, 0x80, 
-	0x80, 0x73, 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 
-	0xf9, 0x9a, 0xd0, 0x01, 0xd0, 0x44, 0x40, 0x70, 
-	0x20, 0x01, 0x15, 0x63, 0xf9, 0xa1, 0x80, 0x1b, 
-	0xe1, 0xa2, 0x80, 0x5b, 0xa0, 0x27, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 
-	0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 0xd0, 0x00, 
-	0xcf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb2, 0xd2, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0x30, 0xd0, 0x10, 0xa0, 0x38, 0x80, 0x3f, 
-	0x00, 0xc6, 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 
-	0xd0, 0x41, 0x50, 0x01, 0x60, 0x04, 0x00, 0x27, 
-	0xd0, 0x18, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0xd4, 0x00, 
-	0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0xd3, 0x81, 
-	0x12, 0xa0, 0xed, 0xe3, 0xd0, 0x08, 0x0a, 0x09, 
-	0x00, 0x4d, 0xb0, 0x01, 0xed, 0xdf, 0x03, 0xbf, 
-	0xd4, 0x27, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 
-	0x02, 0x24, 0xd0, 0x00, 0xa0, 0x37, 0x00, 0x27, 
-	0xd3, 0xd0, 0x00, 0x26, 0xd0, 0x04, 0x73, 0xcf, 
-	0x13, 0xe1, 0xe9, 0x7b, 0xb0, 0x3c, 0xf2, 0x00, 
-	0x00, 0x26, 0xd0, 0x40, 0xd0, 0x00, 0x60, 0x01, 
-	0x00, 0x26, 0xd0, 0x14, 0xf2, 0x00, 0x00, 0x26, 
-	0xd0, 0x18, 0xf2, 0x00, 0x00, 0xee, 0xd0, 0x1c, 
-	0x71, 0x40, 0xd1, 0x24, 0x15, 0x63, 0xe9, 0x8d, 
-	0x11, 0x1f, 0xc7, 0x1a, 0xb7, 0x01, 0xd3, 0x81, 
-	0xc4, 0xd4, 0xf2, 0x04, 0x00, 0x26, 0xd0, 0x18, 
-	0x70, 0x40, 0xb0, 0x54, 0xfd, 0x9b, 0x00, 0xed, 
-	0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x13, 0xe1, 
-	0xf9, 0xbc, 0x15, 0xa3, 0xf9, 0xa1, 0x0c, 0x10, 
-	0xe9, 0xb9, 0x11, 0x61, 0xe5, 0xb3, 0xed, 0xb9, 
-	0x15, 0xa3, 0xf9, 0xab, 0x00, 0x26, 0xd0, 0x14, 
-	0x70, 0x40, 0x10, 0x62, 0xf5, 0xb3, 0x15, 0x22, 
-	0xe5, 0xb3, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb3, 
-	0x34, 0xd4, 0xf5, 0xb3, 0xe1, 0xbf, 0x03, 0xb4, 
-	0xd6, 0x29, 0x00, 0x26, 0xd0, 0x40, 0x60, 0x01, 
-	0xe1, 0xdb, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x80, 0x07, 
-	0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 
-	0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 
-	0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 
-	0x00, 0x50, 0xf9, 0xc9, 0x0c, 0x49, 0xd0, 0x61, 
-	0x00, 0x8d, 0x10, 0xa0, 0xe9, 0x90, 0x30, 0x42, 
-	0xf5, 0xd8, 0xd0, 0x61, 0x23, 0x81, 0xe1, 0xce, 
-	0x23, 0x82, 0x13, 0xa1, 0xf9, 0x90, 0xd0, 0x42, 
-	0x15, 0xa1, 0xf9, 0xdf, 0xb0, 0x7f, 0x00, 0x26, 
-	0xd0, 0x14, 0x70, 0x00, 0x30, 0x01, 0xf5, 0xe8, 
-	0x16, 0xe0, 0xe5, 0xe8, 0xb6, 0xc1, 0xbc, 0x20, 
-	0xc0, 0x44, 0x30, 0x5b, 0xfd, 0xb9, 0xc0, 0x44, 
-	0x30, 0x54, 0xe5, 0xb9, 0x15, 0x63, 0xf9, 0xf8, 
-	0x15, 0xa3, 0xf9, 0xf5, 0x03, 0x3c, 0xd8, 0x1c, 
-	0xe0, 0x46, 0x03, 0x39, 0xda, 0x17, 0xe0, 0x46, 
-	0x15, 0xa3, 0xf9, 0xfd, 0x03, 0x72, 0xde, 0x19, 
-	0xe0, 0x46, 0x03, 0x70, 0xd0, 0x17, 0xe0, 0x46, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x0f, 0xc5, 
-	0xdf, 0x00, 0x0c, 0x09, 0x05, 0x0d, 0x08, 0x20, 
-	0xdf, 0x00, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xef, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x60, 
-	0xe9, 0x45, 0xb0, 0x04, 0x70, 0x40, 0xb0, 0x41, 
-	0xed, 0x44, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x20, 0x70, 0x00, 
-	0x10, 0x30, 0xe9, 0x45, 0x00, 0x21, 0xd0, 0x28, 
-	0x60, 0x40, 0x00, 0x64, 0xd2, 0xc0, 0x70, 0x0b, 
-	0x00, 0x11, 0xe9, 0x6a, 0x08, 0x20, 0xd0, 0x4f, 
-	0x30, 0x40, 0xe9, 0x55, 0xb0, 0x4f, 0xf9, 0x6a, 
-	0x03, 0xef, 0xdf, 0xbf, 0xaf, 0xb8, 0xdf, 0x80, 
-	0x0f, 0x87, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, 
-	0xed, 0x6c, 0xdf, 0x84, 0xd0, 0x40, 0x60, 0x7e, 
-	0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 
-	0x01, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 0x80, 0x34, 
-	0x80, 0x3f, 0x01, 0x3c, 0xd2, 0x39, 0x00, 0x21, 
-	0xdf, 0x86, 0x0f, 0x87, 0xd0, 0x40, 0x60, 0x4b, 
-	0x03, 0xe6, 0xd0, 0x08, 0xe0, 0x36, 0x50, 0x00, 
-	0x00, 0x28, 0xd0, 0x24, 0x72, 0xc0, 0xd0, 0x40, 
-	0x60, 0x40, 0xd0, 0x0c, 0x52, 0xc0, 0xc0, 0x1c, 
-	0x30, 0x1d, 0xf5, 0x3c, 0x20, 0x1f, 0x30, 0x1e, 
-	0x90, 0x6d, 0x20, 0x01, 0x00, 0x22, 0xd0, 0x58, 
-	0x60, 0x01, 0x00, 0xe3, 0xd0, 0x48, 0x70, 0x41, 
-	0x30, 0x40, 0xf5, 0x47, 0xb2, 0xc8, 0x00, 0xe3, 
-	0xd0, 0x4c, 0x70, 0x41, 0x30, 0x40, 0xfd, 0x4d, 
-	0xb2, 0xc4, 0x00, 0x28, 0xd0, 0x20, 0x70, 0x00, 
-	0x42, 0xc0, 0xa2, 0xc5, 0x12, 0xe0, 0xe9, 0x55, 
-	0x80, 0x40, 0x80, 0x34, 0x80, 0x3f, 0xcf, 0x95, 
-	0x82, 0x34, 0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00, 
-	0x1f, 0xa3, 0xe9, 0x60, 0x03, 0xea, 0xd0, 0x00, 
-	0x00, 0x27, 0xd0, 0x4c, 0x7f, 0x81, 0x00, 0x27, 
-	0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 0x03, 0xa0, 
-	0xd0, 0x40, 0xa0, 0x78, 0xe0, 0x3c, 0x50, 0x00, 
-	0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0x41, 
-	0x30, 0x4d, 0x40, 0x43, 0x10, 0x43, 0x20, 0x81, 
-	0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 0x20, 0x9b, 
-	0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, 
-	0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, 
-	0x10, 0x97, 0x01, 0xd0, 0xe9, 0x48, 0xb0, 0x96, 
-	0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, 
-	0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, 
-	0x41, 0x0d, 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 
-	0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 
-	0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5e, 0xc2, 0xca, 
-	0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 0xd0, 0x78, 
-	0x03, 0x50, 0xf9, 0x69, 0xd0, 0x7c, 0x01, 0x9d, 
-	0xf9, 0x69, 0xc2, 0x48, 0xb2, 0x60, 0xc2, 0xca, 
-	0xb2, 0xf0, 0x11, 0x82, 0x41, 0x81, 0x22, 0x06, 
-	0x11, 0x9f, 0x41, 0x81, 0x22, 0x86, 0x0f, 0xc5, 
-	0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd1, 0x8f, 
-	0x41, 0x82, 0x10, 0x9c, 0xc1, 0xdb, 0x11, 0xc1, 
-	0x21, 0xc3, 0x20, 0x87, 0xc1, 0xc2, 0x10, 0x82, 
-	0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, 
-	0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, 
-	0xe9, 0x46, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, 
-	0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, 
-	0x10, 0x86, 0x20, 0x42, 0xd0, 0x81, 0x41, 0x02, 
-	0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 
-	0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 
-	0x01, 0xd0, 0xe9, 0x5d, 0xc2, 0xca, 0x22, 0xc9, 
-	0xb2, 0xa0, 0x22, 0x48, 0x11, 0x9f, 0x11, 0x83, 
-	0x22, 0x06, 0x11, 0x9c, 0x11, 0x83, 0x22, 0x86, 
-	0x0f, 0xc5, 0xd0, 0x41, 0x40, 0x44, 0x20, 0x55, 
-	0x10, 0x62, 0xf9, 0x6f, 0x01, 0xb5, 0xd4, 0x00, 
-	0xc2, 0x9f, 0xc2, 0x1f, 0x22, 0x80, 0xe1, 0x30, 
-	0x0f, 0x11, 0xf9, 0x51, 0x90, 0x38, 0x80, 0x3f, 
-	0x00, 0x1b, 0xf9, 0x51, 0x00, 0x27, 0xd0, 0x04, 
-	0x70, 0x40, 0x30, 0x71, 0xf9, 0x51, 0xb0, 0x3c, 
-	0x70, 0x40, 0x30, 0x5d, 0xf9, 0x51, 0xb0, 0x08, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x10, 0x63, 
-	0xe5, 0x5d, 0x02, 0x20, 0xd0, 0x01, 0xa0, 0x37, 
-	0x00, 0x26, 0xd0, 0x24, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x41, 
-	0x60, 0x40, 0x00, 0x26, 0xd0, 0x30, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x30, 0xd0, 0x40, 
-	0x60, 0x40, 0xb0, 0x3c, 0x6c, 0x40, 0xb0, 0x3c, 
-	0x67, 0x40, 0x00, 0x33, 0xdf, 0xb0, 0xe0, 0x36, 
-	0x00, 0x26, 0xd0, 0x1c, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0xb0, 0x3c, 0x70, 0x40, 0xb0, 0x41, 
-	0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x35, 
-	0xc0, 0x3c, 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x27, 
-	0xa0, 0x1b, 0xdf, 0x5c, 0x01, 0xa0, 0xd0, 0x00, 
-	0xa0, 0x38, 0x80, 0x3f, 0x80, 0x34, 0x80, 0x3f, 
-	0x03, 0xbb, 0xd8, 0x1e, 0xcf, 0x95, 0x82, 0x34, 
-	0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00, 0x1f, 0xa3, 
-	0xe9, 0x55, 0x1f, 0xa0, 0xe9, 0x55, 0x03, 0xea, 
-	0xd0, 0x00, 0x00, 0x21, 0xdf, 0x86, 0xe0, 0x3c, 
-	0x89, 0x78, 0x89, 0x37, 0x00, 0xee, 0xd0, 0x14, 
-	0x76, 0x00, 0xd0, 0x30, 0x76, 0x40, 0x26, 0x58, 
-	0xd6, 0xd9, 0x00, 0xee, 0xd0, 0x20, 0x75, 0x40, 
-	0xd0, 0x1c, 0x71, 0x40, 0xd0, 0x20, 0x71, 0x00, 
-	0xd0, 0x24, 0x70, 0x80, 0xc4, 0x02, 0xd0, 0x28, 
-	0x70, 0xc0, 0x00, 0x21, 0xd0, 0x10, 0x72, 0x00, 
-	0x93, 0x90, 0xd4, 0x81, 0x13, 0x96, 0x43, 0x92, 
-	0x34, 0x8e, 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x86, 
-	0xde, 0x40, 0x7e, 0x79, 0xd0, 0x18, 0x70, 0x40, 
-	0xb0, 0x41, 0xf5, 0x58, 0xd3, 0x42, 0x50, 0x4d, 
-	0x60, 0x40, 0x10, 0x60, 0xe5, 0x62, 0xd0, 0x54, 
-	0x70, 0x01, 0xb0, 0x3c, 0x60, 0x01, 0x04, 0x2d, 
-	0xd0, 0x30, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x60, 
-	0x71, 0xc1, 0xd0, 0x4f, 0x41, 0xc1, 0x04, 0x20, 
-	0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x04, 0x22, 0xd0, 0x18, 0xd3, 0x44, 0x72, 0x8d, 
-	0x12, 0xa0, 0xe8, 0x36, 0xc0, 0x47, 0x10, 0x5d, 
-	0x30, 0x4e, 0xf8, 0x36, 0xb2, 0x3e, 0x60, 0x4d, 
-	0x00, 0xed, 0xd0, 0x48, 0x70, 0x01, 0xde, 0x45, 
-	0x50, 0x39, 0x00, 0x1b, 0xf9, 0x44, 0xb0, 0x01, 
-	0x00, 0x1c, 0xf9, 0x47, 0xb0, 0x04, 0x60, 0x01, 
-	0xd0, 0x40, 0x62, 0x81, 0xce, 0x4a, 0xd0, 0x43, 
-	0x41, 0xc1, 0xd0, 0x58, 0x61, 0xc1, 0x90, 0x43, 
-	0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 0x10, 0x1f, 
-	0x20, 0x40, 0xb1, 0xc1, 0xf5, 0x54, 0x00, 0x21, 
-	0xd0, 0x08, 0x60, 0x40, 0x00, 0xe6, 0xd0, 0x40, 
-	0x70, 0x41, 0xd2, 0x94, 0x60, 0x4a, 0x04, 0x2c, 
-	0xd0, 0x08, 0x01, 0x90, 0xf8, 0x36, 0x04, 0x2d, 
-	0xd0, 0x30, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf9, 0x41, 
-	0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 
-	0x20, 0x40, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, 
-	0x00, 0x26, 0xd0, 0x74, 0x70, 0x01, 0xb0, 0x3f, 
-	0x60, 0x01, 0x00, 0xed, 0xd0, 0x48, 0x70, 0x41, 
-	0x00, 0x5e, 0xf9, 0x4b, 0x00, 0x21, 0xd0, 0x00, 
-	0x73, 0x80, 0xd4, 0x81, 0x34, 0x8e, 0x00, 0x34, 
-	0xd3, 0x70, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xd1, 0x88, 0xd1, 0xc8, 0x01, 0x1b, 0xe9, 0x39, 
-	0x11, 0x9f, 0x11, 0xdf, 0xd4, 0x80, 0xd3, 0x81, 
-	0xe1, 0x43, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x00, 
-	0x00, 0x10, 0xf9, 0x37, 0x0c, 0x1f, 0xf9, 0x36, 
-	0x13, 0xa1, 0xe9, 0x43, 0xbe, 0x7c, 0x00, 0x69, 
-	0xd2, 0x54, 0x12, 0x48, 0xc0, 0x39, 0x30, 0x18, 
-	0xe5, 0x4b, 0xd2, 0x70, 0x72, 0x49, 0x22, 0x79, 
-	0x00, 0x21, 0xd0, 0x00, 0x63, 0x80, 0x04, 0x24, 
-	0xd0, 0x38, 0x02, 0x10, 0xe9, 0x56, 0xd0, 0x41, 
-	0x51, 0x41, 0xe0, 0x36, 0x15, 0x61, 0xe8, 0x36, 
-	0xd5, 0x80, 0xd3, 0x00, 0xd3, 0x40, 0x04, 0x28, 
-	0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0x21, 0xd0, 0x18, 0x73, 0x00, 0xb0, 0x04, 
-	0x73, 0x80, 0xd2, 0x80, 0xb0, 0x38, 0x72, 0xc0, 
-	0x31, 0x0d, 0xc0, 0x0e, 0x10, 0x0b, 0x10, 0x20, 
-	0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x8d, 0x10, 0x01, 
-	0x13, 0x5f, 0xe1, 0x3b, 0x33, 0x8b, 0x15, 0x61, 
-	0xf9, 0x49, 0x00, 0x21, 0xd0, 0x64, 0x70, 0x41, 
-	0x33, 0x81, 0x03, 0xd0, 0xe9, 0x4c, 0x20, 0x0b, 
-	0x13, 0xdf, 0x12, 0xc1, 0x13, 0xe0, 0xf9, 0x49, 
-	0x10, 0x03, 0xc0, 0x50, 0x10, 0x4b, 0x13, 0x0b, 
-	0x23, 0x00, 0x13, 0x20, 0xe9, 0x5c, 0xf5, 0x59, 
-	0x22, 0x81, 0x13, 0x01, 0x10, 0x5f, 0xe1, 0x55, 
-	0x12, 0x99, 0x12, 0x87, 0x21, 0x0a, 0x00, 0xa0, 
-	0xd2, 0x80, 0xc3, 0x0a, 0x03, 0x90, 0xe9, 0x66, 
-	0x22, 0x82, 0x23, 0x03, 0x10, 0x81, 0x10, 0xc1, 
-	0x13, 0x9f, 0x13, 0xa0, 0xed, 0x62, 0xc0, 0x8a, 
-	0xc0, 0xcc, 0x04, 0x26, 0xd0, 0x38, 0xe0, 0x36, 
-	0x15, 0x61, 0xf9, 0x3d, 0x07, 0x32, 0xd0, 0x00, 
-	0x30, 0x03, 0xed, 0x3d, 0xc0, 0x03, 0x10, 0x1d, 
-	0x30, 0xc0, 0xc0, 0x02, 0x10, 0x1d, 0x30, 0x80, 
-	0xe1, 0x32, 0x10, 0x94, 0x10, 0xd4, 0x00, 0x21, 
-	0xd0, 0x20, 0x73, 0x00, 0xc5, 0x8c, 0xd3, 0x4e, 
-	0x01, 0x1b, 0xe9, 0x48, 0x13, 0x1f, 0xd3, 0x4f, 
-	0x43, 0x4c, 0x13, 0x1c, 0xc0, 0x0c, 0x10, 0x03, 
-	0x20, 0x0c, 0xc0, 0x40, 0x10, 0x42, 0x20, 0x40, 
-	0x10, 0x46, 0x20, 0x4d, 0x10, 0x42, 0x2e, 0x41, 
-	0x10, 0x5c, 0x10, 0x43, 0x00, 0x59, 0xe9, 0x5b, 
-	0x01, 0x69, 0xd0, 0x20, 0x30, 0x40, 0x22, 0x41, 
-	0x04, 0x28, 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, 
-	0x2c, 0x14, 0xd0, 0x34, 0x63, 0x00, 0xd0, 0x38, 
-	0x72, 0xc0, 0xc0, 0x51, 0x10, 0x5c, 0x30, 0x4b, 
-	0x10, 0x44, 0xd4, 0xc0, 0xd5, 0x00, 0xc0, 0x18, 
-	0x30, 0x39, 0xed, 0x5f, 0xd4, 0xd0, 0xc5, 0x01, 
-	0xd0, 0x18, 0x70, 0x00, 0x0c, 0x1f, 0xe9, 0x48, 
-	0x10, 0x20, 0xfd, 0x48, 0xd4, 0xc0, 0xd5, 0x00, 
-	0x10, 0x22, 0xe5, 0x4e, 0xd4, 0xc0, 0xbc, 0x30, 
-	0xd5, 0x00, 0xb5, 0x10, 0xb0, 0x3f, 0xf9, 0x52, 
-	0x3c, 0x01, 0x3c, 0x01, 0x02, 0x1f, 0xe9, 0x5f, 
-	0x00, 0xa8, 0xd3, 0xc0, 0xd3, 0xa4, 0x00, 0xaa, 
-	0xd0, 0x10, 0x70, 0x4f, 0xb3, 0xfc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb3, 0x81, 0xed, 0x59, 0x00, 0x21, 
-	0xd0, 0x28, 0x70, 0x00, 0x10, 0x20, 0xf9, 0x69, 
-	0x02, 0x1f, 0xf9, 0x6a, 0x90, 0x10, 0x00, 0x1e, 
-	0xe9, 0x6a, 0xb1, 0x7c, 0x04, 0x2a, 0xd0, 0x18, 
-	0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 
-	0x01, 0x5e, 0xf9, 0x35, 0x01, 0x50, 0xe9, 0x35, 
-	0xb1, 0x78, 0xd2, 0x00, 0x01, 0x5c, 0xf9, 0x5f, 
-	0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 0x11, 0x9f, 
-	0xce, 0x58, 0xc2, 0x59, 0x00, 0xaa, 0xd2, 0x10, 
-	0x14, 0x82, 0x22, 0x12, 0xc0, 0x0c, 0x10, 0x1f, 
-	0x10, 0x03, 0x22, 0x00, 0x70, 0x48, 0x03, 0x10, 
-	0xe9, 0x4c, 0xb2, 0x38, 0xbe, 0x60, 0xb2, 0x60, 
-	0x2e, 0x41, 0x10, 0x5f, 0x00, 0x59, 0xe9, 0x53, 
-	0x01, 0x69, 0xd0, 0x3c, 0x30, 0x40, 0x22, 0x41, 
-	0x13, 0x41, 0x2e, 0x4d, 0x13, 0x5d, 0x13, 0x43, 
-	0x22, 0x4d, 0x14, 0xe0, 0xe9, 0x5f, 0x33, 0x0b, 
-	0x13, 0x04, 0x2c, 0x0c, 0x35, 0x0c, 0xc3, 0x46, 
-	0xc3, 0x87, 0x04, 0x62, 0xd0, 0x10, 0x15, 0x62, 
-	0xfc, 0x36, 0x04, 0x60, 0xd0, 0x10, 0xe0, 0x36, 
-	0x00, 0x22, 0xd0, 0x74, 0x74, 0x01, 0xb0, 0x7c, 
-	0x74, 0x41, 0xb0, 0x7c, 0x71, 0x41, 0xd1, 0x18, 
-	0xc0, 0x10, 0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x45, 
-	0x00, 0x24, 0xd0, 0x20, 0x30, 0x11, 0xf9, 0x45, 
-	0xb1, 0x70, 0x01, 0x50, 0xf9, 0x45, 0xb1, 0x20, 
-	0x14, 0x41, 0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0, 
-	0x01, 0x50, 0xe9, 0x4b, 0xc0, 0xd0, 0x00, 0x35, 
-	0xdc, 0x00, 0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c, 
-	0x00, 0x21, 0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05, 
-	0x51, 0x40, 0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20, 
-	0x61, 0x00, 0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28, 
-	0x60, 0xc0, 0x04, 0x2d, 0xd0, 0x30, 0x00, 0x22, 
-	0xd0, 0x64, 0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36, 
-	0x90, 0x50, 0xd0, 0x3c, 0x10, 0x41, 0x60, 0x40, 
-	0x15, 0x62, 0xfd, 0x3d, 0xc0, 0x10, 0x10, 0x1e, 
-	0x10, 0x07, 0x21, 0x00, 0x10, 0x16, 0x34, 0x00, 
-	0xc0, 0x90, 0xd3, 0x40, 0x00, 0x24, 0xd3, 0xc0, 
-	0x04, 0x23, 0xd0, 0x18, 0x01, 0x9f, 0xe8, 0x36, 
-	0xd0, 0x54, 0x70, 0x41, 0x73, 0x41, 0x04, 0x2e, 
-	0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0x00, 0xef, 0xd3, 0x30, 0x73, 0x0c, 0xd0, 0x0c, 
-	0x70, 0x00, 0xc0, 0x40, 0x13, 0x24, 0xf5, 0x42, 
-	0x13, 0x22, 0xe9, 0x41, 0xe5, 0x43, 0xd3, 0x00, 
-	0x10, 0x22, 0xf9, 0x41, 0xd0, 0x01, 0xd0, 0x43, 
-	0xd3, 0x01, 0x21, 0x00, 0xd3, 0x40, 0x03, 0x10, 
-	0xf9, 0x47, 0xd3, 0x40, 0xe1, 0x61, 0x00, 0x23, 
-	0xd0, 0x00, 0x10, 0x61, 0xe9, 0x50, 0xb0, 0x33, 
-	0x10, 0x63, 0xe9, 0x50, 0x00, 0x22, 0xd0, 0x1a, 
-	0xc3, 0xc0, 0xd2, 0xc0, 0x00, 0x10, 0xe9, 0x55, 
-	0x22, 0xd0, 0x10, 0x1f, 0x14, 0x01, 0x10, 0x20, 
-	0xed, 0x52, 0x14, 0x18, 0x12, 0xd8, 0xc0, 0x8b, 
-	0x32, 0xd0, 0x12, 0xc3, 0x33, 0x4b, 0x13, 0x47, 
-	0x21, 0x0d, 0x04, 0x23, 0xd0, 0x18, 0xe0, 0x36, 
-	0x00, 0x24, 0xd0, 0x30, 0xd0, 0x40, 0x60, 0x40, 
-	0xd3, 0xc7, 0x43, 0xc4, 0x31, 0x0f, 0xd5, 0xd4, 
-	0x25, 0xcf, 0x15, 0xc4, 0x10, 0xdf, 0xc2, 0xc6, 
-	0xc3, 0x07, 0x11, 0x81, 0xb1, 0x3b, 0x15, 0x64, 
-	0xe9, 0x47, 0x10, 0xdf, 0x12, 0xc1, 0x11, 0x81, 
-	0x11, 0xc1, 0xb1, 0x3f, 0xb5, 0xf8, 0x90, 0x10, 
-	0x00, 0x16, 0xf9, 0x5e, 0xb5, 0xfc, 0xd0, 0x20, 
-	0x40, 0x39, 0x2e, 0x4b, 0x22, 0x4c, 0x12, 0x20, 
-	0xe9, 0x59, 0x20, 0x39, 0x00, 0x1b, 0xe9, 0x59, 
-	0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5a, 0xf9, 0x59, 
-	0xb2, 0x38, 0x02, 0xe3, 0xd0, 0x00, 0x0e, 0x5a, 
-	0xe9, 0x5e, 0x2e, 0x40, 0x01, 0xee, 0xd2, 0x80, 
-	0x42, 0x84, 0xc0, 0x03, 0x30, 0x02, 0xf5, 0x6b, 
-	0x31, 0x0a, 0x12, 0x98, 0x20, 0x03, 0xf5, 0x69, 
-	0x12, 0x9f, 0x12, 0x87, 0x51, 0x0a, 0x00, 0x34, 
-	0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 
-	0xd3, 0xc7, 0x43, 0xc4, 0x15, 0x61, 0xf9, 0x48, 
-	0x10, 0xc1, 0xd5, 0xe0, 0xd1, 0x80, 0xd1, 0xc0, 
-	0x31, 0x0f, 0x13, 0xe1, 0xe9, 0x3c, 0xd3, 0xc0, 
-	0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x25, 0xcf, 
-	0x15, 0xc2, 0xd0, 0x03, 0x40, 0x16, 0x25, 0xc0, 
-	0x15, 0xc2, 0x15, 0x81, 0x35, 0x91, 0xe1, 0x5c, 
-	0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x01, 0x50, 
-	0xe9, 0x54, 0x15, 0xa0, 0xf9, 0x55, 0x00, 0x24, 
-	0xd0, 0x34, 0x70, 0x00, 0x10, 0x20, 0xe9, 0x55, 
-	0xd3, 0xc0, 0x31, 0x0f, 0xd5, 0xfc, 0x25, 0xcf, 
-	0x15, 0xc3, 0x14, 0xa0, 0xe9, 0x5c, 0xb5, 0xfc, 
-	0x00, 0x34, 0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00, 
-	0xc4, 0x91, 0x34, 0x96, 0xed, 0x34, 0xd4, 0x80, 
-	0x14, 0x84, 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 
-	0x10, 0x5e, 0x34, 0x81, 0xb3, 0xc1, 0xe5, 0x41, 
-	0xc0, 0x52, 0x10, 0x5c, 0x24, 0x81, 0xb3, 0xc1, 
-	0xe5, 0x37, 0x02, 0xe8, 0xd0, 0x00, 0xb4, 0xb0, 
-	0x14, 0x9b, 0x00, 0x24, 0xd0, 0x60, 0x30, 0x52, 
-	0xed, 0x4a, 0x24, 0x81, 0x20, 0x12, 0xa0, 0x1c, 
-	0x10, 0x8a, 0x50, 0x83, 0xa0, 0x96, 0xa1, 0x50, 
-	0xa1, 0x11, 0xc0, 0x52, 0xd4, 0x84, 0x10, 0x6c, 
-	0xed, 0x56, 0xd4, 0x81, 0xd1, 0x00, 0xb1, 0x17, 
-	0x00, 0x23, 0xd1, 0x40, 0xc2, 0xb9, 0x22, 0x86, 
-	0x12, 0x20, 0xf9, 0x66, 0x02, 0xe3, 0xd0, 0x40, 
-	0x02, 0x9a, 0xe9, 0x63, 0x22, 0x81, 0x02, 0x5a, 
-	0xe9, 0x66, 0x22, 0x41, 0x75, 0xd7, 0xc3, 0xd7, 
-	0xd0, 0xd7, 0x00, 0x21, 0xd0, 0xb6, 0x8b, 0x38, 
-	0x00, 0x33, 0xdd, 0x08, 0xe0, 0x36, 0x50, 0x00, 
-	0xd0, 0x7c, 0x60, 0x01, 0xae, 0x52, 0xd0, 0x60, 
-	0x40, 0x79, 0x00, 0x13, 0xe8, 0xc9, 0xa2, 0x94, 
-	0x22, 0x86, 0x13, 0xe0, 0xe4, 0xd0, 0x13, 0xc1, 
-	0x15, 0x62, 0xfc, 0xd1, 0x13, 0xc1, 0xe0, 0xd1, 
-	0xc3, 0xd7, 0x03, 0xd9, 0xe8, 0xd4, 0x22, 0x8d, 
-	0x15, 0x62, 0xfc, 0xda, 0x03, 0xda, 0xe8, 0xda, 
-	0x22, 0x8d, 0x22, 0x8d, 0xce, 0x4a, 0x22, 0x86, 
-	0x00, 0x14, 0xe8, 0xe0, 0xa2, 0x53, 0x22, 0x47, 
-	0x03, 0xd1, 0xe8, 0xe8, 0x22, 0x4e, 0x15, 0x62, 
-	0xfc, 0xe8, 0x03, 0xd2, 0xe8, 0xe8, 0x22, 0x4e, 
-	0x12, 0x20, 0xe9, 0x09, 0x20, 0x79, 0x00, 0x5b, 
-	0xe8, 0xf4, 0x15, 0x20, 0xfc, 0xf1, 0x2c, 0x13, 
-	0x35, 0x13, 0x0e, 0x5b, 0xe8, 0xf4, 0xb2, 0x38, 
-	0x02, 0x9a, 0xe8, 0xfb, 0x70, 0x08, 0xd0, 0x7c, 
-	0x42, 0x81, 0x22, 0x98, 0x22, 0x80, 0x02, 0x5a, 
-	0xe9, 0x11, 0x70, 0x08, 0xd0, 0x78, 0x42, 0x41, 
-	0x22, 0x59, 0x10, 0x1f, 0x22, 0x40, 0x00, 0x19, 
-	0xe9, 0x11, 0x01, 0x69, 0xd0, 0x7c, 0x32, 0x41, 
-	0xe1, 0x11, 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 
-	0xe9, 0x0e, 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x11, 
-	0x22, 0x41, 0x0e, 0x5a, 0xe9, 0x15, 0xce, 0x4a, 
-	0x3e, 0x46, 0x0f, 0x87, 0xdd, 0x48, 0xe1, 0x19, 
-	0xdd, 0x40, 0xdc, 0xc8, 0xdd, 0x3c, 0x7d, 0x34, 
-	0x1d, 0x19, 0x3d, 0x35, 0x4d, 0x33, 0x4c, 0xec, 
-	0x3d, 0x33, 0xf9, 0x17, 0x0f, 0xc5, 0x50, 0x00, 
-	0xd0, 0x39, 0xd0, 0x35, 0xd0, 0x1d, 0xd0, 0x2d, 
-	0xd0, 0x3f, 0xd0, 0x2e, 0xd0, 0x3c, 0xd0, 0x37, 
-	0xd0, 0x33, 0xd0, 0x19, 0xd0, 0x33, 0xd0, 0x2e, 
-	0xd0, 0x3d, 0xd0, 0x3e, 0xd0, 0x27, 0xd0, 0x3e, 
-	0xd0, 0x3a, 0xd0, 0x2f, 0xd0, 0x32, 0x00, 0x00, 
-	0x00, 0x00, 0x46, 0x44, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x50, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0xd0, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x46, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x85, 
-	0x00, 0x00, 0xa6, 0xee, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x01, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0xa0, 
-	0x00, 0x08, 0x08, 0x28, 0x00, 0x08, 0x88, 0x68, 
-	0x00, 0x08, 0xa0, 0x98, 0x00, 0x08, 0x88, 0x68, 
-	0x00, 0x08, 0x28, 0x98, 0x00, 0x08, 0xac, 0xf4, 
-	0x00, 0x08, 0xb8, 0x7c, 0x00, 0x02, 0x02, 0x88, 
-	0x00, 0x02, 0x08, 0x22, 0x00, 0x02, 0x88, 0xaa, 
-	0x00, 0x02, 0x22, 0xaa, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x24, 
-	0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x28, 0x6c, 
-	0x00, 0x04, 0x28, 0x6c, 0x00, 0x01, 0x10, 0x44, 
-	0x00, 0x01, 0x20, 0x44, 0x00, 0x01, 0x11, 0xaa, 
-	0x00, 0x01, 0x88, 0x55, 0x00, 0x01, 0x44, 0xaa, 
-	0x00, 0x01, 0x44, 0x55, 0x00, 0x20, 0x80, 0xa0, 
-	0x00, 0x20, 0x80, 0xc0, 0x00, 0x20, 0x20, 0xa0, 
-	0x00, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, 
-	0x1a, 0x1b, 0x1d, 0x22, 0x10, 0x10, 0x16, 0x18, 
-	0x1b, 0x1d, 0x22, 0x25, 0x13, 0x16, 0x1a, 0x1b, 
-	0x1d, 0x22, 0x22, 0x26, 0x16, 0x16, 0x1a, 0x1b, 
-	0x1d, 0x22, 0x25, 0x28, 0x16, 0x1a, 0x1b, 0x1d, 
-	0x20, 0x23, 0x28, 0x30, 0x1a, 0x1b, 0x1d, 0x20, 
-	0x23, 0x28, 0x30, 0x3a, 0x1a, 0x1b, 0x1d, 0x22, 
-	0x26, 0x2e, 0x38, 0x45, 0x1b, 0x1d, 0x23, 0x26, 
-	0x2e, 0x38, 0x45, 0x53, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00, 
-	0x00, 0x1b, 0x08, 0x00, 0x00, 0x1f, 0xde, 0x00, 
-	0x00, 0x00, 0x50, 0x00, 0x00, 0x08, 0x39, 0x00, 
-	0x00, 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0x05, 0x28, 0x20, 0x01, 0x00, 0x00, 0x01, 0xe0, 
-	0x71, 0x01, 0x00, 0x68, 0xe0, 0x7f, 0xb0, 0x7f, 
-	0x60, 0x40, 0xe0, 0x1d, 0x90, 0x10, 0xb4, 0x81, 
-	0xe8, 0xc0, 0xe0, 0xc2, 0x90, 0x18, 0x00, 0x8a, 
-	0x70, 0xc0, 0x0f, 0x87, 0xe3, 0xe8, 0xc0, 0x00, 
-	0x70, 0x40, 0xe0, 0x01, 0xe0, 0x86, 0x00, 0x26, 
-	0xd0, 0x28, 0xe0, 0x0e, 0xd0, 0x0e, 0x0f, 0x0b, 
-	0x70, 0x1d, 0xe0, 0x67, 0x0f, 0x87, 0x0f, 0x87, 
-	0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x02, 0x20, 
-	0xd0, 0x01, 0xe0, 0x25, 0x0f, 0x45, 0x6f, 0x81, 
-	0xdf, 0xa6, 0xe0, 0x36, 0xe1, 0x30, 0xa0, 0x37, 
-	0xc0, 0x00, 0xe0, 0x26, 0x00, 0x33, 0xde, 0xc8, 
-	0xe0, 0x32, 0x0f, 0xc5, 0x0f, 0x87, 0x00, 0x27, 
-	0xd0, 0x4c, 0xe0, 0x21, 0x00, 0x33, 0xdf, 0x28, 
-	0x00, 0x27, 0xd0, 0x56, 0x60, 0x01, 0xe0, 0x2d, 
-	0x03, 0xa0, 0xd0, 0x41, 0xa0, 0x78, 0x00, 0x60, 
-	0xd0, 0x41, 0xa0, 0x77, 0x00, 0x22, 0xd0, 0x58, 
-	0xa0, 0x76, 0x00, 0x21, 0xd0, 0x7c, 0x00, 0x4a, 
-	0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 0x0f, 0x87, 
-	0x00, 0x22, 0xdc, 0xf8, 0xf0, 0x4a, 0xe1, 0x70, 
-	0x07, 0xef, 0xdd, 0xbf, 0x4f, 0x36, 0x1d, 0x99, 
-	0x4d, 0x80, 0x10, 0x18, 0xdd, 0x50, 0x60, 0x35, 
-	0xdd, 0x72, 0xdd, 0x10, 0x3d, 0xb4, 0xec, 0x57, 
-	0x2d, 0x36, 0x1d, 0x03, 0xbd, 0x04, 0xe4, 0x2b, 
-	0x01, 0x46, 0x00, 0x06, 0xac, 0xf6, 0x80, 0x3f, 
-	0x0d, 0x0a, 0x10, 0x02, 0x7d, 0x40, 0x10, 0x1e, 
-	0xb0, 0x20, 0xbc, 0xe0, 0x00, 0x06, 0x00, 0xc6, 
-	0xe0, 0x52, 0xb7, 0x60, 0xb7, 0x60, 0xc0, 0x5d, 
-	0x30, 0x5f, 0xe4, 0x72, 0xc7, 0x5e, 0x00, 0xed, 
-	0xd0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0xc0, 0x1d, 0x30, 0x1c, 0xf8, 0x7e, 0x00, 0x21, 
-	0xd0, 0x01, 0x00, 0x26, 0xd0, 0x78, 0xa0, 0x38, 
-	0x80, 0x3f, 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 
-	0x0f, 0x87, 0x80, 0x34, 0x03, 0xef, 0xd8, 0x3f, 
-	0xa8, 0x38, 0x01, 0x35, 0xdc, 0x33, 0xe0, 0x46, 
-	0xc0, 0x1c, 0xe4, 0xa5, 0x97, 0x2e, 0x30, 0x1c, 
-	0xe8, 0x8e, 0x00, 0x21, 0xd0, 0x00, 0xa0, 0x38, 
-	0xc0, 0x5d, 0x00, 0x23, 0xd0, 0x00, 0x30, 0x40, 
-	0x30, 0x5e, 0xe4, 0x99, 0x20, 0x5e, 0xc0, 0x01, 
-	0x30, 0x1c, 0xec, 0xa4, 0xe0, 0x9d, 0x20, 0x5f, 
-	0xc0, 0x1c, 0x30, 0x01, 0xf4, 0xa5, 0xc0, 0x1c, 
-	0x30, 0x1d, 0xec, 0xa4, 0xe4, 0xa5, 0x90, 0x38, 
-	0x00, 0x1b, 0xe8, 0xa5, 0xa0, 0x66, 0xb1, 0x3f, 
-	0xe4, 0xb3, 0xe8, 0xb1, 0xc0, 0x4b, 0x30, 0x44, 
-	0xf8, 0xb3, 0x60, 0x45, 0xb1, 0x7c, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x72, 0xc5, 
-	0x00, 0x06, 0x90, 0x55, 0xd0, 0x01, 0x00, 0x40, 
-	0xa0, 0x55, 0x0f, 0x87, 0x01, 0x46, 0x00, 0x06, 
-	0x03, 0xef, 0xd0, 0x3f, 0xa0, 0x38, 0xb0, 0x01, 
-	0xa0, 0x37, 0x80, 0x3f, 0x82, 0x34, 0x80, 0x3f, 
-	0xf2, 0x1a, 0x80, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 
-	0xd8, 0x00, 0xd8, 0x40, 0xd8, 0x80, 0xd8, 0xc0, 
-	0xd9, 0x00, 0xd9, 0x40, 0xd9, 0x80, 0xd9, 0xc0, 
-	0xda, 0x00, 0xda, 0x40, 0xda, 0x80, 0xda, 0xc0, 
-	0xdb, 0x00, 0xdb, 0x40, 0xdb, 0x80, 0xdb, 0xc0, 
-	0xdc, 0x00, 0xdc, 0x40, 0xdc, 0x80, 0xdc, 0xc0, 
-	0xdd, 0x00, 0xdd, 0x40, 0xdd, 0x80, 0xdd, 0xc0, 
-	0xde, 0x00, 0xde, 0x40, 0xde, 0x80, 0xde, 0xc0, 
-	0xdf, 0x00, 0xdf, 0x40, 0xdf, 0x80, 0xdf, 0xc0, 
-	0xde, 0x80, 0xde, 0xc1, 0x00, 0x28, 0xd0, 0x60, 
-	0x6e, 0x81, 0x80, 0x00, 0x80, 0x05, 0x00, 0xe3, 
-	0xd1, 0x88, 0x00, 0x73, 0xd5, 0x80, 0x60, 0x06, 
-	0xb1, 0xbc, 0x00, 0xfa, 0xd0, 0x80, 0x60, 0x06, 
-	0x00, 0x26, 0xd0, 0x6c, 0x6e, 0x81, 0x04, 0x32, 
-	0xd2, 0x00, 0x00, 0xee, 0xd1, 0x94, 0x60, 0x06, 
-	0x00, 0xed, 0xd0, 0x50, 0x6e, 0x81, 0x00, 0x22, 
-	0xd0, 0x70, 0x6e, 0x81, 0x00, 0xee, 0xd0, 0x74, 
-	0x6e, 0x81, 0xd0, 0x4c, 0x6e, 0x81, 0xd0, 0x02, 
-	0x00, 0xef, 0xd0, 0x6c, 0x60, 0x01, 0xd0, 0x03, 
-	0x00, 0xef, 0xd0, 0x70, 0x60, 0x01, 0x00, 0xe0, 
-	0xd0, 0x48, 0xd0, 0x02, 0x60, 0x01, 0x00, 0x32, 
-	0xd6, 0xf0, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x60, 
-	0xa0, 0x76, 0x00, 0x34, 0xd5, 0x48, 0x80, 0x3f, 
-	0x00, 0x23, 0xd0, 0x5c, 0x00, 0x4a, 0xd0, 0x72, 
-	0x70, 0x40, 0x00, 0x06, 0x00, 0x22, 0xd1, 0xa4, 
-	0x6e, 0xc6, 0xd0, 0x58, 0x6e, 0xc1, 0xd0, 0xc9, 
-	0x00, 0xed, 0xd0, 0x54, 0x60, 0xc1, 0x00, 0x22, 
-	0xd0, 0x40, 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x60, 
-	0x60, 0xc1, 0x82, 0x34, 0x80, 0x3f, 0xd6, 0xd9, 
-	0x01, 0x20, 0xd6, 0x22, 0x16, 0x08, 0xd0, 0x5e, 
-	0xd0, 0x2c, 0x60, 0x40, 0xd0, 0x70, 0x01, 0x74, 
-	0xd6, 0x00, 0x60, 0x01, 0x00, 0x2b, 0xd4, 0x10, 
-	0x00, 0x27, 0xd4, 0x60, 0x00, 0x2b, 0xd0, 0x90, 
-	0xc0, 0xc2, 0xd1, 0x08, 0xd1, 0x44, 0xa1, 0x50, 
-	0x00, 0x21, 0xd0, 0xb6, 0xd0, 0xd7, 0x00, 0x29, 
-	0xd0, 0x04, 0x64, 0x00, 0xb0, 0x3c, 0x64, 0x40, 
-	0x80, 0x34, 0x80, 0x3f, 0xd0, 0x40, 0x00, 0x35, 
-	0xd0, 0x00, 0x60, 0x01, 0xd0, 0x48, 0x6e, 0x81, 
-	0xd0, 0x44, 0x6e, 0x81, 0x00, 0x64, 0xd1, 0x80, 
-	0x6e, 0x86, 0x01, 0x3c, 0xd2, 0x39, 0xe0, 0x46, 
-	0xd0, 0x00, 0xd0, 0x40, 0xd0, 0x80, 0xd0, 0xc0, 
-	0xd1, 0x00, 0xd1, 0x40, 0xd1, 0x80, 0xd1, 0xc0, 
-	0xd2, 0x00, 0xd2, 0x40, 0xd2, 0x80, 0xd2, 0xc0, 
-	0xd3, 0x00, 0xd3, 0x40, 0xd3, 0x80, 0xd3, 0xc0, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0xd5, 0x00, 0xd5, 0x40, 0xd5, 0x80, 0xd5, 0xc0, 
-	0xd6, 0x00, 0xd6, 0x40, 0xd6, 0x80, 0xd6, 0xc0, 
-	0xd7, 0x00, 0xd7, 0x40, 0xd7, 0x80, 0xd7, 0xc0, 
-	0x0f, 0xc5, 0x50, 0x00, 0x01, 0x46, 0x00, 0x06, 
-	0xde, 0x80, 0xde, 0xc1, 0x03, 0x2f, 0xd0, 0x33, 
-	0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, 
-	0x08, 0x20, 0xdf, 0x00, 0x82, 0x34, 0x80, 0x3f, 
-	0x00, 0xee, 0xd0, 0x08, 0x77, 0xc0, 0xb0, 0x04, 
-	0x77, 0x80, 0xb0, 0x04, 0xc0, 0x5f, 0x30, 0x5e, 
-	0x60, 0x40, 0xd7, 0x00, 0xb7, 0x01, 0x80, 0x34, 
-	0x80, 0x3f, 0x00, 0x60, 0xd0, 0x80, 0x00, 0xec, 
-	0xd0, 0x40, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, 
-	0x00, 0xa0, 0xd0, 0x80, 0xb0, 0x74, 0x60, 0x81, 
-	0xb0, 0x7c, 0x60, 0x81, 0x00, 0x68, 0xd0, 0x80, 
-	0x6e, 0x82, 0x00, 0xef, 0xd0, 0x8c, 0x6e, 0x82, 
-	0x00, 0x06, 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 
-	0x08, 0x20, 0xd0, 0x40, 0x10, 0x48, 0xa0, 0x4a, 
-	0xa0, 0x5b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0xa0, 0x0a, 0x90, 0x4d, 0x0f, 0xff, 
-	0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 
-	0x80, 0x07, 0x80, 0x1b, 0x80, 0x27, 0x00, 0x60, 
-	0xd0, 0x00, 0xa0, 0x09, 0x80, 0x28, 0x01, 0x20, 
-	0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 
-	0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 
-	0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, 
-	0x80, 0x2b, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, 
-	0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, 
-	0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0xea, 0xd0, 0x00, 0xd0, 0x4e, 0x0f, 0x0b, 
-	0x70, 0x40, 0x00, 0x06, 0x00, 0x21, 0xd0, 0x88, 
-	0x00, 0xe1, 0xd0, 0x60, 0x60, 0x81, 0x00, 0x2b, 
-	0xd0, 0x80, 0x00, 0xe0, 0xd0, 0x6c, 0x60, 0x81, 
-	0xb0, 0x7c, 0x00, 0x27, 0xd0, 0xa0, 0x60, 0x81, 
-	0xb0, 0x7c, 0xd0, 0x82, 0x60, 0x81, 0xb0, 0x7c, 
-	0xd0, 0x85, 0x60, 0x81, 0xb0, 0x7c, 0x03, 0xaa, 
-	0xd0, 0x98, 0x60, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 
-	0x00, 0x27, 0xd0, 0x40, 0x6e, 0x81, 0xb0, 0x7c, 
-	0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 
-	0xd1, 0x90, 0x6e, 0x86, 0x00, 0x21, 0xd1, 0xb8, 
-	0x6e, 0x86, 0x00, 0x66, 0xd1, 0xa0, 0xd0, 0x00, 
-	0x01, 0x26, 0xd0, 0x58, 0x30, 0x01, 0x60, 0x06, 
-	0x00, 0xed, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0xec, 
-	0xd1, 0xb8, 0x6e, 0x86, 0xb1, 0x84, 0x6e, 0x86, 
-	0x00, 0xee, 0xd1, 0x84, 0x70, 0x46, 0x00, 0x65, 
-	0xd1, 0x94, 0x60, 0x46, 0x00, 0x64, 0xd1, 0xbc, 
-	0x6e, 0x86, 0x00, 0x65, 0xd1, 0x80, 0x6e, 0x86, 
-	0xb1, 0xbc, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, 
-	0x00, 0xed, 0xd1, 0xa8, 0x6e, 0x86, 0xd0, 0x0e, 
-	0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 0x00, 0x28, 
-	0xd1, 0xa4, 0x6e, 0x86, 0x00, 0x27, 0xd1, 0x98, 
-	0x6e, 0x86, 0x00, 0x64, 0xd1, 0xa4, 0x6e, 0x86, 
-	0xd2, 0x01, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 
-	0x00, 0x64, 0xd1, 0x80, 0x70, 0x46, 0x6e, 0x86, 
-	0x00, 0xef, 0xd1, 0x98, 0x70, 0x86, 0x08, 0x20, 
-	0xd0, 0xcf, 0x30, 0xc1, 0xea, 0x42, 0xd0, 0x81, 
-	0x00, 0x21, 0xd1, 0xa8, 0x60, 0x86, 0x00, 0xed, 
-	0xd1, 0xa0, 0x6e, 0xc6, 0x00, 0x65, 0xd1, 0x98, 
-	0x6e, 0xc6, 0x00, 0x22, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x00, 0xc6, 0x01, 0x73, 0xd4, 0x3d, 
-	0xe0, 0x46, 0x50, 0x00, 0x08, 0x20, 0xd0, 0x00, 
-	0x5f, 0x00, 0x00, 0x64, 0xd0, 0x60, 0x70, 0xc1, 
-	0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xb0, 0x7c, 
-	0x71, 0xc1, 0xc0, 0x87, 0x30, 0x86, 0xf9, 0x83, 
-	0x10, 0xee, 0xe9, 0x76, 0x10, 0xe1, 0xe9, 0x76, 
-	0xe2, 0x57, 0x00, 0x63, 0xd0, 0xbf, 0x72, 0x06, 
-	0xb1, 0xbc, 0x41, 0x82, 0x02, 0x1b, 0xe9, 0x8d, 
-	0x72, 0x86, 0xb1, 0xbc, 0x41, 0x82, 0xd0, 0x75, 
-	0x30, 0x48, 0xe9, 0xfe, 0xb0, 0x7f, 0xea, 0x00, 
-	0x02, 0x1c, 0xe9, 0x96, 0x15, 0xa3, 0xea, 0x57, 
-	0x10, 0xf0, 0xe9, 0x9a, 0x10, 0xfa, 0xf9, 0xa1, 
-	0x15, 0xa3, 0xea, 0x57, 0x00, 0x21, 0xd0, 0x4c, 
-	0x70, 0x41, 0x10, 0x61, 0xfa, 0x57, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, 
-	0x60, 0x40, 0x00, 0x64, 0xd0, 0x64, 0x62, 0x01, 
-	0x12, 0x2b, 0xe9, 0xeb, 0x12, 0x3b, 0xe9, 0xd5, 
-	0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 0x12, 0x2d, 
-	0xe9, 0xbf, 0x12, 0x30, 0xe9, 0xd4, 0x12, 0x36, 
-	0xe9, 0xd4, 0x12, 0x3a, 0xe9, 0xd4, 0xd0, 0x62, 
-	0x30, 0x48, 0xe9, 0xf2, 0x12, 0x2e, 0xe9, 0xf9, 
-	0xe1, 0x76, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, 
-	0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0xb0, 0x08, 
-	0x00, 0x21, 0xd0, 0x41, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0x00, 0xed, 
-	0xd0, 0x20, 0xd0, 0x41, 0x60, 0x40, 0x10, 0xe1, 
-	0xea, 0x3a, 0xe2, 0x57, 0xe2, 0x53, 0x10, 0xee, 
-	0xf9, 0xe9, 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 
-	0x97, 0x2e, 0xc7, 0x5c, 0xa7, 0x66, 0x81, 0x34, 
-	0x80, 0x3f, 0x00, 0x21, 0xd0, 0x01, 0xa0, 0x38, 
-	0x00, 0xc6, 0x00, 0x21, 0xd0, 0x15, 0x0b, 0x09, 
-	0x00, 0x4d, 0xb0, 0x01, 0xed, 0xe5, 0xd2, 0x1a, 
-	0xe1, 0xec, 0xf1, 0x18, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0xd0, 0x4e, 0x60, 0x46, 0xe2, 0x54, 
-	0xc0, 0x0a, 0x10, 0x06, 0x52, 0x80, 0x00, 0xed, 
-	0xd0, 0x40, 0x62, 0x81, 0xe2, 0x53, 0x00, 0x64, 
-	0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0xe1, 0x70, 
-	0x12, 0xa3, 0xf6, 0x57, 0x15, 0xa1, 0xfa, 0x57, 
-	0x12, 0xa0, 0xea, 0x23, 0x00, 0x65, 0xd1, 0x1c, 
-	0xd0, 0x75, 0x30, 0x48, 0xea, 0x0a, 0xb1, 0x3c, 
-	0x71, 0x04, 0x11, 0x20, 0xfa, 0x11, 0x00, 0xec, 
-	0xd0, 0x40, 0x61, 0x81, 0xe2, 0x57, 0x12, 0xa1, 
-	0xea, 0x33, 0x00, 0xe2, 0xd0, 0x60, 0x70, 0x01, 
-	0xb0, 0x7c, 0x70, 0x41, 0x10, 0x0c, 0x50, 0x40, 
-	0x0c, 0x30, 0xd0, 0x00, 0x31, 0x01, 0xee, 0x21, 
-	0x21, 0x00, 0xe6, 0x57, 0xe2, 0x23, 0x31, 0x00, 
-	0xfe, 0x57, 0xd0, 0x75, 0x30, 0x48, 0xea, 0x28, 
-	0xf2, 0x5a, 0xe2, 0x0d, 0x00, 0xec, 0xd0, 0x40, 
-	0x71, 0x81, 0x00, 0x63, 0xd1, 0x3f, 0xb1, 0xbc, 
-	0x41, 0x84, 0x61, 0x81, 0xd0, 0x50, 0x60, 0x46, 
-	0xe2, 0x57, 0x00, 0xed, 0xd0, 0x7c, 0x70, 0x41, 
-	0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xe2, 0x1c, 
-	0xd2, 0x84, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc7, 0x5e, 0x97, 0x2e, 0x81, 0x34, 
-	0x80, 0x3f, 0x02, 0xe8, 0xd0, 0x30, 0xa0, 0x37, 
-	0xa0, 0x38, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x73, 
-	0x80, 0x3f, 0x00, 0xc6, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0xf2, 0x5a, 0x00, 0x64, 0xd0, 0x60, 
-	0x62, 0x01, 0x02, 0x3c, 0xda, 0x89, 0xe0, 0x46, 
-	0x00, 0x28, 0xd0, 0x64, 0x70, 0x81, 0x00, 0x22, 
-	0xd0, 0x00, 0x50, 0x80, 0x60, 0x81, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xed, 0xd1, 0xa4, 
-	0x72, 0x86, 0x00, 0xef, 0xd1, 0x90, 0x70, 0x46, 
-	0x10, 0x5c, 0x10, 0x65, 0xed, 0x7d, 0xd0, 0x46, 
-	0xc0, 0x0a, 0x10, 0x40, 0x60, 0x46, 0x00, 0x22, 
-	0xd0, 0x73, 0x30, 0x54, 0xe9, 0x8e, 0x12, 0xa4, 
-	0xe9, 0xb5, 0x15, 0x20, 0xe9, 0xc0, 0xb0, 0x7b, 
-	0xe9, 0xc3, 0xb0, 0x41, 0xe9, 0xc9, 0xc0, 0x54, 
-	0x10, 0x5c, 0x10, 0x6e, 0xe9, 0xc6, 0xe1, 0xb5, 
-	0x00, 0x28, 0xd1, 0xb0, 0xd0, 0x00, 0x60, 0x06, 
-	0x12, 0xa4, 0xf9, 0xb2, 0x00, 0xed, 0xd1, 0x9c, 
-	0x62, 0x86, 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 
-	0x62, 0x86, 0xd0, 0x02, 0x00, 0xec, 0xd1, 0xbc, 
-	0x60, 0x06, 0x00, 0x64, 0xd1, 0xa0, 0x72, 0x06, 
-	0x12, 0x21, 0xf9, 0xa6, 0xd2, 0x0d, 0x62, 0x06, 
-	0x00, 0xed, 0xd1, 0xa0, 0x61, 0x86, 0xd0, 0x0e, 
-	0x00, 0xed, 0xd1, 0xac, 0x60, 0x06, 0xb1, 0xbc, 
-	0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 
-	0x01, 0x7e, 0xd2, 0x31, 0xe1, 0xcb, 0x01, 0x46, 
-	0x90, 0x49, 0x00, 0x60, 0xd0, 0x00, 0x50, 0x40, 
-	0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 0x0c, 0x09, 
-	0x05, 0x0d, 0xe1, 0x70, 0x01, 0xbe, 0xde, 0x41, 
-	0xe1, 0xcb, 0x01, 0xbb, 0xd8, 0x10, 0xe1, 0xcb, 
-	0x01, 0xbd, 0xd8, 0x0b, 0xe1, 0xcb, 0x03, 0xb8, 
-	0xda, 0x10, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, 
-	0xd1, 0x00, 0x50, 0x44, 0x30, 0x44, 0xa0, 0x49, 
-	0x80, 0x3f, 0x00, 0xc6, 0xe0, 0x46, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x01, 0xfa, 0xd2, 0x3d, 
-	0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0x26, 
-	0xd0, 0x18, 0xd0, 0x40, 0x60, 0x40, 0x00, 0x28, 
-	0xd0, 0x24, 0x70, 0x40, 0xd0, 0x82, 0x50, 0x42, 
-	0x60, 0x40, 0x00, 0xec, 0xd0, 0xa4, 0x70, 0xc2, 
-	0x10, 0xe0, 0xf9, 0x81, 0x00, 0xec, 0xd1, 0x98, 
-	0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 
-	0xe9, 0x8e, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x81, 
-	0xd0, 0x40, 0x00, 0xe6, 0xd0, 0x10, 0x60, 0x40, 
-	0xb0, 0x3c, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, 
-	0xd0, 0xe0, 0x00, 0xea, 0xd0, 0x40, 0x00, 0xe8, 
-	0xd0, 0x82, 0x01, 0x46, 0x70, 0x01, 0xb0, 0x7c, 
-	0x60, 0x02, 0xb0, 0xbc, 0x00, 0x06, 0x00, 0xc6, 
-	0xb0, 0xc1, 0xed, 0x9b, 0x80, 0x49, 0xd6, 0x44, 
-	0xd5, 0x43, 0x00, 0xe0, 0xd1, 0x80, 0x00, 0x06, 
-	0x0b, 0x09, 0x01, 0x0d, 0x0b, 0x09, 0x61, 0x06, 
-	0xb1, 0xbc, 0x01, 0x4d, 0x09, 0x09, 0x61, 0x46, 
-	0xb1, 0xbc, 0x00, 0xcd, 0x09, 0x09, 0x10, 0xe4, 
-	0xed, 0xb8, 0x60, 0xc6, 0xb1, 0xbc, 0x00, 0xcd, 
-	0x60, 0xc6, 0x00, 0xed, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x20, 0xf9, 0xd3, 0x10, 0xe3, 0xe9, 0xc4, 
-	0x10, 0xe6, 0xf9, 0xd3, 0x01, 0x46, 0x90, 0x10, 
-	0x00, 0x20, 0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6, 
-	0xa0, 0x50, 0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05, 
-	0x80, 0x40, 0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04, 
-	0x60, 0x06, 0x00, 0xee, 0xd1, 0xac, 0x73, 0x86, 
-	0x10, 0xe3, 0xe5, 0xde, 0xe9, 0xe3, 0x00, 0xe7, 
-	0xd0, 0x40, 0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xe7, 
-	0x01, 0x24, 0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6, 
-	0xe1, 0xe7, 0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8, 
-	0xd0, 0x90, 0x13, 0xa0, 0xf9, 0xea, 0xc0, 0x42, 
-	0x00, 0xe0, 0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x09, 0x09, 0x10, 0x44, 
-	0x00, 0x8d, 0x20, 0x42, 0x10, 0x5f, 0x60, 0x46, 
-	0xb1, 0xb8, 0x00, 0x90, 0xea, 0x17, 0x0a, 0x89, 
-	0x00, 0x8d, 0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x0b, 
-	0x00, 0xe8, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 
-	0xfa, 0x17, 0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4, 
-	0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x1b, 
-	0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 
-	0xea, 0x1b, 0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40, 
-	0x60, 0x46, 0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8, 
-	0x70, 0x46, 0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86, 
-	0xb0, 0xb0, 0xee, 0x25, 0xd0, 0x81, 0x00, 0x90, 
-	0xea, 0x28, 0x20, 0x01, 0x10, 0x41, 0x10, 0x9f, 
-	0x10, 0xa0, 0xee, 0x25, 0x10, 0x1c, 0x00, 0x65, 
-	0xd1, 0xa8, 0x60, 0x06, 0x01, 0xb4, 0xd4, 0x3a, 
-	0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x0c, 0x09, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xe9, 0xea, 0xb0, 0x7d, 0xfa, 0x05, 
-	0x09, 0x09, 0x01, 0xcd, 0x11, 0xe1, 0xf9, 0xc7, 
-	0x80, 0x09, 0x80, 0x27, 0x0a, 0x09, 0xd6, 0x45, 
-	0x00, 0xe1, 0xd1, 0xa0, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 
-	0x00, 0x50, 0xe9, 0x91, 0xd4, 0x01, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x00, 0xe0, 
-	0xd1, 0x80, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x89, 
-	0x10, 0x4c, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, 
-	0xb1, 0xbc, 0x00, 0x4d, 0x0b, 0x49, 0x10, 0x4c, 
-	0x71, 0x46, 0x21, 0x41, 0x61, 0x46, 0xb1, 0xb0, 
-	0x00, 0x4d, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0a, 0x09, 0x00, 0x4d, 0x10, 0x4a, 0x70, 0x86, 
-	0x20, 0x81, 0x60, 0x86, 0x00, 0xe1, 0xd1, 0xac, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x09, 0x49, 0x00, 0x8d, 0x60, 0x86, 0xc0, 0x02, 
-	0x00, 0xe0, 0xd1, 0xa8, 0x70, 0xc6, 0x10, 0xc0, 
-	0xd0, 0x20, 0x30, 0x01, 0x10, 0xc0, 0x60, 0xc6, 
-	0xe1, 0x75, 0x11, 0xe2, 0xf9, 0x75, 0x00, 0xe2, 
-	0xd1, 0x80, 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 
-	0xb1, 0xbc, 0x10, 0x60, 0xf9, 0xd7, 0xb1, 0xb4, 
-	0xe1, 0xde, 0xd2, 0x03, 0x0a, 0x09, 0x00, 0x4d, 
-	0x60, 0x46, 0xb1, 0xbc, 0xb2, 0x01, 0xf9, 0xd8, 
-	0x0b, 0xc9, 0x00, 0x4d, 0x10, 0x49, 0x10, 0x56, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x89, 0x00, 0x4d, 
-	0x10, 0x4a, 0x10, 0x56, 0x60, 0x46, 0xe1, 0x75, 
-	0x0b, 0x2c, 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0x77, 
-	0x00, 0xe0, 0xd0, 0x6c, 0x00, 0xe0, 0xd1, 0x80, 
-	0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd1, 0xb0, 
-	0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xe0, 0xd1, 0x80, 
-	0x76, 0x86, 0xb1, 0xbc, 0x73, 0x46, 0xe2, 0x3c, 
-	0x70, 0x81, 0x60, 0x86, 0xb1, 0xbc, 0xb0, 0x7c, 
-	0xb0, 0x01, 0xed, 0xfe, 0x0f, 0xc5, 0x00, 0xe1, 
-	0xd1, 0xa0, 0x70, 0x46, 0xd0, 0x8f, 0x40, 0x42, 
-	0x00, 0x25, 0xd0, 0xe0, 0x00, 0x24, 0xd1, 0x20, 
-	0x10, 0x6a, 0xea, 0x1e, 0x00, 0x66, 0xd0, 0xe0, 
-	0x00, 0x62, 0xd1, 0x00, 0x10, 0x66, 0xea, 0x1e, 
-	0x00, 0x6e, 0xd0, 0xc0, 0x10, 0x64, 0xea, 0x1e, 
-	0x00, 0x2b, 0xd0, 0xd0, 0x00, 0x29, 0xd1, 0x00, 
-	0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0x16, 0xa0, 
-	0xe9, 0xee, 0x30, 0xda, 0xe5, 0xee, 0xb1, 0xbc, 
-	0x73, 0x46, 0x13, 0x60, 0xe9, 0xee, 0x31, 0x0d, 
-	0xe5, 0xee, 0xd0, 0x82, 0xb1, 0xbc, 0x70, 0x46, 
-	0x10, 0x60, 0xe9, 0xee, 0xb0, 0x81, 0xee, 0x2c, 
-	0x00, 0xe0, 0xd0, 0x40, 0x00, 0xe0, 0xd1, 0xac, 
-	0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd0, 0x70, 
-	0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xec, 0xd1, 0x98, 
-	0xd0, 0x40, 0x60, 0x46, 0x00, 0xe0, 0xd0, 0x8c, 
-	0x70, 0x82, 0x00, 0x21, 0xd0, 0x70, 0x60, 0x81, 
-	0xd0, 0x40, 0x00, 0x25, 0xd0, 0x20, 0x30, 0x1a, 
-	0xfa, 0x50, 0x00, 0x23, 0xd0, 0x30, 0x30, 0x0d, 
-	0xfa, 0x50, 0xd0, 0x41, 0x00, 0x21, 0xd1, 0x84, 
-	0x60, 0x46, 0xb6, 0xb1, 0x16, 0x9c, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0xec, 
-	0xd0, 0xa8, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x77, 
-	0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x41, 0x60, 0x46, 
-	0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x84, 0xd0, 0x40, 
-	0x60, 0x46, 0xe1, 0x77, 0x0b, 0x49, 0x00, 0xe2, 
-	0xd1, 0xa0, 0x00, 0x4d, 0x10, 0x5f, 0x00, 0x6f, 
-	0xd0, 0xff, 0x40, 0x43, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0b, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x61, 
-	0xf9, 0x9b, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, 
-	0x63, 0xc6, 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 
-	0xe5, 0x9c, 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 
-	0xd0, 0x72, 0x30, 0x54, 0xf9, 0xa9, 0x0b, 0xa0, 
-	0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xa0, 0x00, 0xec, 
-	0xd1, 0x9c, 0xd0, 0x40, 0x60, 0x46, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x0b, 0x09, 0x00, 0x4d, 
-	0x0b, 0x09, 0x00, 0x4d, 0x0a, 0x09, 0x01, 0x4d, 
-	0x0a, 0x09, 0x00, 0x4d, 0x01, 0x59, 0xe9, 0x96, 
-	0x09, 0x09, 0x00, 0x4d, 0x10, 0x5f, 0x10, 0x61, 
-	0xf9, 0x96, 0x09, 0x09, 0x01, 0x4d, 0x11, 0x5f, 
-	0x0b, 0xc9, 0x00, 0x4d, 0xc0, 0x01, 0x10, 0x5f, 
-	0x11, 0x4e, 0x51, 0x41, 0x08, 0x49, 0x00, 0x4d, 
-	0x0b, 0xc9, 0x10, 0x0f, 0x00, 0x4d, 0x50, 0x01, 
-	0x00, 0xed, 0xd1, 0xb6, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x3c, 0xa1, 0x7d, 0x60, 0x06, 0x00, 0xc6, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x00, 0xec, 0xd0, 0xac, 
-	0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x70, 0x00, 0xec, 
-	0xd1, 0xa0, 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 
-	0x10, 0xe0, 0xe9, 0x7f, 0xd0, 0x40, 0x60, 0x46, 
-	0xe1, 0x70, 0x0a, 0x89, 0x0b, 0xcd, 0x00, 0xe3, 
-	0xd1, 0x80, 0x6b, 0xc6, 0x08, 0xc9, 0x05, 0x8d, 
-	0x15, 0xa3, 0xee, 0x6e, 0x15, 0xa0, 0xea, 0x6e, 
-	0x90, 0x4d, 0xd0, 0x9f, 0xd0, 0xdf, 0x40, 0x81, 
-	0x10, 0x55, 0x40, 0xc1, 0x01, 0x46, 0x82, 0x34, 
-	0x80, 0x3f, 0xc8, 0x1d, 0x81, 0x34, 0x80, 0x3f, 
-	0x00, 0xc6, 0xd1, 0x23, 0x31, 0x03, 0x11, 0x02, 
-	0x38, 0x04, 0xb0, 0x8d, 0x10, 0x9d, 0x28, 0x02, 
-	0xc0, 0x60, 0x00, 0x65, 0xd1, 0x94, 0x71, 0x06, 
-	0x68, 0x06, 0x30, 0x44, 0x00, 0xed, 0xd1, 0xa8, 
-	0x70, 0x06, 0x10, 0x20, 0xe9, 0xb0, 0x00, 0xee, 
-	0xd0, 0xc0, 0x70, 0xc3, 0x20, 0x43, 0xb0, 0x01, 
-	0xf9, 0xac, 0x60, 0x06, 0x00, 0x64, 0xd1, 0xbc, 
-	0x71, 0x06, 0xc0, 0x04, 0x21, 0x01, 0x61, 0x06, 
-	0x10, 0x20, 0xf5, 0xbb, 0x11, 0x20, 0xe5, 0xbb, 
-	0xb0, 0x41, 0x00, 0x65, 0xd1, 0x80, 0x71, 0x06, 
-	0x21, 0x01, 0x61, 0x06, 0x00, 0xed, 0xd1, 0xac, 
-	0x71, 0x06, 0x15, 0xa1, 0xe9, 0xcb, 0xb1, 0x3f, 
-	0x61, 0x06, 0x15, 0xa3, 0xf9, 0xd6, 0xd0, 0xbf, 
-	0xe1, 0xd3, 0xd0, 0x40, 0x60, 0x46, 0xb1, 0xbc, 
-	0x70, 0x86, 0x61, 0x06, 0x31, 0x02, 0xe5, 0xd3, 
-	0x20, 0x84, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x86, 
-	0xd9, 0x40, 0x00, 0xec, 0xd1, 0x94, 0x79, 0x06, 
-	0xb1, 0x84, 0x78, 0xc6, 0xc0, 0x63, 0x30, 0x64, 
-	0xe9, 0xf8, 0x00, 0xa7, 0xd0, 0xff, 0x7a, 0x63, 
-	0x00, 0x65, 0xd0, 0x00, 0x71, 0x00, 0x31, 0x29, 
-	0xe5, 0xf8, 0xc0, 0x63, 0xc8, 0xc1, 0xb0, 0x78, 
-	0x40, 0x43, 0xc0, 0xa4, 0x30, 0x81, 0xe9, 0xf2, 
-	0x7a, 0x41, 0x31, 0x29, 0xf5, 0xe8, 0x21, 0x29, 
-	0x61, 0x00, 0xb8, 0xfc, 0x79, 0x63, 0xb8, 0xfc, 
-	0x48, 0xc3, 0x68, 0xc6, 0x00, 0xed, 0xd1, 0xb8, 
-	0x69, 0x46, 0x80, 0x28, 0x0b, 0xc9, 0x00, 0x4d, 
-	0x08, 0x49, 0x10, 0x41, 0x00, 0xe3, 0xd1, 0x84, 
-	0x00, 0x8d, 0x20, 0x42, 0x60, 0x46, 0x00, 0xee, 
-	0xd1, 0xa4, 0x70, 0x86, 0x10, 0xa1, 0xee, 0x18, 
-	0xe6, 0x6b, 0x90, 0x86, 0x00, 0x90, 0xea, 0x18, 
-	0x00, 0xed, 0xd0, 0x1c, 0x70, 0x80, 0xb0, 0x81, 
-	0xe6, 0x6b, 0x60, 0x80, 0xb1, 0xa8, 0x70, 0x86, 
-	0x10, 0xa0, 0xfa, 0x6b, 0x00, 0x21, 0xd0, 0x38, 
-	0x70, 0x80, 0x10, 0xa0, 0xfa, 0x6b, 0x0f, 0xef, 
-	0xd0, 0xbf, 0x30, 0x81, 0xfa, 0x22, 0x60, 0x00, 
-	0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x15, 0xa3, 
-	0xea, 0x6b, 0x00, 0xee, 0xd1, 0x80, 0x79, 0x46, 
-	0x00, 0xf8, 0xd0, 0x00, 0xc4, 0x40, 0x00, 0xe3, 
-	0xd1, 0x84, 0x78, 0x46, 0x0f, 0xef, 0xd0, 0x3f, 
-	0x30, 0x21, 0xea, 0x48, 0x00, 0xe0, 0xd1, 0x90, 
-	0x78, 0x06, 0xc0, 0xa1, 0x18, 0x43, 0x28, 0x42, 
-	0x18, 0x43, 0x28, 0x42, 0x18, 0x1e, 0xd8, 0x80, 
-	0x08, 0x11, 0xea, 0x41, 0x28, 0xa1, 0x18, 0x01, 
-	0x18, 0x5f, 0x18, 0x60, 0xee, 0x3e, 0xc0, 0x51, 
-	0x30, 0x62, 0xee, 0x4e, 0xc8, 0x91, 0x18, 0x9f, 
-	0x00, 0x21, 0xd1, 0xb8, 0xd0, 0x01, 0x60, 0x06, 
-	0x00, 0xef, 0xd0, 0x10, 0xd0, 0x72, 0x60, 0x40, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0xdc, 
-	0xc9, 0x1d, 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 
-	0x38, 0xe4, 0xee, 0x5e, 0xea, 0x52, 0x28, 0xe5, 
-	0x01, 0x46, 0x90, 0x6d, 0x28, 0xc1, 0x00, 0xc6, 
-	0x38, 0xe2, 0xf6, 0x6b, 0xdb, 0x08, 0xf1, 0x16, 
-	0xf1, 0x18, 0x00, 0x21, 0xd1, 0xb4, 0x61, 0x86, 
-	0xe2, 0x52, 0x01, 0xf7, 0xd0, 0x19, 0xe0, 0x46, 
-	0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0xdb, 0x09, 
-	0x00, 0xe3, 0xd0, 0x1c, 0x6b, 0x00, 0xda, 0xc1, 
-	0x00, 0xe6, 0xd1, 0x98, 0x70, 0x06, 0xb1, 0x84, 
-	0x60, 0x06, 0xb1, 0x84, 0x60, 0x06, 0x05, 0x9f, 
-	0xe9, 0x9f, 0x08, 0x49, 0xd1, 0x17, 0x46, 0x44, 
-	0x00, 0x4d, 0x10, 0x43, 0x26, 0x41, 0x08, 0xc9, 
-	0x05, 0xcd, 0xb5, 0xc1, 0xe5, 0xcc, 0xc0, 0x57, 
-	0x15, 0xc6, 0x25, 0xc1, 0x15, 0xa3, 0xf9, 0x9f, 
-	0x08, 0x49, 0xd1, 0x0f, 0x46, 0x44, 0x00, 0x4d, 
-	0x10, 0x44, 0x26, 0x41, 0x08, 0xc9, 0x06, 0x0d, 
-	0xb6, 0x01, 0xe5, 0xcc, 0xc0, 0x58, 0x16, 0x06, 
-	0x26, 0x01, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x60, 
-	0xe9, 0xa6, 0x0a, 0x09, 0x00, 0x4d, 0xe1, 0x9f, 
-	0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xa7, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xf9, 0xb3, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe1, 0xab, 0xb0, 0x7d, 0xf9, 0xb8, 0x02, 0x34, 
-	0xd2, 0x44, 0xe0, 0x46, 0x00, 0xec, 0xd1, 0xa0, 
-	0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 
-	0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 
-	0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 
-	0xe9, 0xc9, 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 
-	0xd4, 0x3d, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, 
-	0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0xcc, 0xc0, 0xcd, 0x01, 
-	0xcd, 0x42, 0xcd, 0x83, 0x00, 0xa0, 0xd0, 0x01, 
-	0xa0, 0x38, 0xc8, 0x7f, 0xc8, 0x06, 0xb1, 0xbe, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x58, 0x80, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x92, 0x59, 0x40, 0xc0, 0x22, 0xc0, 0x65, 
-	0xc0, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, 
-	0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x59, 0x40, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x58, 0x80, 
-	0xc0, 0x23, 0xc0, 0x62, 0xd0, 0x88, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 
-	0x58, 0xc0, 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 
-	0x59, 0xc0, 0xc0, 0x24, 0xc0, 0x67, 0xd0, 0x90, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xc9, 0xc0, 
-	0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x59, 0xc0, 
-	0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x59, 0x00, 
-	0xc0, 0x25, 0xc0, 0x64, 0xd0, 0x98, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 
-	0x58, 0x80, 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 
-	0x59, 0x00, 0xc0, 0x23, 0xc0, 0x64, 0xd0, 0x84, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 
-	0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x5a, 0x40, 0xc0, 0x26, 0xc0, 0x69, 
-	0xd0, 0xa0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 
-	0xc9, 0x80, 0xf3, 0x92, 0x5a, 0x00, 0xf3, 0x96, 
-	0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 
-	0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x27, 
-	0xc0, 0x66, 0xd0, 0xa8, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x59, 0x00, 
-	0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, 
-	0xc0, 0x22, 0xc0, 0x63, 0xd0, 0x8c, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x25, 
-	0xc0, 0x66, 0xd0, 0x94, 0x20, 0x86, 0xf3, 0x9a, 
-	0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 
-	0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x5a, 0x80, 
-	0xc0, 0x28, 0xc0, 0x6a, 0xd0, 0xb0, 0x20, 0x86, 
-	0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 
-	0x59, 0x40, 0xc0, 0x29, 0xc0, 0x65, 0xd0, 0xb8, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 
-	0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xca, 0x00, 
-	0xf3, 0x92, 0x58, 0x80, 0xc0, 0x24, 0xc0, 0x62, 
-	0xd0, 0x9c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x5a, 0x00, 0xc0, 0x27, 0xc0, 0x68, 0xd0, 0xa4, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xca, 0x80, 
-	0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xca, 0x40, 
-	0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 0xc9, 0x40, 
-	0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x23, 0xc0, 0x6a, 
-	0xd0, 0xac, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, 
-	0x59, 0x40, 0xc0, 0x26, 0xc0, 0x65, 0xd0, 0xb4, 
-	0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, 
-	0xf3, 0x92, 0x59, 0x00, 0xc0, 0x29, 0xc0, 0x64, 
-	0xd0, 0xbc, 0x20, 0x86, 0xf3, 0x9a, 0xc0, 0x33, 
-	0xc0, 0x74, 0xc0, 0xb5, 0xc0, 0xf6, 0xd0, 0x40, 
-	0x00, 0xa0, 0xd8, 0x00, 0xa8, 0x38, 0x08, 0x45, 
-	0x0a, 0x09, 0x00, 0x0d, 0x0f, 0xc5, 0x50, 0x00, 
-	0x0a, 0x09, 0x00, 0x0d, 0x10, 0x08, 0x0f, 0xc5, 
-	0x01, 0x46, 0x00, 0x06, 0xa0, 0x7c, 0xa0, 0x3d, 
-	0x60, 0x42, 0x00, 0xc6, 0x0f, 0xc5, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x14, 0x48, 0xd0, 0x81, 
-	0x00, 0xef, 0xd1, 0x8c, 0x71, 0x46, 0x11, 0x60, 
-	0xfb, 0xb1, 0x60, 0x86, 0x71, 0x46, 0x31, 0x42, 
-	0xfb, 0xb1, 0x00, 0xec, 0xd1, 0x0c, 0x74, 0x84, 
-	0x00, 0x68, 0xd0, 0x80, 0x70, 0x02, 0x10, 0x20, 
-	0xfb, 0xc4, 0xc4, 0x82, 0xc4, 0xd2, 0xb4, 0xfc, 
-	0xda, 0x00, 0xda, 0x4f, 0x0a, 0x09, 0x0f, 0xef, 
-	0xd0, 0x3f, 0xb4, 0x7f, 0xca, 0x29, 0x1a, 0x18, 
-	0x4a, 0x00, 0x1a, 0x48, 0x00, 0x8d, 0x2a, 0x42, 
-	0xd0, 0x03, 0x40, 0x11, 0xfb, 0xe3, 0xb4, 0x44, 
-	0x00, 0xa0, 0xd0, 0xc0, 0x30, 0xd3, 0xff, 0xe3, 
-	0xb4, 0xfe, 0x01, 0x46, 0x00, 0x06, 0xaa, 0x3d, 
-	0xaa, 0x7c, 0x6a, 0x53, 0x00, 0xc6, 0xb4, 0xfe, 
-	0xb4, 0x7c, 0x1a, 0x61, 0xfb, 0xc8, 0xb4, 0x43, 
-	0x00, 0xef, 0xd0, 0x3f, 0x40, 0x11, 0xeb, 0xf7, 
-	0xb0, 0xc4, 0xe7, 0xf7, 0xeb, 0xee, 0x61, 0x53, 
-	0x64, 0x52, 0x64, 0xc4, 0x00, 0x28, 0xd1, 0x24, 
-	0x70, 0x04, 0x00, 0x21, 0xd0, 0x80, 0x50, 0x02, 
-	0x60, 0x04, 0x61, 0x46, 0x0a, 0x09, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13, 
-	0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x01, 0xfa, 
-	0xd2, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 
-	0x09, 0x09, 0x01, 0xcd, 0x11, 0xe8, 0xf9, 0xe2, 
-	0x00, 0xe3, 0xd1, 0x9c, 0x09, 0x09, 0x05, 0xcd, 
-	0xb5, 0xc1, 0x09, 0x09, 0x00, 0x4d, 0xb0, 0x41, 
-	0x10, 0x46, 0x25, 0xc1, 0x09, 0x09, 0x06, 0x0d, 
-	0xb6, 0x01, 0x09, 0x09, 0x00, 0x4d, 0x08, 0x89, 
-	0xb0, 0x41, 0x10, 0x46, 0x26, 0x01, 0x00, 0x8d, 
-	0x08, 0x89, 0x10, 0x82, 0xd0, 0x04, 0xc0, 0x55, 
-	0x00, 0x40, 0x40, 0x40, 0x05, 0x4d, 0x08, 0x49, 
-	0x0b, 0x0d, 0xd1, 0x00, 0x15, 0x63, 0xe9, 0xa2, 
-	0xd1, 0x01, 0x55, 0x41, 0xdb, 0x01, 0x4b, 0x15, 
-	0xa1, 0x1b, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x49, 
-	0x10, 0x41, 0xd1, 0x19, 0x46, 0x44, 0x26, 0x41, 
-	0x00, 0xcd, 0x08, 0x49, 0x10, 0xc4, 0x00, 0x4d, 
-	0x08, 0x49, 0x10, 0x41, 0x20, 0x81, 0xa0, 0x89, 
-	0x00, 0x4d, 0x10, 0x43, 0x20, 0xc1, 0xa0, 0xe8, 
-	0x08, 0x49, 0x00, 0x4d, 0x1b, 0x03, 0x5b, 0x01, 
-	0xbb, 0x3f, 0x6b, 0x06, 0x08, 0x49, 0xb1, 0xbc, 
-	0x00, 0x4d, 0x60, 0x46, 0x08, 0x49, 0xb1, 0xbc, 
-	0x0a, 0xcd, 0x1a, 0xc2, 0x4a, 0xd9, 0x1a, 0xde, 
-	0x6a, 0xc6, 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 
-	0x60, 0x46, 0x10, 0x60, 0xea, 0x3e, 0xb1, 0xbc, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x09, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 
-	0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xe2, 0x3e, 
-	0x11, 0xe3, 0xfa, 0x00, 0x00, 0xe7, 0xd0, 0xc0, 
-	0xd0, 0x84, 0xb0, 0x81, 0xe6, 0x3e, 0x08, 0x49, 
-	0x00, 0x4d, 0x60, 0x43, 0xb0, 0xfc, 0x10, 0x60, 
-	0xe9, 0xe7, 0x10, 0xa3, 0xf9, 0xf4, 0x00, 0xe8, 
-	0xd1, 0x80, 0xe1, 0xf8, 0x10, 0xa2, 0xf9, 0xfa, 
-	0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0xe1, 0xe7, 
-	0xd2, 0x3f, 0x0a, 0x09, 0x00, 0x4d, 0xb2, 0x01, 
-	0xf5, 0xfb, 0xe1, 0xe7, 0x11, 0xe7, 0xfa, 0x3e, 
-	0xd4, 0x01, 0x00, 0xe1, 0xd0, 0x24, 0x70, 0x00, 
-	0x10, 0x21, 0xea, 0x0d, 0x15, 0x63, 0xfa, 0x0d, 
-	0xd4, 0x03, 0x44, 0x2c, 0xb4, 0x3f, 0x00, 0xe6, 
-	0xd1, 0x90, 0x0b, 0x09, 0x00, 0x4d, 0x09, 0x49, 
-	0x10, 0x45, 0x00, 0x8d, 0x50, 0x81, 0xd0, 0x40, 
-	0x10, 0x87, 0x10, 0x98, 0x30, 0x42, 0xf2, 0x61, 
-	0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x0d, 
-	0x09, 0x49, 0x00, 0x0d, 0xb4, 0x01, 0xfa, 0x0f, 
-	0x00, 0xe6, 0xd0, 0x18, 0x30, 0x06, 0xe6, 0x29, 
-	0x60, 0x46, 0xb1, 0xbc, 0xe2, 0x22, 0x00, 0xe0, 
-	0xd1, 0x88, 0x70, 0x46, 0x10, 0x63, 0xea, 0x39, 
-	0x10, 0x64, 0xea, 0x39, 0x00, 0xe6, 0xd1, 0x90, 
-	0xd0, 0x00, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 
-	0xb1, 0xbc, 0x60, 0x06, 0xe2, 0x3e, 0x00, 0xef, 
-	0xd1, 0x84, 0x70, 0x46, 0x10, 0x60, 0xfa, 0x30, 
-	0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe6, 0x3f, 
-	0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 
-	0x30, 0x54, 0xfa, 0x4b, 0xd4, 0x40, 0xf3, 0xb0, 
-	0xe2, 0x43, 0xb0, 0x7d, 0xe9, 0x7a, 0x00, 0xec, 
-	0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 
-	0xda, 0x89, 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 
-	0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 
-	0x15, 0x63, 0xea, 0x5e, 0x05, 0x5e, 0xe8, 0x46, 
-	0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x00, 0xe0, 
-	0xd0, 0x00, 0x70, 0xc0, 0x10, 0xc1, 0x00, 0xe0, 
-	0xd0, 0x08, 0x70, 0x00, 0x10, 0x23, 0xea, 0x75, 
-	0xc0, 0x83, 0x10, 0x9d, 0x30, 0xc2, 0x10, 0x9f, 
-	0x30, 0xc2, 0x00, 0xef, 0xd0, 0xac, 0x70, 0x82, 
-	0x10, 0xa3, 0xea, 0x75, 0x10, 0xc1, 0xc0, 0x83, 
-	0x30, 0x81, 0xe6, 0x7e, 0xc0, 0x83, 0x20, 0x81, 
-	0xf6, 0x7f, 0xd0, 0x40, 0x30, 0x43, 0x0f, 0xc5, 
-	0xc0, 0x43, 0x0f, 0xc5, 0x00, 0xed, 0xd1, 0xa4, 
-	0x72, 0x86, 0x15, 0xa3, 0xee, 0x23, 0x15, 0xa1, 
-	0xe6, 0x23, 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 
-	0xd8, 0xc4, 0x15, 0x63, 0xe9, 0x7e, 0x48, 0xd5, 
-	0x18, 0xde, 0x18, 0xe0, 0xe9, 0xc2, 0x00, 0xed, 
-	0xd1, 0xb4, 0x79, 0xc6, 0x19, 0xe0, 0xe9, 0x8c, 
-	0x00, 0xed, 0xd0, 0x3a, 0x79, 0xc6, 0x69, 0xc0, 
-	0xd9, 0xc0, 0x69, 0xc6, 0x00, 0xed, 0xd0, 0x38, 
-	0x79, 0x40, 0x19, 0x60, 0xe9, 0x98, 0x00, 0x28, 
-	0xd0, 0x24, 0x70, 0x40, 0x02, 0x20, 0xd0, 0x80, 
-	0x50, 0x42, 0x60, 0x40, 0x15, 0xa3, 0xe9, 0x9f, 
-	0x00, 0xec, 0xd1, 0xb8, 0x79, 0xc6, 0x69, 0x46, 
-	0xc9, 0x67, 0x00, 0xec, 0xd9, 0xb4, 0x70, 0x66, 
-	0x00, 0xec, 0xd1, 0xbc, 0x70, 0x06, 0x10, 0x20, 
-	0xed, 0xbe, 0x10, 0x60, 0xe9, 0xc1, 0x00, 0xe0, 
-	0xda, 0xa8, 0x7a, 0xaa, 0xc0, 0x2a, 0x10, 0x1f, 
-	0x00, 0x22, 0xd0, 0xa0, 0x70, 0x82, 0x20, 0x6a, 
-	0x00, 0x9f, 0xe9, 0xb5, 0x20, 0x40, 0x19, 0x60, 
-	0xf9, 0xb8, 0xc9, 0x41, 0xb0, 0x48, 0x30, 0x65, 
-	0xf5, 0xbd, 0xb0, 0x70, 0xed, 0xbe, 0xd9, 0x40, 
-	0x00, 0xed, 0xd1, 0xbc, 0x69, 0x46, 0x69, 0x66, 
-	0x12, 0xa4, 0xea, 0x21, 0x00, 0xec, 0xd1, 0xbc, 
-	0x73, 0xc6, 0x15, 0xa3, 0xe9, 0xdf, 0x33, 0xe3, 
-	0xe5, 0xd3, 0xed, 0xd2, 0x63, 0xc6, 0x00, 0x21, 
-	0xd1, 0xa8, 0x63, 0xc6, 0x00, 0xed, 0xd1, 0xa0, 
-	0x63, 0xc6, 0x15, 0xa1, 0xf9, 0xdc, 0x12, 0xa3, 
-	0xe5, 0xe3, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, 
-	0x63, 0xc6, 0xe1, 0xe3, 0x12, 0xa3, 0xea, 0x21, 
-	0xe1, 0xe3, 0x12, 0xa2, 0xf6, 0x21, 0x13, 0xe0, 
-	0xfa, 0x21, 0x00, 0xee, 0xd1, 0x8c, 0x78, 0x06, 
-	0xb1, 0xbc, 0x78, 0x46, 0xb1, 0xbc, 0x78, 0x86, 
-	0xd1, 0x88, 0x72, 0x46, 0xd1, 0x84, 0x73, 0x06, 
-	0x13, 0x20, 0xf9, 0xe3, 0x00, 0x64, 0xd1, 0xa0, 
-	0x70, 0x46, 0xd0, 0xa2, 0x30, 0x81, 0xe9, 0xff, 
-	0x10, 0x70, 0xea, 0x11, 0x10, 0x6d, 0xea, 0x14, 
-	0x10, 0x76, 0xea, 0x19, 0x10, 0x7a, 0xea, 0x28, 
-	0xe2, 0x3b, 0x18, 0xe0, 0xea, 0x3b, 0x00, 0xed, 
-	0xd1, 0x80, 0x70, 0x86, 0xb0, 0x81, 0xd0, 0x3f, 
-	0x40, 0x02, 0x10, 0x20, 0xea, 0x0c, 0x60, 0x86, 
-	0xf3, 0x8a, 0xe1, 0xe3, 0xc0, 0x02, 0x10, 0x1a, 
-	0x50, 0x80, 0x60, 0x86, 0xe2, 0x3b, 0x15, 0xa3, 
-	0xea, 0x21, 0xe2, 0xe9, 0xd2, 0x80, 0x00, 0xed, 
-	0xd1, 0xa4, 0x62, 0x86, 0xe3, 0x0c, 0x00, 0xed, 
-	0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 
-	0x60, 0x46, 0x15, 0xa3, 0xfb, 0x0c, 0xd5, 0x84, 
-	0xe3, 0x0c, 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 
-	0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 
-	0x15, 0xa2, 0xe7, 0x0c, 0xee, 0x21, 0x00, 0x21, 
-	0xd1, 0x8c, 0x18, 0xe0, 0xfa, 0x39, 0x70, 0x46, 
-	0x10, 0x61, 0xea, 0x70, 0xe2, 0x21, 0x65, 0x86, 
-	0xe2, 0x21, 0x18, 0xe0, 0xea, 0x70, 0xd1, 0x80, 
-	0x73, 0x06, 0x15, 0xa2, 0xee, 0x68, 0x00, 0x22, 
-	0xd1, 0x80, 0x70, 0x46, 0x6b, 0x06, 0xcb, 0x01, 
-	0xb1, 0xb4, 0x70, 0x46, 0x6a, 0xc6, 0xca, 0xc1, 
-	0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 0x10, 0x61, 
-	0xfa, 0x50, 0x02, 0x41, 0xc3, 0x21, 0xc7, 0xe0, 
-	0x02, 0x50, 0xea, 0x56, 0xc3, 0x20, 0xc7, 0xe1, 
-	0xd1, 0x88, 0xd0, 0x01, 0x02, 0x40, 0x62, 0x46, 
-	0x0f, 0xef, 0xd0, 0x7f, 0x30, 0x6f, 0xfa, 0x5f, 
-	0xc3, 0x20, 0xc7, 0x4c, 0xd0, 0x00, 0x00, 0x65, 
-	0xd1, 0x98, 0x70, 0x46, 0x60, 0x06, 0xb0, 0x41, 
-	0x43, 0x01, 0xe2, 0x70, 0xc3, 0x22, 0xc7, 0xcc, 
-	0xc7, 0x60, 0xc7, 0xa1, 0x02, 0x50, 0xea, 0x70, 
-	0xc7, 0x61, 0xc7, 0xa0, 0xdb, 0x80, 0xd1, 0x00, 
-	0x00, 0xef, 0xd1, 0xa8, 0x70, 0x46, 0x10, 0x60, 
-	0xfa, 0x7a, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, 
-	0x00, 0x22, 0xd1, 0xb0, 0x70, 0x86, 0x30, 0x81, 
-	0xea, 0x82, 0x60, 0x46, 0xd0, 0x20, 0xf3, 0x06, 
-	0x10, 0x63, 0xea, 0x87, 0x10, 0x64, 0xea, 0x87, 
-	0xe2, 0x95, 0x00, 0xef, 0xd1, 0x6c, 0x71, 0x45, 
-	0xc0, 0x05, 0x30, 0x01, 0xf6, 0x95, 0xdb, 0x82, 
-	0xd1, 0x01, 0x10, 0x63, 0xea, 0x95, 0xd1, 0x02, 
-	0x11, 0x62, 0xea, 0x95, 0xd1, 0x03, 0xd1, 0x8c, 
-	0x61, 0x06, 0xdb, 0x40, 0x00, 0xe0, 0xd0, 0x00, 
-	0x71, 0x00, 0xc0, 0x84, 0x10, 0x9c, 0xb0, 0x96, 
-	0xfa, 0xa0, 0xb1, 0x38, 0xb0, 0x96, 0xfa, 0xa3, 
-	0xb1, 0x30, 0x00, 0x29, 0xd1, 0x84, 0x00, 0x22, 
-	0xd0, 0x74, 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 
-	0x30, 0xc2, 0xea, 0xae, 0x60, 0x81, 0xdb, 0x41, 
-	0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x7c, 0x71, 0x00, 
-	0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 
-	0xea, 0xb9, 0x60, 0x81, 0xdb, 0x41, 0x00, 0xee, 
-	0xd1, 0xb4, 0x70, 0x06, 0xb1, 0xbc, 0x70, 0x46, 
-	0x30, 0x40, 0xea, 0xc2, 0x60, 0x06, 0xdb, 0x41, 
-	0x00, 0x23, 0xd0, 0x70, 0x30, 0x81, 0xea, 0xc7, 
-	0x30, 0x81, 0x50, 0x02, 0xea, 0xca, 0xd0, 0x01, 
-	0x00, 0x22, 0xd1, 0xbc, 0x70, 0x86, 0x30, 0x80, 
-	0xea, 0xd2, 0x60, 0x06, 0xd0, 0x10, 0xf3, 0x06, 
-	0x00, 0x22, 0xd1, 0xa4, 0x71, 0x06, 0xd0, 0x01, 
-	0x41, 0x00, 0x5b, 0x44, 0x5b, 0x6e, 0x6b, 0x46, 
-	0x00, 0x28, 0xd0, 0x70, 0x70, 0x41, 0x10, 0x62, 
-	0xfa, 0xe6, 0xd1, 0x84, 0x70, 0x06, 0x10, 0x20, 
-	0xfa, 0xdf, 0x00, 0x22, 0xd0, 0x00, 0xf3, 0x06, 
-	0x02, 0x7d, 0xdc, 0x62, 0xe0, 0x46, 0x00, 0xed, 
-	0xd1, 0x88, 0x71, 0x06, 0x01, 0x1f, 0xfa, 0xfd, 
-	0xd0, 0x41, 0x41, 0x01, 0xd0, 0x62, 0x00, 0x65, 
-	0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xea, 0xfa, 
-	0xee, 0xf9, 0x1a, 0xe1, 0xfa, 0xfa, 0xd0, 0x52, 
-	0x51, 0x01, 0x61, 0x06, 0xe3, 0x0c, 0x18, 0xe0, 
-	0xea, 0x70, 0xc7, 0x60, 0xc7, 0xe1, 0x02, 0x50, 
-	0xea, 0x70, 0xc7, 0x61, 0xc7, 0xe0, 0xe2, 0x70, 
-	0x00, 0x28, 0xdc, 0xa4, 0x7c, 0x72, 0x5c, 0x40, 
-	0x6c, 0x72, 0x0f, 0xc5, 0x18, 0xe0, 0xeb, 0x82, 
-	0xd9, 0x0d, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x06, 
-	0x10, 0x21, 0xfb, 0x7f, 0xd9, 0x0c, 0x90, 0x06, 
-	0x00, 0x10, 0xeb, 0x7f, 0x00, 0x21, 0xd1, 0x88, 
-	0x7a, 0x06, 0x1a, 0x20, 0xeb, 0x7f, 0xd9, 0x00, 
-	0x00, 0xed, 0xd1, 0xbc, 0x79, 0x46, 0x19, 0x60, 
-	0xeb, 0x7f, 0x39, 0x68, 0xc0, 0xe5, 0xc0, 0x25, 
-	0x10, 0x13, 0xb0, 0x0f, 0xef, 0x7f, 0xb0, 0x22, 
-	0xe7, 0x7f, 0x00, 0xe0, 0xd1, 0xa8, 0x71, 0x46, 
-	0x11, 0x5f, 0x29, 0x45, 0x00, 0x22, 0xd0, 0x18, 
-	0x00, 0x22, 0xd4, 0x54, 0x00, 0x22, 0xd0, 0x9c, 
-	0x70, 0x00, 0x74, 0x51, 0x70, 0x42, 0x34, 0x40, 
-	0xe7, 0x3c, 0xd0, 0x40, 0x00, 0x22, 0xd4, 0x50, 
-	0x74, 0x51, 0x34, 0x40, 0xef, 0x42, 0x20, 0x45, 
-	0x60, 0x42, 0x39, 0x41, 0x19, 0x60, 0xf7, 0x5e, 
-	0x00, 0x65, 0xd1, 0xa8, 0x7a, 0x86, 0x29, 0x6a, 
-	0x19, 0x59, 0xb9, 0x7e, 0xf7, 0x75, 0x15, 0xa3, 
-	0xf7, 0x57, 0x00, 0xed, 0xd1, 0xac, 0x70, 0x06, 
-	0x00, 0xed, 0xd1, 0xb0, 0x70, 0x46, 0x30, 0x01, 
-	0xfb, 0x7f, 0x00, 0x65, 0xd1, 0x84, 0x70, 0x46, 
-	0xb0, 0x7f, 0x60, 0x46, 0xd5, 0x84, 0xe3, 0x7f, 
-	0x11, 0x41, 0xd0, 0x4a, 0x00, 0xed, 0xd1, 0xa0, 
-	0x74, 0x46, 0xd0, 0x00, 0x60, 0x06, 0x30, 0xc5, 
-	0x39, 0x45, 0xe7, 0x6e, 0x14, 0x60, 0xeb, 0x6b, 
-	0xf3, 0x85, 0xb0, 0x41, 0xef, 0x65, 0xe3, 0x71, 
-	0x00, 0x66, 0xd1, 0xa0, 0x60, 0xc6, 0x15, 0xa3, 
-	0xeb, 0x7f, 0xf3, 0x85, 0xe3, 0x7f, 0xd9, 0x01, 
-	0x00, 0x66, 0xd1, 0xa0, 0x70, 0x06, 0x30, 0x03, 
-	0xe7, 0x7e, 0x10, 0x1d, 0x10, 0x3b, 0xe7, 0x7f, 
-	0x60, 0xc6, 0x00, 0x66, 0xd1, 0xa4, 0x69, 0x06, 
-	0x15, 0xa4, 0xea, 0x23, 0xe2, 0x3b, 0x00, 0x65, 
-	0xdd, 0x08, 0x7c, 0xf4, 0xbc, 0xff, 0x6c, 0xf4, 
-	0x00, 0xef, 0xdd, 0x10, 0x7c, 0xf4, 0xbc, 0xfe, 
-	0x6c, 0xf4, 0xc0, 0x3f, 0xf1, 0x18, 0xf1, 0x16, 
-	0xf1, 0x18, 0x00, 0x05, 0x08, 0x20, 0xd0, 0x40, 
-	0x5f, 0x01, 0x15, 0x63, 0xe9, 0x77, 0x05, 0x5e, 
-	0xea, 0xf2, 0x00, 0x22, 0xd1, 0xa0, 0x6b, 0x06, 
-	0x00, 0x22, 0xd1, 0xa8, 0x6b, 0xc6, 0x00, 0x22, 
-	0xd1, 0xac, 0x6a, 0xc6, 0x00, 0xee, 0xd0, 0x0c, 
-	0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x5f, 
-	0xe9, 0x8d, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, 
-	0x30, 0x5f, 0xe9, 0x8d, 0xb1, 0xb4, 0x00, 0xe6, 
-	0xd0, 0x10, 0xd0, 0x83, 0x70, 0x40, 0x60, 0x46, 
-	0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x81, 0xed, 0x90, 
-	0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, 
-	0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 0xb0, 0x3c, 
-	0xb1, 0xb4, 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 
-	0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x00, 0x61, 0x80, 
-	0x00, 0x21, 0xd1, 0xb4, 0x70, 0x06, 0x10, 0x20, 
-	0xe9, 0xae, 0xd0, 0x00, 0x60, 0x06, 0xf1, 0x18, 
-	0x00, 0x21, 0xd1, 0x8c, 0x70, 0x46, 0x65, 0x86, 
-	0xde, 0xc0, 0x00, 0xee, 0xd0, 0x20, 0x70, 0x00, 
-	0x10, 0x22, 0xfd, 0xb9, 0xde, 0xc2, 0x00, 0x21, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xc0, 
-	0x15, 0xa3, 0xe9, 0xdc, 0xd0, 0x02, 0x4c, 0x00, 
-	0x10, 0x63, 0xe9, 0xc5, 0xcc, 0x3b, 0xd0, 0x04, 
-	0x63, 0x00, 0xd0, 0x00, 0x70, 0x00, 0x30, 0x1f, 
-	0xfa, 0xf2, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, 
-	0xed, 0xc7, 0xd0, 0x04, 0x70, 0x80, 0x10, 0xa0, 
-	0xea, 0xf2, 0xf1, 0x16, 0x00, 0x21, 0xd0, 0x9a, 
-	0xc0, 0x39, 0x30, 0x1f, 0x10, 0x18, 0x30, 0x02, 
-	0xfd, 0xcf, 0xe2, 0xf2, 0x00, 0xe0, 0xd9, 0x04, 
-	0x79, 0x24, 0xb9, 0x38, 0x19, 0x1c, 0xd0, 0x1e, 
-	0x30, 0x24, 0xf5, 0xe5, 0x29, 0x00, 0xdc, 0x88, 
-	0x4c, 0xac, 0xd0, 0x02, 0x40, 0x2c, 0x10, 0x02, 
-	0x0c, 0x80, 0x10, 0x63, 0xea, 0x5a, 0x15, 0x63, 
-	0xf9, 0xf0, 0xf1, 0x18, 0xdc, 0x1e, 0x1e, 0xe0, 
-	0xe9, 0xf6, 0x15, 0x63, 0xf9, 0xf6, 0xbe, 0xfc, 
-	0xd0, 0x2c, 0x6c, 0x00, 0xcc, 0x24, 0xd9, 0x40, 
-	0x06, 0x50, 0xea, 0x0c, 0xc0, 0x24, 0xb0, 0x0f, 
-	0xfe, 0x0c, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f, 
-	0x30, 0x25, 0xee, 0x05, 0x29, 0x40, 0x19, 0x5f, 
-	0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24, 
-	0xe6, 0x0c, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40, 
-	0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b, 
-	0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3, 
-	0x10, 0xaf, 0xf6, 0x19, 0xd0, 0x8f, 0x02, 0xe4, 
-	0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81, 
-	0xee, 0x1c, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xab, 
-	0xd0, 0x30, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23, 
-	0xd4, 0x5e, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f, 
-	0xfa, 0x45, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x31, 
-	0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x2c, 0xc0, 0xc0, 
-	0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 
-	0x20, 0xf1, 0x15, 0x63, 0xfa, 0x46, 0xf2, 0x3e, 
-	0xc1, 0x11, 0xc0, 0x83, 0xf2, 0x8f, 0xe2, 0x59, 
-	0xb1, 0x01, 0xe6, 0x44, 0x68, 0x40, 0x28, 0x60, 
-	0xb0, 0x3c, 0xe2, 0x3e, 0x0f, 0xc5, 0xd9, 0x40, 
-	0xb1, 0x0f, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x3e, 
-	0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x59, 0x20, 0x31, 
-	0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60, 
-	0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31, 
-	0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x4b, 0xe2, 0xe1, 
-	0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80, 
-	0x00, 0xa8, 0xd1, 0x44, 0x00, 0xab, 0xd0, 0x30, 
-	0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0x9d, 0xd9, 0x78, 
-	0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5, 
-	0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6, 
-	0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f, 
-	0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44, 
-	0xf6, 0x78, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83, 
-	0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70, 
-	0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xad, 0x20, 0xb1, 
-	0xf2, 0x8f, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85, 
-	0x30, 0xb1, 0xf2, 0x8f, 0xc1, 0x11, 0xc0, 0x83, 
-	0x0c, 0x9d, 0xfa, 0x8d, 0xb0, 0xbc, 0xf2, 0x8f, 
-	0xe2, 0xd6, 0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42, 
-	0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0x8f, 
-	0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42, 0xb0, 0xb8, 
-	0x60, 0x40, 0xb0, 0x38, 0xe2, 0x96, 0x00, 0xab, 
-	0xd0, 0x34, 0xc1, 0x23, 0xb1, 0x0f, 0xf2, 0x96, 
-	0xd1, 0x1e, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84, 
-	0xf2, 0x96, 0xd1, 0x0f, 0x00, 0xa8, 0xd0, 0x84, 
-	0xc0, 0x03, 0xf2, 0x96, 0xe2, 0xd6, 0xd8, 0x82, 
-	0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xc3, 
-	0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22, 
-	0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c, 
-	0xe2, 0xb0, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1, 
-	0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xd6, 0x70, 0x42, 
-	0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, 
-	0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22, 
-	0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xc7, 
-	0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04, 
-	0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xe1, 
-	0x1e, 0xe0, 0xea, 0xe1, 0xbc, 0x3c, 0x00, 0xab, 
-	0xd0, 0xb0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20, 
-	0xd1, 0x1e, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40, 
-	0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xe7, 0xd0, 0x30, 
-	0x30, 0x30, 0xee, 0xed, 0xd0, 0x04, 0x63, 0x00, 
-	0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba, 
-	0xd0, 0x3c, 0xe0, 0x46, 0x01, 0x46, 0xd0, 0x08, 
-	0x94, 0x89, 0xd0, 0x8c, 0x44, 0x82, 0x14, 0x9e, 
-	0x30, 0x12, 0xd0, 0x88, 0x10, 0x80, 0x00, 0xe8, 
-	0xd1, 0x80, 0x70, 0xc6, 0x00, 0x06, 0xa0, 0xbd, 
-	0xa0, 0xfc, 0x80, 0x3f, 0xb1, 0xbe, 0x60, 0xc6, 
-	0x00, 0x06, 0x80, 0xa9, 0x80, 0x3f, 0x80, 0x2a, 
-	0x80, 0x3f, 0x00, 0x21, 0xd0, 0x3c, 0x00, 0x0a, 
-	0xb1, 0x82, 0xd0, 0x6b, 0x70, 0x46, 0x00, 0x06, 
-	0x80, 0x07, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x0c, 0x20, 
-	0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x09, 
-	0xd0, 0x41, 0x40, 0x01, 0xd0, 0x44, 0x40, 0x70, 
-	0x20, 0x01, 0xa0, 0x27, 0x80, 0x3f, 0x00, 0xc6, 
-	0x15, 0x63, 0xe9, 0xae, 0x05, 0x5e, 0xe9, 0xbe, 
-	0x00, 0xe0, 0xd0, 0x40, 0x70, 0x81, 0x10, 0x9c, 
-	0xb0, 0x96, 0xf9, 0xb7, 0x00, 0x21, 0xd0, 0x40, 
-	0xe1, 0xbb, 0xb0, 0x96, 0xf9, 0xbe, 0x00, 0x22, 
-	0xd0, 0x40, 0x27, 0xc1, 0x27, 0x41, 0x27, 0x81, 
-	0x90, 0x83, 0x00, 0x64, 0xd0, 0x10, 0x60, 0x80, 
-	0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0x00, 0x64, 
-	0xd0, 0x14, 0x67, 0x40, 0x80, 0x34, 0x80, 0x3f, 
-	0x00, 0xc6, 0x90, 0xae, 0x00, 0x64, 0xd0, 0x18, 
-	0x60, 0x80, 0x90, 0xa6, 0x00, 0x64, 0xd0, 0x1c, 
-	0x60, 0x80, 0x15, 0x63, 0xe9, 0xe3, 0x0c, 0x1f, 
-	0xe9, 0xe3, 0x05, 0x50, 0xf9, 0xe3, 0x15, 0xa3, 
-	0xf9, 0xe3, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xdb, 
-	0x00, 0x06, 0x05, 0x0d, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfb, 0x00, 0x21, 
-	0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xfb, 
-	0xd0, 0x38, 0x70, 0x00, 0x15, 0x63, 0xe9, 0xef, 
-	0x10, 0x1f, 0x15, 0x21, 0xe5, 0xe0, 0xd0, 0x5e, 
-	0x30, 0x54, 0xe5, 0xe0, 0xc0, 0x40, 0xb0, 0x7f, 
-	0x30, 0x54, 0xe9, 0xfb, 0x0c, 0x09, 0x05, 0x0d, 
-	0xe1, 0xef, 0xc0, 0x5f, 0x10, 0x58, 0x10, 0x48, 
-	0x00, 0xee, 0xd0, 0x8c, 0xd0, 0xc3, 0x70, 0x02, 
-	0x30, 0x01, 0xea, 0x10, 0xb0, 0xbc, 0xb0, 0xc1, 
-	0xee, 0x01, 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0x15, 0xa3, 0xea, 0x0f, 
-	0xb0, 0x88, 0x77, 0xc2, 0x80, 0x07, 0x09, 0x49, 
-	0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 
-	0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 
-	0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 
-	0xfa, 0x1a, 0x0c, 0x49, 0x00, 0x8d, 0xc0, 0x42, 
-	0x10, 0x60, 0xea, 0x2a, 0xb0, 0x5e, 0xb0, 0x43, 
-	0xfe, 0x34, 0xd0, 0x61, 0x23, 0x81, 0xe2, 0x1f, 
-	0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x31, 
-	0xd0, 0x5f, 0x30, 0x54, 0xee, 0x10, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0xc6, 0xd4, 0xb6, 0xc1, 
-	0xe6, 0x31, 0xd0, 0x5e, 0x30, 0x5b, 0xfe, 0x31, 
-	0xd7, 0x00, 0xb7, 0x01, 0xd3, 0x81, 0x00, 0x27, 
-	0xd0, 0x10, 0xd0, 0x81, 0x60, 0x80, 0x15, 0x63, 
-	0xfa, 0x54, 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf7, 
-	0xd2, 0x10, 0xf0, 0x4a, 0x15, 0xa3, 0xfa, 0x51, 
-	0x02, 0xf6, 0xde, 0x26, 0x0c, 0x10, 0xf8, 0x46, 
-	0x02, 0xfb, 0xda, 0x22, 0xe0, 0x46, 0x02, 0xf1, 
-	0xd8, 0x2b, 0xe0, 0x46, 0x00, 0x22, 0xdc, 0xd8, 
-	0x03, 0xf9, 0xd2, 0x10, 0xf0, 0x4a, 0x03, 0x34, 
-	0xdc, 0x20, 0x15, 0xa3, 0xe8, 0x46, 0x02, 0xff, 
-	0xde, 0x27, 0xe0, 0x46, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xe0, 
-	0xe1, 0xec, 0xe2, 0x12, 0xe2, 0x14, 0xe1, 0xc7, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xde, 0xf9, 0xba, 0x03, 0xdf, 
-	0xe9, 0x99, 0xd3, 0x40, 0xca, 0x50, 0xd1, 0x42, 
-	0xe2, 0xea, 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 
-	0x10, 0x8c, 0x10, 0x92, 0x10, 0xe0, 0xe5, 0xa8, 
-	0xc0, 0x01, 0x10, 0x01, 0x20, 0x40, 0xc0, 0x02, 
-	0x10, 0x01, 0x20, 0x80, 0x10, 0x60, 0xfd, 0xab, 
-	0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xae, 0xb0, 0xbf, 
-	0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 
-	0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 
-	0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 0x0f, 0xc5, 
-	0xcb, 0xaa, 0xcb, 0xeb, 0xca, 0x50, 0xd0, 0xc0, 
-	0xb0, 0xc1, 0xf1, 0x9b, 0xcb, 0x01, 0xd0, 0xc1, 
-	0xf1, 0x9b, 0xcb, 0x41, 0xba, 0x7f, 0xbb, 0x3f, 
-	0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 
-	0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xd5, 
-	0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 
-	0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 
-	0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84, 
-	0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 
-	0x13, 0xa0, 0xed, 0xe5, 0xf2, 0x32, 0xb3, 0x81, 
-	0xe9, 0xec, 0x80, 0x07, 0xd4, 0x00, 0xc4, 0x50, 
-	0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 
-	0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xfa, 0x06, 0x5e, 0xfa, 0x03, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xfa, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xfa, 0x03, 0xd0, 0x43, 0x40, 0x4c, 
-	0xea, 0x03, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xea, 0x0a, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xea, 0x10, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xd3, 
-	0xe1, 0xdc, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xac, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x30, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, 
-	0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xdf, 0xe9, 0xa1, 0xd3, 0x40, 
-	0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa8, 
-	0xca, 0x12, 0xca, 0x52, 0xe1, 0xa5, 0x03, 0x1d, 
-	0xf9, 0xa8, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 
-	0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 
-	0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 
-	0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xd2, 
-	0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, 
-	0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, 
-	0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, 
-	0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xc4, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xc7, 
-	0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, 
-	0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xd8, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xdc, 
-	0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, 
-	0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xe8, 0x06, 0x5e, 
-	0xf9, 0xf1, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xe8, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xf1, 
-	0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xf1, 0x08, 0x49, 
-	0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, 
-	0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xf8, 
-	0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, 
-	0xb0, 0x20, 0x03, 0x19, 0xe9, 0xfe, 0xb0, 0x20, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, 
-	0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 
-	0xe2, 0x8d, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc1, 
-	0xe1, 0xca, 0xe1, 0xee, 0xe1, 0xf0, 0xe1, 0xa8, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xdf, 0xe9, 0x9d, 0xd3, 0x40, 
-	0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa4, 
-	0xca, 0x12, 0xca, 0x52, 0xe1, 0xa1, 0x03, 0x1d, 
-	0xf9, 0xa4, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 
-	0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 
-	0xb1, 0x7e, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 
-	0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 
-	0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 
-	0xe9, 0xb6, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 
-	0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 
-	0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xc6, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xca, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xd6, 0x06, 0x5e, 0xf9, 0xdf, 0x08, 0x89, 
-	0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xd6, 0xd3, 0xc4, 
-	0x06, 0x5e, 0xf9, 0xdf, 0xd0, 0x43, 0x40, 0x4c, 
-	0xe9, 0xdf, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, 
-	0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xe6, 0x09, 0x49, 0x00, 0x0d, 
-	0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, 
-	0xe9, 0xec, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, 
-	0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xdb, 
-	0xe1, 0xe9, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xc3, 
-	0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, 
-	0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, 
-	0x10, 0x11, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, 
-	0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xd0, 0xf9, 0x98, 0xca, 0x50, 
-	0x03, 0xde, 0xf9, 0x9a, 0xd1, 0x42, 0xe2, 0xea, 
-	0xcb, 0xaa, 0xcb, 0xeb, 0xc0, 0x50, 0x10, 0x54, 
-	0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0xc1, 
-	0x05, 0x50, 0xe9, 0xa5, 0xb0, 0xc2, 0x10, 0x60, 
-	0xfd, 0xa8, 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xab, 
-	0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 
-	0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 
-	0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 
-	0xd0, 0x81, 0x14, 0x1f, 0x14, 0x01, 0x05, 0x50, 
-	0xe9, 0xbd, 0x50, 0x42, 0xe1, 0xbe, 0x54, 0x02, 
-	0xca, 0x10, 0xca, 0x50, 0xcb, 0x01, 0xcb, 0x41, 
-	0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 
-	0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x05, 0x50, 0xf9, 0xd2, 0xb0, 0x3c, 
-	0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 
-	0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 
-	0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, 
-	0xed, 0xe0, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xe9, 
-	0x80, 0x07, 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 
-	0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 
-	0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 
-	0x41, 0x8c, 0xe9, 0xf7, 0x08, 0x89, 0x03, 0xcd, 
-	0x13, 0xe3, 0xf9, 0xf6, 0xd3, 0xc4, 0xe1, 0xf7, 
-	0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 
-	0x03, 0x1c, 0xe9, 0xfe, 0x09, 0x49, 0x00, 0x0d, 
-	0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 
-	0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 
-	0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc9, 
-	0xe1, 0xd2, 0xe1, 0xe7, 0xe1, 0xe9, 0xe1, 0xab, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, 
-	0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, 
-	0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, 
-	0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, 
-	0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x20, 
-	0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, 
-	0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, 
-	0xe1, 0x79, 0x03, 0xd0, 0xf9, 0xa0, 0xca, 0x50, 
-	0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 
-	0xca, 0x52, 0xe1, 0xa4, 0x03, 0x1d, 0xf9, 0xa7, 
-	0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 
-	0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 
-	0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 
-	0x2c, 0x80, 0x17, 0x20, 0xf9, 0xc8, 0x00, 0x2a, 
-	0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 
-	0xf9, 0xb8, 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 
-	0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 
-	0x0c, 0x99, 0xe9, 0xc1, 0x3c, 0x80, 0xde, 0xa0, 
-	0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 
-	0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, 
-	0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xce, 0xf2, 0x32, 
-	0xb3, 0x81, 0xe9, 0xd2, 0x80, 0x07, 0xe2, 0x95, 
-	0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 
-	0xe9, 0xde, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 
-	0xf9, 0xdd, 0xd3, 0xc4, 0xe1, 0xde, 0xb3, 0xc1, 
-	0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 
-	0xe9, 0xe5, 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 
-	0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x00, 
-	0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa3, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xb4, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, 
-	0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0x98, 0x01, 0x69, 
-	0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 
-	0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 
-	0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 
-	0x30, 0x5a, 0xe5, 0xc8, 0x00, 0x26, 0xd0, 0x00, 
-	0x70, 0x00, 0x10, 0x20, 0xe9, 0xbf, 0x00, 0xe0, 
-	0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, 
-	0xb0, 0x41, 0xed, 0xc8, 0x0f, 0x17, 0xf9, 0xb4, 
-	0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb8, 
-	0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 
-	0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 
-	0xe5, 0xc8, 0x0f, 0x17, 0xf9, 0xc3, 0x02, 0xf1, 
-	0xd8, 0x2b, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 
-	0xe2, 0x95, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xb5, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xc6, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, 
-	0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x88, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xb4, 0x00, 0xa8, 0xd0, 0x00, 
-	0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, 
-	0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, 
-	0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, 
-	0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa6, 0x3c, 0x80, 
-	0x0e, 0xd9, 0xe9, 0xa9, 0x3e, 0xc0, 0x3e, 0xf2, 
-	0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, 
-	0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, 
-	0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xf2, 0xd3, 
-	0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xda, 
-	0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 
-	0xe9, 0xd1, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 
-	0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xda, 
-	0x0f, 0x17, 0xf9, 0xc6, 0x0f, 0x49, 0xf2, 0xd3, 
-	0x0f, 0x19, 0xf9, 0xca, 0xdf, 0x00, 0x00, 0x06, 
-	0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 
-	0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xda, 0x0f, 0x17, 
-	0xf9, 0xd5, 0x02, 0xf6, 0xde, 0x26, 0xe0, 0x46, 
-	0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa2, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, 
-	0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xb3, 
-	0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, 
-	0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, 
-	0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 
-	0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 
-	0x05, 0x50, 0xf9, 0x99, 0xb0, 0x3c, 0x2c, 0x40, 
-	0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 
-	0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 
-	0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 
-	0xe5, 0xc7, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x44, 
-	0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, 
-	0xed, 0xc7, 0x0f, 0x17, 0xf9, 0xb3, 0x0f, 0x49, 
-	0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb7, 0xdf, 0x00, 
-	0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 
-	0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc7, 
-	0x0f, 0x17, 0xf9, 0xc2, 0x02, 0xff, 0xde, 0x27, 
-	0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 
-	0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73, 
-	0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xac, 
-	0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, 
-	0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, 
-	0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xbd, 
-	0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, 
-	0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, 
-	0xed, 0x88, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, 
-	0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 
-	0x17, 0x20, 0xf9, 0xab, 0x00, 0x2a, 0xd0, 0x00, 
-	0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 0xf9, 0x9b, 
-	0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 
-	0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 
-	0xe9, 0xa4, 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 
-	0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 
-	0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 
-	0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xd1, 0x00, 0x26, 
-	0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xc8, 
-	0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, 
-	0x30, 0x5b, 0xb0, 0x41, 0xed, 0xd1, 0x0f, 0x17, 
-	0xf9, 0xbd, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 
-	0xf9, 0xc1, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 
-	0xb0, 0x7e, 0xe5, 0xd1, 0x0f, 0x17, 0xf9, 0xcc, 
-	0x03, 0x34, 0xdc, 0x20, 0xe0, 0x46, 0xd3, 0x08, 
-	0xd3, 0xc0, 0xe2, 0x95, 0xd0, 0x61, 0x23, 0x81, 
-	0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, 
-	0xea, 0x3b, 0x30, 0x42, 0xe6, 0x30, 0x23, 0x82, 
-	0x0f, 0xc5, 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 
-	0xfe, 0x45, 0xd0, 0x5f, 0x15, 0x63, 0xea, 0x43, 
-	0xd0, 0x50, 0x30, 0x54, 0xee, 0x4a, 0x0f, 0x17, 
-	0xfa, 0x45, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 
-	0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 
-	0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 
-	0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 
-	0x00, 0x50, 0xfa, 0x53, 0xf2, 0x32, 0xd3, 0x80, 
-	0xe1, 0x76, 0xd1, 0xc2, 0x41, 0xcf, 0x11, 0xdf, 
-	0xd0, 0x41, 0x01, 0xc1, 0x00, 0xef, 0xd0, 0xbe, 
-	0x03, 0x10, 0xf9, 0x77, 0x80, 0x07, 0x21, 0x96, 
-	0x11, 0xa2, 0xe9, 0x78, 0x03, 0x1d, 0xea, 0x73, 
-	0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, 
-	0x03, 0xd0, 0xea, 0x72, 0xc2, 0x91, 0xf2, 0xa4, 
-	0xc4, 0x4a, 0x03, 0x1e, 0xea, 0x8d, 0xc0, 0xd8, 
-	0xc2, 0x92, 0xf2, 0xa4, 0xc4, 0x8a, 0x03, 0xd0, 
-	0xea, 0x7d, 0xc2, 0x93, 0xf2, 0xa4, 0xc4, 0xca, 
-	0xe2, 0x8d, 0xd3, 0xc0, 0xc0, 0xd7, 0xc2, 0x90, 
-	0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x88, 
-	0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x08, 0x49, 
-	0x00, 0x4d, 0x10, 0x61, 0xf8, 0x11, 0x03, 0x1f, 
-	0xea, 0x93, 0x0d, 0xc9, 0x00, 0x4d, 0xd0, 0x1a, 
-	0xe2, 0x98, 0x03, 0x10, 0xfa, 0x97, 0xd0, 0x1d, 
-	0xe2, 0x98, 0xd0, 0x18, 0x0f, 0x16, 0xfa, 0x98, 
-	0xd0, 0x4c, 0x40, 0x4c, 0x10, 0x6c, 0xea, 0xa2, 
-	0x03, 0xde, 0xfa, 0xa2, 0x0f, 0x12, 0xfa, 0xa0, 
-	0x00, 0x08, 0xe2, 0xd9, 0xd2, 0x00, 0x13, 0xe1, 
-	0xee, 0xa9, 0x08, 0x49, 0x02, 0x0d, 0x00, 0xc8, 
-	0xc2, 0xca, 0x12, 0x94, 0xd0, 0x1f, 0x30, 0x07, 
-	0x12, 0xc0, 0xc2, 0x43, 0x12, 0x5a, 0x00, 0x0d, 
-	0x03, 0xde, 0xea, 0xb6, 0x0e, 0xc9, 0x04, 0x8d, 
-	0x02, 0x48, 0x22, 0x80, 0x12, 0x88, 0xd0, 0x0b, 
-	0x30, 0x03, 0x12, 0x80, 0xd0, 0x19, 0x20, 0x03, 
-	0x12, 0x80, 0x00, 0x0d, 0x22, 0xc0, 0x12, 0xc8, 
-	0xd0, 0x0b, 0x30, 0x09, 0x12, 0xc0, 0x12, 0xd8, 
-	0xd0, 0x16, 0x20, 0x09, 0x20, 0x07, 0x12, 0xc0, 
-	0x42, 0xc2, 0x22, 0x8b, 0x22, 0x88, 0x03, 0xde, 
-	0xea, 0xd2, 0x0e, 0xc9, 0xc4, 0x4a, 0x04, 0xcd, 
-	0x0f, 0xc5, 0x01, 0x46, 0x90, 0x4d, 0x00, 0xc6, 
-	0x10, 0x60, 0xe6, 0xd3, 0x0f, 0xc5, 0x01, 0x74, 
-	0xd6, 0x00, 0xca, 0x9d, 0xcb, 0x9e, 0xca, 0xea, 
-	0xcb, 0xee, 0x2a, 0xc0, 0x2b, 0xc0, 0xca, 0x10, 
-	0xca, 0x51, 0xcb, 0x12, 0xcb, 0x53, 0xd1, 0x40, 
-	0xd3, 0x41, 0xb7, 0x3f, 0xc0, 0x5c, 0xe1, 0x7b, 
-	0xd0, 0xc0, 0xc1, 0x28, 0xc2, 0x2a, 0xc2, 0xab, 
-	0xf1, 0x7a, 0x0f, 0x17, 0xfa, 0xef, 0xcc, 0xe8, 
-	0xcd, 0x29, 0xcd, 0x6c, 0xcd, 0xad, 0xc8, 0x08, 
-	0xc8, 0x49, 0xca, 0x0a, 0xca, 0x4b, 0xf3, 0x31, 
-	0xd0, 0xc1, 0xc1, 0x34, 0xc2, 0x2a, 0xc2, 0xab, 
-	0xf1, 0x7a, 0x00, 0x28, 0xd9, 0xc0, 0xc8, 0x88, 
-	0xc8, 0xc9, 0xa9, 0xf8, 0xca, 0x8a, 0xca, 0xcb, 
-	0x11, 0x62, 0xe9, 0x79, 0xd0, 0xc0, 0xc1, 0x35, 
-	0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc9, 0x08, 
-	0xc9, 0x49, 0xa9, 0xf8, 0xcb, 0x0a, 0xcb, 0x4b, 
-	0xd0, 0xc1, 0xc1, 0x36, 0xc2, 0x2e, 0xc2, 0xaf, 
-	0xf1, 0x7a, 0xc0, 0x27, 0xc9, 0x88, 0xc9, 0xc9, 
-	0xa0, 0x38, 0xcb, 0x8a, 0xcb, 0xcb, 0xe1, 0x79, 
-	0x5f, 0x0d, 0x07, 0x7d, 0xde, 0x07, 0x11, 0x5e, 
-	0x30, 0x05, 0xcd, 0xc0, 0x00, 0x28, 0xd0, 0x00, 
-	0xa0, 0x38, 0x11, 0x61, 0xf9, 0x75, 0x00, 0xe2, 
-	0xd0, 0x00, 0x0f, 0x1d, 0xeb, 0x29, 0x00, 0x2d, 
-	0xdf, 0x4b, 0xf3, 0x3f, 0xe1, 0x75, 0x04, 0xeb, 
-	0xd0, 0x00, 0x11, 0x62, 0xeb, 0x36, 0xb0, 0x20, 
-	0x0f, 0x19, 0xfb, 0x36, 0xac, 0xe0, 0x01, 0xa4, 
-	0xde, 0x00, 0x5e, 0x0d, 0x00, 0x2d, 0xdf, 0x7a, 
-	0xdd, 0xc0, 0xd8, 0x80, 0xd9, 0x00, 0xd9, 0x80, 
-	0x5f, 0x00, 0x01, 0x46, 0x00, 0x28, 0xd0, 0x01, 
-	0x00, 0x06, 0xa0, 0x37, 0x80, 0x3f, 0x00, 0xc6, 
-	0x0f, 0xc5, 0xad, 0xda, 0xc6, 0xb1, 0xd0, 0x01, 
-	0x01, 0xa3, 0xde, 0x1d, 0x40, 0x30, 0x3e, 0x00, 
-	0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0xc8, 0x28, 
-	0xc8, 0x69, 0xc8, 0xaa, 0xc8, 0xeb, 0x0c, 0x1e, 
-	0xfb, 0x68, 0x26, 0xba, 0x07, 0x7d, 0xdc, 0x00, 
-	0x1d, 0xcf, 0x1d, 0xd1, 0x5d, 0xc0, 0x00, 0x2d, 
-	0xdf, 0x64, 0x0f, 0x87, 0xad, 0xda, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x66, 0xda, 0xc9, 0x2c, 0xc9, 0x6d, 
-	0xc9, 0xae, 0xc9, 0xef, 0x0f, 0x2f, 0xd0, 0x37, 
-	0x4f, 0x00, 0x0f, 0x1a, 0xeb, 0xbe, 0x01, 0xa4, 
-	0xde, 0x20, 0xd0, 0x01, 0x40, 0x3c, 0x2e, 0x00, 
-	0x00, 0x2d, 0xdf, 0x7a, 0xac, 0xe0, 0x0f, 0x87, 
-	0x0e, 0x0a, 0x76, 0xe0, 0xbf, 0x79, 0xbe, 0x3c, 
-	0x0f, 0x1b, 0xeb, 0x9e, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe1, 0xbf, 0x79, 0xbe, 0x34, 0x18, 0xa0, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x20, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe2, 0xbf, 0x79, 0xbe, 0x3c, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe3, 0x0f, 0x1b, 
-	0xeb, 0xb3, 0xbf, 0x77, 0xbe, 0x0c, 0x19, 0x20, 
-	0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x60, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x76, 0xe4, 0xbe, 0x3c, 0xbf, 0x75, 
-	0x0f, 0x15, 0xf8, 0x1c, 0x1f, 0x0a, 0x1f, 0x16, 
-	0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe5, 0xbf, 0x79, 
-	0xbe, 0x34, 0x19, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, 
-	0xad, 0xa0, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe6, 
-	0xbe, 0x3c, 0xbf, 0x79, 0x0f, 0x87, 0x0e, 0x0a, 
-	0x76, 0xe7, 0x0f, 0x15, 0xeb, 0xbe, 0x00, 0x2f, 
-	0xdf, 0x72, 0x1d, 0xe0, 0xf8, 0x1c, 0x00, 0x28, 
-	0xd0, 0x01, 0xa0, 0x38, 0x80, 0x3f, 0x0f, 0x87, 
-	0xd0, 0x01, 0x4d, 0xc0, 0x1f, 0x0f, 0x1f, 0x11, 
-	0x00, 0x2f, 0xdf, 0x76, 0xc6, 0xb2, 0x03, 0x7d, 
-	0xde, 0x0e, 0x01, 0xa3, 0xde, 0x2d, 0x5d, 0xc0, 
-	0x0f, 0x87, 0x1e, 0xe1, 0xeb, 0xdb, 0xad, 0xda, 
-	0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0x0c, 0x1e, 
-	0xfb, 0xe4, 0x26, 0xbb, 0x03, 0xff, 0xdd, 0xff, 
-	0x4d, 0xc0, 0x00, 0xa3, 0xde, 0x2d, 0xbf, 0x56, 
-	0x0f, 0x87, 0x07, 0x7d, 0xde, 0x0e, 0x5d, 0xc0, 
-	0x00, 0xa3, 0xde, 0x1d, 0xad, 0xda, 0x80, 0x3f, 
-	0x0e, 0x0a, 0x66, 0xda, 0xdf, 0x5c, 0xd0, 0x0e, 
-	0x4f, 0x00, 0x0f, 0x87, 0xd0, 0x06, 0x40, 0x3c, 
-	0xeb, 0xf0, 0xbf, 0x3e, 0xb0, 0x04, 0xe7, 0xf2, 
-	0xeb, 0xf6, 0xbf, 0x0c, 0xbf, 0x3a, 0x0f, 0x87, 
-	0x0f, 0x1d, 0xfb, 0x4b, 0xbf, 0x38, 0x0f, 0x87, 
-	0x0f, 0x1c, 0xfb, 0xcb, 0xbf, 0x30, 0x0f, 0x87, 
-	0x50, 0x00, 0x50, 0x00, 0x0f, 0x17, 0xf9, 0x70, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x72, 0x0f, 0x49, 
-	0x90, 0x4d, 0x10, 0x60, 0xe5, 0x76, 0x0f, 0x19, 
-	0xf9, 0x79, 0x01, 0x46, 0xd0, 0x11, 0xa0, 0x38, 
-	0x80, 0x3f, 0x00, 0xc6, 0xdf, 0x00, 0x00, 0x06, 
-	0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x0a, 
-	0xa0, 0x1b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, 
-	0xa0, 0x27, 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 
-	0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 0xd0, 0x00, 
-	0x06, 0x50, 0xf9, 0x95, 0xd0, 0x01, 0xa0, 0x09, 
-	0x80, 0x1b, 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 
-	0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 
-	0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 
-	0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 
-	0x80, 0x07, 0x08, 0x20, 0xdf, 0x00, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, 
-	0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0xd0, 0x10, 0xa0, 0x38, 
-	0x15, 0x63, 0xe9, 0xba, 0x05, 0x5e, 0xf9, 0xfa, 
-	0xc0, 0xdf, 0x00, 0xe0, 0xd1, 0x80, 0x70, 0x06, 
-	0x10, 0x1c, 0xc1, 0x40, 0x11, 0x48, 0xd3, 0x10, 
-	0x00, 0x21, 0xd0, 0x80, 0xb0, 0x16, 0xe9, 0xca, 
-	0xd3, 0x20, 0x10, 0x81, 0xb0, 0x16, 0xf9, 0xfa, 
-	0x30, 0xc2, 0xd2, 0x5e, 0xd0, 0x8f, 0x00, 0xee, 
-	0xd0, 0x54, 0x70, 0x41, 0x30, 0x43, 0xed, 0xd7, 
-	0xd2, 0x6c, 0x72, 0x49, 0xc0, 0x89, 0xb0, 0xbf, 
-	0x10, 0x9f, 0x22, 0x42, 0x04, 0x31, 0xd0, 0x10, 
-	0xc0, 0x42, 0x30, 0x49, 0xe5, 0xde, 0x10, 0x03, 
-	0xc1, 0x0c, 0xc1, 0x83, 0xb1, 0xbe, 0x01, 0x46, 
-	0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 
-	0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xe1, 
-	0xc1, 0x0c, 0x21, 0x85, 0x01, 0x46, 0x00, 0x06, 
-	0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 
-	0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xec, 0x02, 0xe4, 
-	0xd0, 0x00, 0x20, 0xc0, 0xb2, 0x41, 0xed, 0xd8, 
-	0x15, 0xa3, 0xfa, 0x00, 0xbc, 0x10, 0x0c, 0x1e, 
-	0xfa, 0x00, 0xbc, 0x10, 0xd0, 0x04, 0x70, 0x00, 
-	0x10, 0x20, 0xfa, 0x00, 0x00, 0x27, 0xd0, 0x10, 
-	0xd0, 0x40, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x14, 
-	0x60, 0x40, 0xb0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0x28, 0xd1, 0xb0, 
-	0x70, 0x06, 0xd0, 0x81, 0x60, 0x86, 0x10, 0x20, 
-	0xe9, 0xab, 0xb0, 0x3f, 0x60, 0x06, 0x00, 0xec, 
-	0xd1, 0x84, 0x70, 0x46, 0xb1, 0x84, 0x70, 0x86, 
-	0x30, 0x42, 0xe9, 0xab, 0x70, 0x42, 0xd0, 0x35, 
-	0x30, 0x40, 0xf9, 0xab, 0x00, 0x63, 0xd0, 0x3f, 
-	0xb0, 0xbc, 0x40, 0x80, 0x70, 0xc2, 0x10, 0xe3, 
-	0xe5, 0xab, 0xb0, 0xbc, 0x40, 0x80, 0x60, 0x86, 
-	0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 0x00, 0x22, 
-	0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x60, 0xd0, 0x90, 0x60, 0x81, 0x00, 0xed, 
-	0xd1, 0x88, 0x70, 0x46, 0x10, 0xe4, 0xe9, 0xa8, 
-	0x00, 0x21, 0xd0, 0xe8, 0xd0, 0x00, 0x60, 0x03, 
-	0xd0, 0x81, 0x40, 0x42, 0x60, 0x46, 0x02, 0x3c, 
-	0xda, 0x89, 0xe0, 0x46, 0xd0, 0x82, 0x50, 0x42, 
-	0x60, 0x46, 0x00, 0x23, 0xd5, 0x3e, 0x01, 0x7a, 
-	0xde, 0x1a, 0xe0, 0x46, 0x01, 0x46, 0xdf, 0x5c, 
-	0x08, 0x20, 0xd1, 0x00, 0xcf, 0x04, 0x11, 0x08, 
-	0xa1, 0x0a, 0xa1, 0x1b, 0x11, 0x1f, 0xa1, 0x27, 
-	0xd2, 0x80, 0xb2, 0x81, 0x90, 0x4d, 0xc0, 0x01, 
-	0x10, 0x14, 0x00, 0x16, 0xe9, 0x8d, 0x80, 0x33, 
-	0x80, 0x3f, 0x92, 0x8b, 0x00, 0x23, 0xd0, 0x3f, 
-	0x42, 0x80, 0xe9, 0x8d, 0x0f, 0xff, 0xdf, 0xff, 
-	0x40, 0x01, 0xa0, 0x0d, 0xe1, 0x94, 0xa1, 0x0a, 
-	0x00, 0xea, 0xd0, 0x00, 0xd0, 0x8e, 0x00, 0x06, 
-	0x0f, 0x0b, 0x70, 0x80, 0x80, 0x73, 0x80, 0x0a, 
-	0xd0, 0x00, 0x06, 0x50, 0xf9, 0x9a, 0xd0, 0x01, 
-	0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0x15, 0x63, 
-	0xf9, 0xa1, 0x80, 0x1b, 0xe1, 0xa2, 0x80, 0x5b, 
-	0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 
-	0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 
-	0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 
-	0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 
-	0x08, 0x20, 0xd0, 0x00, 0xcf, 0x00, 0x02, 0x30, 
-	0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb2, 
-	0xd2, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, 
-	0xd0, 0x01, 0xa0, 0x38, 0x00, 0x30, 0xd0, 0x10, 
-	0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 0x00, 0x28, 
-	0xd1, 0x24, 0x70, 0x04, 0xd0, 0x41, 0x50, 0x01, 
-	0x60, 0x04, 0x00, 0x27, 0xd0, 0x18, 0x70, 0x40, 
-	0xb0, 0x7f, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x20, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x08, 0x20, 
-	0xdf, 0x00, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 
-	0xd4, 0xc0, 0xd3, 0x81, 0x12, 0xa0, 0xed, 0xe3, 
-	0xd0, 0x08, 0x0a, 0x09, 0x00, 0x4d, 0xb0, 0x01, 
-	0xed, 0xdf, 0x03, 0xbe, 0xd6, 0x27, 0xe0, 0x46, 
-	0x50, 0x00, 0x50, 0x00, 0x02, 0x24, 0xd0, 0x00, 
-	0xa0, 0x37, 0x00, 0x27, 0xd3, 0xd0, 0x00, 0x26, 
-	0xd0, 0x04, 0x73, 0xcf, 0x13, 0xe1, 0xe9, 0x7b, 
-	0xb0, 0x3c, 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x40, 
-	0xd0, 0x00, 0x60, 0x01, 0x00, 0x26, 0xd0, 0x14, 
-	0xf2, 0x00, 0x00, 0x26, 0xd0, 0x18, 0xf2, 0x00, 
-	0x00, 0xee, 0xd0, 0x1c, 0x71, 0x40, 0xd1, 0x1e, 
-	0x15, 0x63, 0xe9, 0x8d, 0x11, 0x1f, 0xc7, 0x1a, 
-	0xb7, 0x01, 0xd3, 0x81, 0xc4, 0xd4, 0xf2, 0x04, 
-	0x00, 0x26, 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x54, 
-	0xfd, 0x9b, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, 
-	0x60, 0x40, 0x13, 0xe1, 0xf9, 0xbc, 0x15, 0xa3, 
-	0xf9, 0xa1, 0x0c, 0x10, 0xe9, 0xb9, 0x11, 0x61, 
-	0xe5, 0xb3, 0xed, 0xb9, 0x15, 0xa3, 0xf9, 0xab, 
-	0x00, 0x26, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x62, 
-	0xf5, 0xb3, 0x15, 0x22, 0xe5, 0xb3, 0xc0, 0x44, 
-	0x30, 0x54, 0xe5, 0xb3, 0x34, 0xd4, 0xf5, 0xb3, 
-	0xe1, 0xbf, 0x03, 0xb3, 0xd8, 0x29, 0x00, 0x26, 
-	0xd0, 0x40, 0x60, 0x01, 0xe1, 0xdb, 0x03, 0xb3, 
-	0xd8, 0x29, 0xe0, 0x46, 0x01, 0x7a, 0xde, 0x1a, 
-	0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 
-	0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 
-	0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 
-	0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xf9, 0xc9, 
-	0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, 
-	0xe9, 0x90, 0x30, 0x42, 0xf5, 0xd8, 0xd0, 0x61, 
-	0x23, 0x81, 0xe1, 0xce, 0x23, 0x82, 0x13, 0xa1, 
-	0xf9, 0x90, 0xd0, 0x42, 0x15, 0xa1, 0xf9, 0xdf, 
-	0xb0, 0x7f, 0x00, 0x26, 0xd0, 0x14, 0x70, 0x00, 
-	0x30, 0x01, 0xf5, 0xe8, 0x16, 0xe0, 0xe5, 0xe8, 
-	0xb6, 0xc1, 0xbc, 0x20, 0xc0, 0x44, 0x30, 0x5b, 
-	0xfd, 0xb9, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb9, 
-	0x15, 0x63, 0xf9, 0xf8, 0x15, 0xa3, 0xf9, 0xf5, 
-	0x03, 0x3b, 0xda, 0x1c, 0xe0, 0x46, 0x03, 0x38, 
-	0xdc, 0x17, 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfd, 
-	0x03, 0x72, 0xd0, 0x19, 0xe0, 0x46, 0x03, 0x3f, 
-	0xd2, 0x17, 0xe0, 0x46, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x0f, 0xc5, 0xdf, 0x00, 0x0c, 0x09, 
-	0x05, 0x0d, 0x08, 0x20, 0xdf, 0x00, 0x0f, 0xc5, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd0, 0x14, 
-	0x70, 0x40, 0x10, 0x60, 0xe9, 0x45, 0xb0, 0x04, 
-	0x70, 0x40, 0xb0, 0x41, 0xed, 0x44, 0x00, 0xed, 
-	0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x00, 0x64, 
-	0xd0, 0x20, 0x70, 0x00, 0x10, 0x30, 0xe9, 0x45, 
-	0x00, 0x21, 0xd0, 0x28, 0x60, 0x40, 0x00, 0x64, 
-	0xd2, 0xc0, 0x70, 0x0b, 0x00, 0x11, 0xe9, 0x6a, 
-	0x08, 0x20, 0xd0, 0x4f, 0x30, 0x40, 0xe9, 0x55, 
-	0xb0, 0x4f, 0xf9, 0x6a, 0x03, 0xef, 0xdf, 0xbf, 
-	0xaf, 0xb8, 0xdf, 0x80, 0x0f, 0x87, 0xd0, 0x18, 
-	0x70, 0x00, 0x10, 0x20, 0xed, 0x6c, 0xdf, 0x84, 
-	0xd0, 0x40, 0x60, 0x7e, 0x00, 0x27, 0xd0, 0x54, 
-	0x70, 0x41, 0x10, 0x60, 0x01, 0xa0, 0xd0, 0x40, 
-	0xa0, 0x78, 0x80, 0x34, 0x80, 0x3f, 0x01, 0x3c, 
-	0xd2, 0x39, 0x00, 0x21, 0xdf, 0x86, 0x0f, 0x87, 
-	0xd0, 0x40, 0x60, 0x4b, 0x03, 0xe5, 0xd0, 0x10, 
-	0xe0, 0x36, 0x50, 0x00, 0x00, 0x28, 0xd0, 0x24, 
-	0x72, 0xc0, 0xd0, 0x40, 0x60, 0x40, 0xd0, 0x0c, 
-	0x52, 0xc0, 0xc0, 0x1c, 0x30, 0x1d, 0xf5, 0x3c, 
-	0x20, 0x1f, 0x30, 0x1e, 0x90, 0x6d, 0x20, 0x01, 
-	0x00, 0x22, 0xd0, 0x58, 0x60, 0x01, 0x00, 0xe3, 
-	0xd0, 0x48, 0x70, 0x41, 0x30, 0x40, 0xf5, 0x47, 
-	0xb2, 0xc8, 0x00, 0xe3, 0xd0, 0x4c, 0x70, 0x41, 
-	0x30, 0x40, 0xfd, 0x4d, 0xb2, 0xc4, 0x00, 0x28, 
-	0xd0, 0x20, 0x70, 0x00, 0x42, 0xc0, 0xa2, 0xc5, 
-	0x12, 0xe0, 0xe9, 0x55, 0x80, 0x40, 0x80, 0x34, 
-	0x80, 0x3f, 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 
-	0x03, 0xe7, 0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x60, 
-	0x03, 0xe9, 0xd0, 0x08, 0x00, 0x27, 0xd0, 0x4c, 
-	0x7f, 0x81, 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 
-	0x10, 0x60, 0x03, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 
-	0xe0, 0x3c, 0x50, 0x00, 0xc0, 0x84, 0x10, 0x8c, 
-	0x10, 0x92, 0xd0, 0x41, 0x30, 0x4d, 0x40, 0x43, 
-	0x10, 0x43, 0x20, 0x81, 0xd1, 0x8f, 0x41, 0x82, 
-	0x10, 0x9c, 0x20, 0x9b, 0xc1, 0xc2, 0x10, 0x82, 
-	0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, 
-	0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, 
-	0xe9, 0x48, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, 
-	0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, 
-	0x10, 0x86, 0x20, 0x42, 0x41, 0x0d, 0x11, 0x02, 
-	0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 
-	0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 
-	0xe9, 0x5e, 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 
-	0x22, 0x48, 0xd0, 0x78, 0x03, 0x50, 0xf9, 0x69, 
-	0xd0, 0x7c, 0x01, 0x9d, 0xf9, 0x69, 0xc2, 0x48, 
-	0xb2, 0x60, 0xc2, 0xca, 0xb2, 0xf0, 0x11, 0x82, 
-	0x41, 0x81, 0x22, 0x06, 0x11, 0x9f, 0x41, 0x81, 
-	0x22, 0x86, 0x0f, 0xc5, 0xc0, 0x84, 0x10, 0x8c, 
-	0x10, 0x92, 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 
-	0xc1, 0xdb, 0x11, 0xc1, 0x21, 0xc3, 0x20, 0x87, 
-	0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, 
-	0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, 
-	0x10, 0x97, 0x01, 0xd0, 0xe9, 0x46, 0xb0, 0x96, 
-	0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, 
-	0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, 
-	0xd0, 0x81, 0x41, 0x02, 0x11, 0x02, 0x20, 0x44, 
-	0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 
-	0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5d, 
-	0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 
-	0x11, 0x9f, 0x11, 0x83, 0x22, 0x06, 0x11, 0x9c, 
-	0x11, 0x83, 0x22, 0x86, 0x0f, 0xc5, 0xd0, 0x41, 
-	0x40, 0x44, 0x20, 0x55, 0x10, 0x62, 0xf9, 0x6f, 
-	0x01, 0x74, 0xd6, 0x00, 0xc2, 0x9f, 0xc2, 0x1f, 
-	0x22, 0x80, 0xe1, 0x30, 0x0f, 0x11, 0xf9, 0x51, 
-	0x90, 0x38, 0x80, 0x3f, 0x00, 0x1b, 0xf9, 0x51, 
-	0x00, 0x27, 0xd0, 0x04, 0x70, 0x40, 0x30, 0x71, 
-	0xf9, 0x51, 0xb0, 0x3c, 0x70, 0x40, 0x30, 0x5d, 
-	0xf9, 0x51, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x7f, 
-	0x60, 0x40, 0x10, 0x63, 0xe5, 0x5d, 0x02, 0x20, 
-	0xd0, 0x01, 0xa0, 0x37, 0x00, 0x26, 0xd0, 0x24, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x08, 
-	0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x00, 0x26, 
-	0xd0, 0x30, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 
-	0xb0, 0x30, 0xd0, 0x40, 0x60, 0x40, 0xb0, 0x3c, 
-	0x6c, 0x40, 0xb0, 0x3c, 0x67, 0x40, 0x00, 0x33, 
-	0xdf, 0x78, 0xe0, 0x36, 0x00, 0x26, 0xd0, 0x1c, 
-	0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x3c, 
-	0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x08, 0x20, 
-	0xdf, 0x00, 0x80, 0x35, 0xc0, 0x3c, 0x10, 0x08, 
-	0xa0, 0x0a, 0xa0, 0x27, 0xa0, 0x1b, 0xdf, 0x5c, 
-	0x01, 0xa0, 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 
-	0x80, 0x34, 0x80, 0x3f, 0x03, 0xba, 0xda, 0x1e, 
-	0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe7, 
-	0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x55, 0x1f, 0xa0, 
-	0xe9, 0x55, 0x03, 0xe9, 0xd0, 0x08, 0x00, 0x21, 
-	0xdf, 0x86, 0xe0, 0x3c, 0x89, 0x78, 0x89, 0x37, 
-	0x00, 0xee, 0xd0, 0x14, 0x76, 0x00, 0xd0, 0x30, 
-	0x76, 0x40, 0x26, 0x58, 0xd6, 0xd9, 0x00, 0xee, 
-	0xd0, 0x20, 0x75, 0x40, 0xd0, 0x1c, 0x71, 0x40, 
-	0xd0, 0x20, 0x71, 0x00, 0xd0, 0x24, 0x70, 0x80, 
-	0xc4, 0x02, 0xd0, 0x28, 0x70, 0xc0, 0x00, 0x21, 
-	0xd0, 0x10, 0x72, 0x00, 0x93, 0x90, 0xd4, 0x81, 
-	0x13, 0x96, 0x43, 0x92, 0x34, 0x8e, 0x00, 0x22, 
-	0xd1, 0xa4, 0x71, 0x86, 0xde, 0x40, 0x7e, 0x79, 
-	0xd0, 0x18, 0x70, 0x40, 0xb0, 0x41, 0xf5, 0x58, 
-	0xd3, 0x42, 0x50, 0x4d, 0x60, 0x40, 0x10, 0x60, 
-	0xe5, 0x62, 0xd0, 0x54, 0x70, 0x01, 0xb0, 0x3c, 
-	0x60, 0x01, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36, 
-	0x00, 0x22, 0xd0, 0x60, 0x71, 0xc1, 0xd0, 0x4f, 
-	0x41, 0xc1, 0x03, 0xef, 0xd0, 0x30, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x04, 0x21, 0xd0, 0x20, 
-	0xd3, 0x44, 0x72, 0x8d, 0x12, 0xa0, 0xe8, 0x36, 
-	0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf8, 0x36, 
-	0xb2, 0x3e, 0x60, 0x4d, 0x00, 0xed, 0xd0, 0x48, 
-	0x70, 0x01, 0xde, 0x45, 0x50, 0x39, 0x00, 0x1b, 
-	0xf9, 0x44, 0xb0, 0x01, 0x00, 0x1c, 0xf9, 0x47, 
-	0xb0, 0x04, 0x60, 0x01, 0xd0, 0x40, 0x62, 0x81, 
-	0xce, 0x4a, 0xd0, 0x43, 0x41, 0xc1, 0xd0, 0x58, 
-	0x61, 0xc1, 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 
-	0x70, 0x00, 0x10, 0x1f, 0x20, 0x40, 0xb1, 0xc1, 
-	0xf5, 0x54, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, 
-	0x00, 0xe6, 0xd0, 0x40, 0x70, 0x41, 0xd2, 0x94, 
-	0x60, 0x4a, 0x04, 0x2b, 0xd0, 0x10, 0x01, 0x90, 
-	0xf8, 0x36, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xc0, 0x47, 0x10, 0x5d, 
-	0x30, 0x4e, 0xf9, 0x41, 0x90, 0x43, 0x00, 0xe0, 
-	0xd0, 0x28, 0x70, 0x00, 0x20, 0x40, 0x00, 0x21, 
-	0xd0, 0x08, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x74, 
-	0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 0x00, 0xed, 
-	0xd0, 0x48, 0x70, 0x41, 0x00, 0x5e, 0xf9, 0x4b, 
-	0x00, 0x21, 0xd0, 0x00, 0x73, 0x80, 0xd4, 0x81, 
-	0x34, 0x8e, 0x00, 0x34, 0xd3, 0x48, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xd1, 0x88, 0xd1, 0xc8, 
-	0x01, 0x1b, 0xe9, 0x39, 0x11, 0x9f, 0x11, 0xdf, 
-	0xd4, 0x80, 0xd3, 0x81, 0xe1, 0x43, 0x00, 0xed, 
-	0xd0, 0x08, 0x70, 0x00, 0x00, 0x10, 0xf9, 0x37, 
-	0x0c, 0x1f, 0xf9, 0x36, 0x13, 0xa1, 0xe9, 0x43, 
-	0xbe, 0x7c, 0x00, 0x65, 0xd2, 0x46, 0x12, 0x48, 
-	0xc0, 0x39, 0x30, 0x18, 0xe5, 0x4b, 0xd2, 0x70, 
-	0x72, 0x49, 0x22, 0x79, 0x00, 0x21, 0xd0, 0x00, 
-	0x63, 0x80, 0x04, 0x24, 0xd0, 0x00, 0x02, 0x10, 
-	0xe9, 0x56, 0xd0, 0x41, 0x51, 0x41, 0xe0, 0x36, 
-	0x15, 0x61, 0xe8, 0x36, 0xd5, 0x80, 0xd3, 0x00, 
-	0xd3, 0x40, 0x04, 0x27, 0xd0, 0x20, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0x21, 0xd0, 0x18, 
-	0x73, 0x00, 0xb0, 0x04, 0x73, 0x80, 0xd2, 0x80, 
-	0xb0, 0x38, 0x72, 0xc0, 0x31, 0x0d, 0xc0, 0x0e, 
-	0x10, 0x0b, 0x10, 0x20, 0xe9, 0x42, 0xf5, 0x3f, 
-	0x22, 0x8d, 0x10, 0x01, 0x13, 0x5f, 0xe1, 0x3b, 
-	0x33, 0x8b, 0x15, 0x61, 0xf9, 0x49, 0x00, 0x21, 
-	0xd0, 0x64, 0x70, 0x41, 0x33, 0x81, 0x03, 0xd0, 
-	0xe9, 0x4c, 0x20, 0x0b, 0x13, 0xdf, 0x12, 0xc1, 
-	0x13, 0xe0, 0xf9, 0x49, 0x10, 0x03, 0xc0, 0x50, 
-	0x10, 0x4b, 0x13, 0x0b, 0x23, 0x00, 0x13, 0x20, 
-	0xe9, 0x5c, 0xf5, 0x59, 0x22, 0x81, 0x13, 0x01, 
-	0x10, 0x5f, 0xe1, 0x55, 0x12, 0x99, 0x12, 0x87, 
-	0x21, 0x0a, 0x00, 0xa0, 0xd2, 0x80, 0xc3, 0x0a, 
-	0x03, 0x90, 0xe9, 0x66, 0x22, 0x82, 0x23, 0x03, 
-	0x10, 0x81, 0x10, 0xc1, 0x13, 0x9f, 0x13, 0xa0, 
-	0xed, 0x62, 0xc0, 0x8a, 0xc0, 0xcc, 0x04, 0x26, 
-	0xd0, 0x00, 0xe0, 0x36, 0x15, 0x61, 0xf9, 0x3d, 
-	0x07, 0x32, 0xd0, 0x00, 0x30, 0x03, 0xed, 0x3d, 
-	0xc0, 0x03, 0x10, 0x1d, 0x30, 0xc0, 0xc0, 0x02, 
-	0x10, 0x1d, 0x30, 0x80, 0xe1, 0x32, 0x10, 0x94, 
-	0x10, 0xd4, 0x00, 0x21, 0xd0, 0x20, 0x73, 0x00, 
-	0xc5, 0x8c, 0xd3, 0x4e, 0x01, 0x1b, 0xe9, 0x48, 
-	0x13, 0x1f, 0xd3, 0x4f, 0x43, 0x4c, 0x13, 0x1c, 
-	0xc0, 0x0c, 0x10, 0x03, 0x20, 0x0c, 0xc0, 0x40, 
-	0x10, 0x42, 0x20, 0x40, 0x10, 0x46, 0x20, 0x4d, 
-	0x10, 0x42, 0x2e, 0x41, 0x10, 0x5c, 0x10, 0x43, 
-	0x00, 0x59, 0xe9, 0x5b, 0x01, 0x69, 0xd0, 0x20, 
-	0x30, 0x40, 0x22, 0x41, 0x04, 0x27, 0xd0, 0x20, 
-	0xe0, 0x36, 0x50, 0x00, 0x2c, 0x14, 0xd0, 0x34, 
-	0x63, 0x00, 0xd0, 0x38, 0x72, 0xc0, 0xc0, 0x51, 
-	0x10, 0x5c, 0x30, 0x4b, 0x10, 0x44, 0xd4, 0xc0, 
-	0xd5, 0x00, 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 
-	0xd4, 0xd0, 0xc5, 0x01, 0xd0, 0x18, 0x70, 0x00, 
-	0x0c, 0x1f, 0xe9, 0x48, 0x10, 0x20, 0xfd, 0x48, 
-	0xd4, 0xc0, 0xd5, 0x00, 0x10, 0x22, 0xe5, 0x4e, 
-	0xd4, 0xc0, 0xbc, 0x30, 0xd5, 0x00, 0xb5, 0x10, 
-	0xb0, 0x3f, 0xf9, 0x52, 0x3c, 0x01, 0x3c, 0x01, 
-	0x02, 0x1f, 0xe9, 0x5f, 0x00, 0xa8, 0xd3, 0xc0, 
-	0xd3, 0x9e, 0x00, 0xa9, 0xd0, 0x38, 0x70, 0x4f, 
-	0xb3, 0xfc, 0x60, 0x40, 0xb0, 0x3c, 0xb3, 0x81, 
-	0xed, 0x59, 0x00, 0x21, 0xd0, 0x28, 0x70, 0x00, 
-	0x10, 0x20, 0xf9, 0x69, 0x02, 0x1f, 0xf9, 0x6a, 
-	0x90, 0x10, 0x00, 0x1e, 0xe9, 0x6a, 0xb1, 0x7c, 
-	0x04, 0x29, 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x01, 0x5e, 0xf9, 0x35, 
-	0x01, 0x50, 0xe9, 0x35, 0xb1, 0x78, 0xd2, 0x00, 
-	0x01, 0x5c, 0xf9, 0x5f, 0xc0, 0x18, 0x30, 0x39, 
-	0xed, 0x5f, 0x11, 0x9f, 0xce, 0x58, 0xc2, 0x59, 
-	0x00, 0xa9, 0xd2, 0x38, 0x14, 0x82, 0x22, 0x12, 
-	0xc0, 0x0c, 0x10, 0x1f, 0x10, 0x03, 0x22, 0x00, 
-	0x70, 0x48, 0x03, 0x10, 0xe9, 0x4c, 0xb2, 0x38, 
-	0xbe, 0x60, 0xb2, 0x60, 0x2e, 0x41, 0x10, 0x5f, 
-	0x00, 0x59, 0xe9, 0x53, 0x01, 0x69, 0xd0, 0x3c, 
-	0x30, 0x40, 0x22, 0x41, 0x13, 0x41, 0x2e, 0x4d, 
-	0x13, 0x5d, 0x13, 0x43, 0x22, 0x4d, 0x14, 0xe0, 
-	0xe9, 0x5f, 0x33, 0x0b, 0x13, 0x04, 0x2c, 0x0c, 
-	0x35, 0x0c, 0xc3, 0x46, 0xc3, 0x87, 0x04, 0x61, 
-	0xd0, 0x28, 0x15, 0x62, 0xfc, 0x36, 0x04, 0x2f, 
-	0xd0, 0x28, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x74, 
-	0x74, 0x01, 0xb0, 0x7c, 0x74, 0x41, 0xb0, 0x7c, 
-	0x00, 0x27, 0xd0, 0x20, 0x30, 0x11, 0xf5, 0x3b, 
-	0x24, 0x40, 0x71, 0x41, 0xd1, 0x08, 0xc0, 0x10, 
-	0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x4a, 0x00, 0x23, 
-	0xd0, 0x30, 0x30, 0x11, 0xf9, 0x4a, 0xb1, 0x70, 
-	0x01, 0x50, 0xf9, 0x4a, 0xb1, 0x20, 0x14, 0x41, 
-	0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0, 0x01, 0x50, 
-	0xe9, 0x50, 0xc0, 0xd0, 0x00, 0x34, 0xdc, 0x00, 
-	0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c, 0x00, 0x21, 
-	0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05, 0x51, 0x40, 
-	0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20, 0x61, 0x00, 
-	0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28, 0x60, 0xc0, 
-	0x04, 0x2d, 0xd0, 0x08, 0x00, 0x22, 0xd0, 0x64, 
-	0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36, 0x50, 0x00, 
-	0x50, 0x00, 0x50, 0x00, 0x90, 0x50, 0xd0, 0x3c, 
-	0x10, 0x41, 0x60, 0x40, 0x15, 0x62, 0xfd, 0x3d, 
-	0xc0, 0x10, 0x10, 0x1e, 0x10, 0x07, 0x21, 0x00, 
-	0x10, 0x16, 0x34, 0x00, 0xc0, 0x90, 0xd3, 0x40, 
-	0x00, 0x24, 0xd3, 0xc0, 0x04, 0x22, 0xd0, 0x20, 
-	0x01, 0x9f, 0xe8, 0x36, 0xd0, 0x54, 0x70, 0x41, 
-	0x73, 0x41, 0x04, 0x2e, 0xd0, 0x00, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd3, 0x30, 
-	0x73, 0x0c, 0xd0, 0x0c, 0x70, 0x00, 0xc0, 0x40, 
-	0x13, 0x24, 0xf5, 0x42, 0x13, 0x22, 0xe9, 0x41, 
-	0xe5, 0x43, 0xd3, 0x00, 0x10, 0x22, 0xf9, 0x41, 
-	0xd0, 0x01, 0xd0, 0x43, 0xd3, 0x01, 0x21, 0x00, 
-	0xd3, 0x40, 0x03, 0x10, 0xf9, 0x47, 0xd3, 0x40, 
-	0xe1, 0x61, 0x00, 0x23, 0xd0, 0x00, 0x10, 0x61, 
-	0xe9, 0x50, 0xb0, 0x33, 0x10, 0x63, 0xe9, 0x50, 
-	0x00, 0x22, 0xd0, 0x1a, 0xc3, 0xc0, 0xd2, 0xc0, 
-	0x00, 0x10, 0xe9, 0x55, 0x22, 0xd0, 0x10, 0x1f, 
-	0x14, 0x01, 0x10, 0x20, 0xed, 0x52, 0x14, 0x18, 
-	0x12, 0xd8, 0xc0, 0x8b, 0x32, 0xd0, 0x12, 0xc3, 
-	0x33, 0x4b, 0x13, 0x47, 0x21, 0x0d, 0x04, 0x22, 
-	0xd0, 0x20, 0xe0, 0x36, 0x00, 0x24, 0xd0, 0x30, 
-	0xd0, 0x40, 0x60, 0x40, 0xd3, 0xc7, 0x43, 0xc4, 
-	0x31, 0x0f, 0xd5, 0xd4, 0x25, 0xcf, 0x15, 0xc4, 
-	0x10, 0xdf, 0xc2, 0xc6, 0xc3, 0x07, 0x11, 0x81, 
-	0xb1, 0x3b, 0x15, 0x64, 0xe9, 0x47, 0x10, 0xdf, 
-	0x12, 0xc1, 0x11, 0x81, 0x11, 0xc1, 0xb1, 0x3f, 
-	0xb5, 0xf8, 0x90, 0x10, 0x00, 0x16, 0xf9, 0x5e, 
-	0xb5, 0xfc, 0xd0, 0x20, 0x40, 0x39, 0x2e, 0x4b, 
-	0x22, 0x4c, 0x12, 0x20, 0xe9, 0x59, 0x20, 0x39, 
-	0x00, 0x1b, 0xe9, 0x59, 0x2c, 0x13, 0x35, 0x13, 
-	0x0e, 0x5a, 0xf9, 0x59, 0xb2, 0x38, 0x02, 0xe3, 
-	0xd0, 0x00, 0x0e, 0x5a, 0xe9, 0x5e, 0x2e, 0x40, 
-	0x01, 0xee, 0xd2, 0x80, 0x42, 0x84, 0xc0, 0x03, 
-	0x30, 0x02, 0xf5, 0x6b, 0x31, 0x0a, 0x12, 0x98, 
-	0x20, 0x03, 0xf5, 0x69, 0x12, 0x9f, 0x12, 0x87, 
-	0x51, 0x0a, 0x00, 0x34, 0xd4, 0xc8, 0xe0, 0x36, 
-	0x50, 0x00, 0x50, 0x00, 0xd3, 0xc7, 0x43, 0xc4, 
-	0x15, 0x61, 0xf9, 0x48, 0x10, 0xc1, 0xd5, 0xe0, 
-	0xd1, 0x80, 0xd1, 0xc0, 0x31, 0x0f, 0x13, 0xe1, 
-	0xe9, 0x3c, 0xd3, 0xc0, 0x00, 0x24, 0xd0, 0x30, 
-	0x63, 0xc0, 0x25, 0xcf, 0x15, 0xc2, 0xd0, 0x03, 
-	0x40, 0x16, 0x25, 0xc0, 0x15, 0xc2, 0x15, 0x81, 
-	0x35, 0x91, 0xe1, 0x5c, 0x00, 0x24, 0xd0, 0x30, 
-	0x63, 0xc0, 0x01, 0x50, 0xe9, 0x54, 0x15, 0xa0, 
-	0xf9, 0x55, 0x00, 0x24, 0xd0, 0x34, 0x70, 0x00, 
-	0x10, 0x20, 0xe9, 0x55, 0xd3, 0xc0, 0x31, 0x0f, 
-	0xd5, 0xfc, 0x25, 0xcf, 0x15, 0xc3, 0x14, 0xa0, 
-	0xe9, 0x5c, 0xb5, 0xfc, 0x00, 0x34, 0xd4, 0xc8, 
-	0xe0, 0x36, 0x50, 0x00, 0xc4, 0x91, 0x34, 0x96, 
-	0xed, 0x34, 0xd4, 0x80, 0x14, 0x84, 0xb3, 0xc1, 
-	0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5e, 0x34, 0x81, 
-	0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5c, 
-	0x24, 0x81, 0xb3, 0xc1, 0xe5, 0x37, 0x02, 0x68, 
-	0xd0, 0x00, 0xb4, 0xb0, 0x14, 0x9b, 0x00, 0x23, 
-	0xd0, 0x70, 0x30, 0x52, 0xed, 0x4a, 0x24, 0x81, 
-	0x20, 0x12, 0xa0, 0x1c, 0x10, 0x8a, 0x50, 0x83, 
-	0xa0, 0x96, 0xa1, 0x50, 0xa1, 0x11, 0xc0, 0x52, 
-	0xd4, 0x84, 0x10, 0x6c, 0xed, 0x56, 0xd4, 0x81, 
-	0xd1, 0x00, 0xb1, 0x13, 0x00, 0x23, 0xd1, 0x40, 
-	0xc2, 0xb9, 0x22, 0x86, 0x12, 0x20, 0xf9, 0x66, 
-	0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x63, 
-	0x22, 0x81, 0x02, 0x5a, 0xe9, 0x66, 0x22, 0x41, 
-	0x75, 0xd7, 0xc3, 0xd7, 0xd0, 0xd7, 0x00, 0x21, 
-	0xd0, 0xb6, 0x8b, 0x38, 0x00, 0x33, 0xdc, 0xd0, 
-	0xe0, 0x36, 0x50, 0x00, 0xd0, 0x7c, 0x60, 0x01, 
-	0xae, 0x52, 0xd0, 0x60, 0x40, 0x79, 0x00, 0x13, 
-	0xe8, 0xc9, 0xa2, 0x94, 0x22, 0x86, 0x13, 0xe0, 
-	0xe4, 0xd0, 0x13, 0xc1, 0x15, 0x62, 0xfc, 0xd1, 
-	0x13, 0xc1, 0xe0, 0xd1, 0xc3, 0xd7, 0x03, 0xd9, 
-	0xe8, 0xd4, 0x22, 0x8d, 0x15, 0x62, 0xfc, 0xda, 
-	0x03, 0xda, 0xe8, 0xda, 0x22, 0x8d, 0x22, 0x8d, 
-	0xce, 0x4a, 0x22, 0x86, 0x00, 0x14, 0xe8, 0xe0, 
-	0xa2, 0x53, 0x22, 0x47, 0x03, 0xd1, 0xe8, 0xe8, 
-	0x22, 0x4e, 0x15, 0x62, 0xfc, 0xe8, 0x03, 0xd2, 
-	0xe8, 0xe8, 0x22, 0x4e, 0x12, 0x20, 0xe9, 0x09, 
-	0x20, 0x79, 0x00, 0x5b, 0xe8, 0xf4, 0x15, 0x20, 
-	0xfc, 0xf1, 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5b, 
-	0xe8, 0xf4, 0xb2, 0x38, 0x02, 0x9a, 0xe8, 0xfb, 
-	0x70, 0x08, 0xd0, 0x7c, 0x42, 0x81, 0x22, 0x98, 
-	0x22, 0x80, 0x02, 0x5a, 0xe9, 0x11, 0x70, 0x08, 
-	0xd0, 0x78, 0x42, 0x41, 0x22, 0x59, 0x10, 0x1f, 
-	0x22, 0x40, 0x00, 0x19, 0xe9, 0x11, 0x01, 0x69, 
-	0xd0, 0x7c, 0x32, 0x41, 0xe1, 0x11, 0x02, 0xe3, 
-	0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x0e, 0x22, 0x81, 
-	0x02, 0x5a, 0xe9, 0x11, 0x22, 0x41, 0x0e, 0x5a, 
-	0xe9, 0x15, 0xce, 0x4a, 0x3e, 0x46, 0x0f, 0x87, 
-	0xdd, 0x48, 0xe1, 0x19, 0xdd, 0x40, 0xdc, 0xc8, 
-	0xdd, 0x3c, 0x7d, 0x34, 0x1d, 0x19, 0x3d, 0x35, 
-	0x4d, 0x33, 0x4c, 0xec, 0x3d, 0x33, 0xf9, 0x17, 
-	0x0f, 0xc5, 0x50, 0x00, 0xd0, 0x39, 0xd0, 0x35, 
-	0xd0, 0x1d, 0xd0, 0x2d, 0xd0, 0x3f, 0xd0, 0x2e, 
-	0xd0, 0x3c, 0xd0, 0x37, 0xd0, 0x38, 0xd0, 0x19, 
-	0xd0, 0x33, 0xd0, 0x2e, 0xd0, 0x3d, 0xd0, 0x3e, 
-	0xd0, 0x27, 0xd0, 0x3e, 0xd0, 0x3a, 0xd0, 0x2f, 
-	0xd0, 0x32, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0, 
-	0xe1, 0x01, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe5, 0x9f, 0x20, 0x6c, 0xe0, 0x21, 0x10, 0x01, 
-	0xe1, 0x02, 0x00, 0x91, 0xe3, 0x50, 0x00, 0x00, 
-	0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x00, 
-	0xeb, 0x00, 0x38, 0x99, 0xea, 0xff, 0xff, 0xf7, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xb5, 0x00, 0x4a, 0x12, 0x68, 0x10, 0x28, 0x00, 
-	0xd1, 0x03, 0x20, 0x00, 0xf7, 0xf1, 0xff, 0xc6, 
-	0xe7, 0xf7, 0xbd, 0x00, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x2c, 
-	0xe3, 0xa0, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91, 
-	0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, 
-	0xe3, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x38, 0x88, 
-	0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x10, 0x48, 0x02, 0x40, 0x49, 
-	0x60, 0x01, 0x47, 0x70, 0x70, 0x00, 0x00, 0x34, 
-	0x2e, 0x08, 0x1f, 0xa8, 0x47, 0x78, 0x46, 0xc0, 
-	0xe1, 0xa0, 0x09, 0x00, 0xe1, 0xb0, 0x10, 0x01, 
-	0x03, 0xc0, 0x01, 0x02, 0x13, 0x80, 0x01, 0x02, 
-	0xe3, 0xa0, 0x13, 0x3f, 0xe3, 0xa0, 0x30, 0x0e, 
-	0xe1, 0xb0, 0x10, 0x81, 0x3a, 0x00, 0x00, 0x04, 
-	0xe1, 0xb0, 0x00, 0x80, 0x32, 0x21, 0x13, 0x03, 
-	0xe2, 0x53, 0x30, 0x01, 0x1a, 0xff, 0xff, 0xf9, 
-	0xea, 0x00, 0x00, 0x03, 0xe1, 0xb0, 0x00, 0x80, 
-	0x22, 0x21, 0x13, 0x03, 0xe2, 0x53, 0x30, 0x01, 
-	0x1a, 0xff, 0xff, 0xf4, 0xe1, 0xa0, 0x0d, 0x21, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x41, 0xf0, 
-	0xe2, 0x4d, 0xd0, 0x14, 0xe3, 0xa0, 0xc0, 0x44, 
-	0xe2, 0x8c, 0xc4, 0x66, 0xe5, 0x9c, 0xc0, 0x00, 
-	0xe5, 0x9f, 0x01, 0x94, 0xe5, 0x80, 0xc0, 0x00, 
-	0xe1, 0xa0, 0xc1, 0x4c, 0xe2, 0x0c, 0xc0, 0x03, 
-	0xe5, 0x9f, 0x01, 0x88, 0xe5, 0xc0, 0xc0, 0x00, 
-	0xe5, 0x9f, 0x01, 0x84, 0xe5, 0x90, 0x00, 0x00, 
-	0xe0, 0x80, 0x64, 0x0c, 0xe1, 0xa0, 0x70, 0x06, 
-	0xe8, 0xb7, 0x00, 0x01, 0xe2, 0x00, 0x40, 0x1f, 
-	0xe2, 0x8f, 0x2f, 0x69, 0xe7, 0x92, 0x21, 0x04, 
-	0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x51, 
-	0xe5, 0x9f, 0x32, 0x1c, 0xe2, 0x83, 0x50, 0xbc, 
-	0xe5, 0x9f, 0x12, 0x1c, 0xe1, 0x55, 0x00, 0x01, 
-	0x03, 0xa0, 0x50, 0x00, 0xe5, 0x9f, 0x12, 0x04, 
-	0xe1, 0x51, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x45, 
-	0xe5, 0x9f, 0x81, 0xf4, 0xe0, 0x88, 0x80, 0x03, 
-	0xe5, 0x9f, 0x11, 0x5c, 0xe1, 0xa0, 0x36, 0x20, 
-	0xe2, 0x03, 0x30, 0x0f, 0xe1, 0x81, 0x10, 0x03, 
-	0xe5, 0x9f, 0x21, 0x48, 0xe7, 0x92, 0x31, 0x04, 
-	0xe1, 0xa0, 0x39, 0x83, 0xe1, 0xa0, 0x35, 0xa3, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x33, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x03, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x35, 0x20, 
-	0xe2, 0x03, 0x30, 0x03, 0xe1, 0xa0, 0x32, 0x03, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x3a, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x83, 
-	0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x34, 0xa0, 
-	0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3a, 0x83, 
-	0xe1, 0x81, 0x10, 0x03, 0xe2, 0x00, 0x30, 0x60, 
-	0xe1, 0xa0, 0x30, 0x83, 0xe1, 0x81, 0x10, 0x03, 
-	0xe8, 0xa8, 0x00, 0x02, 0xe5, 0x9f, 0x00, 0xf0, 
-	0xe3, 0xa0, 0x10, 0x30, 0xe5, 0x80, 0x10, 0x00, 
-	0xe5, 0x9f, 0x00, 0x9c, 0xe5, 0xd0, 0x40, 0x00, 
-	0xe2, 0x84, 0x10, 0x01, 0xe5, 0xc0, 0x10, 0x00, 
-	0xe2, 0x04, 0x40, 0x00, 0xe5, 0x9f, 0x00, 0x98, 
-	0xe5, 0x90, 0x10, 0x00, 0xe3, 0x11, 0x00, 0x10, 
-	0x1a, 0x00, 0x00, 0x1a, 0xe5, 0x80, 0x10, 0x00, 
-	0xe5, 0x8f, 0x51, 0x4c, 0xe1, 0xa0, 0x22, 0x04, 
-	0xe1, 0x82, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0xac, 
-	0xe0, 0x80, 0x02, 0x01, 0xe5, 0x80, 0x70, 0x00, 
-	0xe5, 0x80, 0x80, 0x04, 0xe5, 0x9f, 0x10, 0x5c, 
-	0xe5, 0x80, 0x10, 0x08, 0xe5, 0x9f, 0x10, 0x58, 
-	0xe5, 0x80, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0x58, 
-	0xe5, 0x90, 0x10, 0x00, 0xe0, 0x84, 0x00, 0x01, 
-	0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x00, 0x12, 
-	0xe3, 0xa0, 0x10, 0x40, 0xe2, 0x81, 0x14, 0x66, 
-	0xe5, 0x81, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x01, 
-	0xe1, 0xa0, 0x0c, 0x11, 0xe3, 0xa0, 0x10, 0xb8, 
-	0xe2, 0x81, 0x14, 0x66, 0xe5, 0x81, 0x00, 0x00, 
-	0xe2, 0x8d, 0xd0, 0x14, 0xe8, 0xbd, 0x81, 0xf0, 
-	0xe5, 0x9f, 0x10, 0xf0, 0xe2, 0x81, 0x10, 0x01, 
-	0xe5, 0x8f, 0x10, 0xe8, 0xea, 0xff, 0xff, 0xf4, 
-	0xe5, 0x9f, 0xf0, 0x08, 0xa0, 0x00, 0x05, 0xc4, 
-	0x80, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x06, 0xf4, 0xa0, 0x00, 0x04, 0x28, 
-	0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x05, 0x50, 
-	0x2c, 0x00, 0x1f, 0xe8, 0x2c, 0x00, 0x1f, 0xea, 
-	0x2c, 0x00, 0x1f, 0xf4, 0x00, 0x00, 0x05, 0xe0, 
-	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x12, 
-	0x2c, 0x00, 0x02, 0x00, 0x64, 0x00, 0x04, 0x00, 
-	0x64, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x00, 
-	0x9e, 0x00, 0x00, 0xc0, 0x66, 0x00, 0x00, 0x50, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x07, 
-	0xe1, 0xb0, 0xf0, 0x0e, 0xe5, 0x9f, 0xf1, 0x00, 
-	0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08, 
-	0xea, 0x00, 0x00, 0x02, 0xe5, 0x9f, 0xf0, 0xec, 
-	0xe2, 0x5e, 0xf0, 0x04, 0x2c, 0x00, 0x00, 0xe8, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, 
-	0xe3, 0x80, 0x00, 0x1b, 0xe1, 0x29, 0xf0, 0x00, 
-	0xe5, 0x9f, 0xd0, 0xd8, 0xe5, 0x9f, 0x00, 0xd8, 
-	0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x13, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xc4, 
-	0xe5, 0x9f, 0x00, 0xc4, 0xe0, 0x8d, 0xd0, 0x00, 
-	0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, 
-	0xe3, 0x80, 0x00, 0x12, 0xe1, 0x29, 0xf0, 0x00, 
-	0xe5, 0x9f, 0xd0, 0xb0, 0xe5, 0x9f, 0x00, 0xb0, 
-	0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, 
-	0xe3, 0xc0, 0x00, 0x9f, 0xe3, 0x80, 0x00, 0x10, 
-	0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0x60, 
-	0xeb, 0x00, 0x00, 0x08, 0xe5, 0x9f, 0x00, 0x64, 
-	0xe5, 0x9f, 0x10, 0x5c, 0xeb, 0x00, 0x37, 0xa7, 
-	0xe5, 0x9f, 0x00, 0x60, 0xe5, 0x9f, 0x10, 0x58, 
-	0xeb, 0x00, 0x37, 0xa7, 0xe5, 0x9f, 0xe0, 0x58, 
-	0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe5, 0x9f, 0x00, 0x8c, 0xe5, 0x9f, 0x10, 0x8c, 
-	0xe5, 0x9f, 0x30, 0x8c, 0xe1, 0x50, 0x00, 0x01, 
-	0x0a, 0x00, 0x00, 0x03, 0xe1, 0x51, 0x00, 0x03, 
-	0x34, 0x90, 0x20, 0x04, 0x34, 0x81, 0x20, 0x04, 
-	0x3a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0x10, 0x74, 
-	0xe3, 0xa0, 0x20, 0x00, 0xe1, 0x53, 0x00, 0x01, 
-	0x34, 0x83, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfc, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x1b, 0xff, 0xf0, 
-	0x2e, 0x1b, 0x7f, 0xf0, 0x2e, 0x1b, 0x7f, 0xef, 
-	0x2e, 0x08, 0x9a, 0x00, 0xcc, 0x1f, 0xff, 0xef, 
-	0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1c, 0x39, 
-	0x2e, 0x01, 0xca, 0x48, 0x2e, 0x01, 0xcb, 0x40, 
-	0x2e, 0x08, 0x32, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x22, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x2a, 0xf4, 0x00, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0x59, 0xb0, 0xe5, 0x9f, 0xf0, 0x04, 
-	0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, 
-	0x2e, 0x08, 0x59, 0xb0, 0x2e, 0x08, 0x59, 0xb1, 
-	0x2e, 0x08, 0x59, 0xb2, 0x2e, 0x03, 0x3b, 0xfc, 
-	0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x70, 
-	0x2e, 0x08, 0x99, 0xfc, 0x1d, 0x77, 0x1e, 0x16, 
-	0x03, 0x00, 0x03, 0x03, 0x1d, 0x7f, 0x50, 0x50, 
-	0x4f, 0x5d, 0x49, 0x5d, 0x40, 0x4a, 0x44, 0x43, 
-	0x01, 0x49, 0x4d, 0x56, 0x48, 0x4b, 0x5d, 0x4f, 
-	0x5d, 0x4d, 0x4f, 0x0a, 0x78, 0x71, 0x73, 0x7f, 
-	0x70, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1b, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 
-	0x08, 0x0f, 0x0f, 0x0d, 0x13, 0x0d, 0x11, 0x0e, 
-	0x07, 0x08, 0x09, 0x0d, 0x0d, 0x15, 0x10, 0x05, 
-	0x08, 0x08, 0x09, 0x0e, 0x07, 0x08, 0x07, 0x07, 
-	0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 
-	0x0d, 0x0d, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0d, 
-	0x18, 0x0f, 0x10, 0x11, 0x11, 0x10, 0x0f, 0x13, 
-	0x11, 0x06, 0x0c, 0x10, 0x0d, 0x13, 0x11, 0x13, 
-	0x10, 0x13, 0x11, 0x10, 0x0e, 0x11, 0x0f, 0x17, 
-	0x0f, 0x10, 0x0f, 0x07, 0x07, 0x07, 0x0c, 0x0d, 
-	0x08, 0x0d, 0x0e, 0x0c, 0x0e, 0x0d, 0x07, 0x0e, 
-	0x0e, 0x05, 0x06, 0x0c, 0x06, 0x14, 0x0e, 0x0d, 
-	0x0e, 0x0e, 0x08, 0x0c, 0x07, 0x0e, 0x0b, 0x11, 
-	0x0b, 0x0c, 0x0c, 0x08, 0x06, 0x08, 0x0e, 0x12, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x30, 0x01, 0x80, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0xf0, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x30, 0x01, 0x80, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x0e, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x37, 0x1c, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x1c, 0x1c, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x33, 0xf8, 0x00, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x31, 0xf0, 0x00, 0x00, 
-	0xc0, 0x06, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x33, 0x07, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x7a, 0xf0, 0x00, 0x00, 0x61, 0x86, 0x00, 0x00, 
-	0x1c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x62, 0x30, 0x00, 0x00, 0x61, 0x8e, 0x00, 0x00, 
-	0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x62, 0x00, 0x00, 0x00, 0x61, 0x8c, 0x00, 0x00, 
-	0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x66, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x72, 0x00, 0x00, 0x00, 0x61, 0x9c, 0x00, 0x00, 
-	0x0c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x7a, 0x00, 0x00, 0x00, 0x61, 0xb8, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x73, 0xc0, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 
-	0x02, 0xe0, 0x00, 0x00, 0x00, 0x66, 0x60, 0x00, 
-	0x39, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x02, 0x70, 0x00, 0x00, 0x00, 0xec, 0x30, 0x00, 
-	0x70, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x02, 0x30, 0x00, 0x00, 0x00, 0xcc, 0x30, 0x00, 
-	0x60, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x62, 0x30, 0x00, 0x00, 0x01, 0xcc, 0x30, 0x00, 
-	0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 
-	0x72, 0x70, 0x00, 0x00, 0x01, 0x8c, 0x30, 0x00, 
-	0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x3a, 0xf0, 0x00, 0x00, 0x03, 0x8c, 0x30, 0x00, 
-	0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x03, 0x06, 0x60, 0x00, 
-	0x3f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x07, 0x03, 0xc0, 0x00, 
-	0x0f, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x70, 0x60, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x0e, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x0c, 0xc0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x67, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x60, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x1c, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x38, 0xc0, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, 
-	0x78, 0xe0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x30, 0xe0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x70, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x70, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x38, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x0f, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x38, 0x06, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x03, 0xff, 0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x38, 0x06, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x07, 0xc1, 0xe0, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x3c, 0x06, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x0e, 0x00, 0x70, 0x00, 0x06, 0xc0, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x3e, 0x06, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x1c, 0x79, 0xb8, 0x00, 0x0e, 0xe0, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x36, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x39, 0xff, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x30, 0x0c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x37, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x31, 0xcf, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x37, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00, 
-	0x33, 0x06, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x33, 0x87, 0x0c, 0x00, 0x1c, 0x70, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x37, 0x1d, 0x80, 0x00, 
-	0x31, 0x86, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x77, 0x03, 0x0c, 0x00, 0x18, 0x30, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x31, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x67, 0x03, 0x0c, 0x00, 0x38, 0x38, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x3d, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x30, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x66, 0x03, 0x0c, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00, 
-	0x30, 0x66, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x66, 0x07, 0x1c, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00, 
-	0x30, 0x76, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x66, 0x06, 0x18, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00, 
-	0x30, 0x36, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x67, 0x0e, 0x38, 0x00, 0x60, 0x0c, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00, 
-	0x30, 0x3e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x77, 0x1e, 0x70, 0x00, 0x60, 0x0c, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x73, 0xff, 0xe0, 0x00, 0xe0, 0x0e, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x39, 0xe7, 0xc0, 0x00, 0xc0, 0x06, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0xc0, 0x06, 0x00, 0x00, 0xc0, 0x38, 0x06, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0xc0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x60, 0x0c, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x60, 0x6c, 0x0c, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x60, 0xec, 0x0c, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x30, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, 
-	0x06, 0xc0, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0xc6, 0x1c, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x30, 0xc6, 0x18, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x18, 0x30, 0x00, 0x00, 0x31, 0xc7, 0x18, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0xe0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x31, 0x83, 0x18, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 
-	0x30, 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0c, 0x60, 0x00, 0x00, 0x39, 0x83, 0x38, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x30, 0x38, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x83, 0xb0, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x31, 0x80, 0x00, 
-	0x30, 0x38, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 
-	0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x01, 0xb0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x3f, 0x80, 0x00, 
-	0x30, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1e, 0x1f, 0x00, 0x00, 
-	0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 
-	0x30, 0x0e, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 
-	0x30, 0x07, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00, 
-	0xe0, 0x0e, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0xb0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x37, 0xcf, 0x80, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0xdf, 0x80, 0x00, 
-	0x37, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3c, 0xf9, 0xc0, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0xc0, 0x00, 
-	0x38, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x0f, 0x30, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00, 
-	0x30, 0x30, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x37, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x37, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xc0, 0x60, 0x00, 0x00, 0xc0, 0x81, 0x80, 0x00, 
-	0xe0, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xc0, 0x60, 0x00, 0x00, 0xc1, 0xc1, 0x80, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0xe0, 0xe0, 0x00, 0x00, 0xe1, 0xc1, 0x80, 0x00, 
-	0x31, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x63, 0xe3, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3e, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x63, 0x63, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x7f, 0x98, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x67, 0x63, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x67, 0xf8, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x37, 0x76, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x41, 0xf0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 
-	0x1b, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 
-	0x3b, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x31, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x37, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3e, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 
-	0x60, 0xc0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 
-	0x33, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 
-	0xe0, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0x00, 0x21, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 
-	0x16, 0x16, 0x16, 0x16, 0x0a, 0x12, 0x13, 0x10, 
-	0x17, 0x10, 0x15, 0x10, 0x08, 0x09, 0x0a, 0x10, 
-	0x10, 0x1a, 0x13, 0x06, 0x0a, 0x0a, 0x0b, 0x11, 
-	0x08, 0x0a, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 
-	0x11, 0x11, 0x11, 0x10, 0x1d, 0x13, 0x13, 0x15, 
-	0x15, 0x13, 0x12, 0x17, 0x15, 0x07, 0x0f, 0x13, 
-	0x10, 0x17, 0x15, 0x17, 0x13, 0x17, 0x15, 0x13, 
-	0x13, 0x15, 0x13, 0x1e, 0x13, 0x13, 0x12, 0x08, 
-	0x08, 0x08, 0x0e, 0x10, 0x0a, 0x10, 0x10, 0x0f, 
-	0x10, 0x10, 0x08, 0x10, 0x10, 0x07, 0x07, 0x0e, 
-	0x07, 0x19, 0x10, 0x10, 0x10, 0x10, 0x0a, 0x0f, 
-	0x08, 0x10, 0x0d, 0x15, 0x0d, 0x0d, 0x0e, 0x0a, 
-	0x08, 0x0a, 0x11, 0x16, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x1c, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x0c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x07, 0xbc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x70, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x3e, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0xfc, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x1f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x3f, 0x9c, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x1e, 0x00, 0xf8, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x39, 0xc3, 0x80, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x39, 0xe7, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xff, 0x00, 0x00, 0xe0, 0x01, 0xe0, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x7c, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 
-	0x1f, 0x8e, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x60, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xc0, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0f, 0x3c, 0x00, 0x00, 0x3d, 0xb8, 0x00, 0x00, 
-	0x38, 0xe0, 0xc0, 0x00, 0x0f, 0x78, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x76, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x79, 0xbc, 0x00, 0x00, 
-	0x30, 0x61, 0xc0, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0x0e, 0x38, 0x00, 0x00, 0x71, 0x9c, 0x00, 0x00, 
-	0x30, 0x61, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x71, 0x80, 0x00, 0x00, 
-	0x30, 0x63, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x79, 0x80, 0x00, 0x00, 
-	0x30, 0x63, 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x7d, 0x80, 0x00, 0x00, 
-	0x30, 0x67, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x78, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x38, 0xe6, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x1f, 0xce, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x0f, 0x8c, 0x7c, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x70, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 
-	0x00, 0x1c, 0xfe, 0x00, 0x3e, 0xe2, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0xf0, 0x00, 0x00, 0x01, 0xbe, 0x00, 0x00, 
-	0x00, 0x19, 0xc7, 0x00, 0x38, 0x73, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x01, 0x9e, 0x00, 0x00, 
-	0x00, 0x39, 0x83, 0x00, 0x78, 0x3f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 
-	0x00, 0x31, 0x83, 0x00, 0x70, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00, 
-	0x00, 0x71, 0x83, 0x00, 0x70, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00, 
-	0x00, 0x61, 0x83, 0x00, 0x70, 0x0f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x79, 0x9e, 0x00, 0x00, 
-	0x00, 0xe1, 0x83, 0x00, 0x78, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x79, 0xe0, 0x00, 0x00, 0x3d, 0xbc, 0x00, 0x00, 
-	0x00, 0xc1, 0xc7, 0x00, 0x3c, 0x7f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x01, 0xc0, 0xfe, 0x00, 0x1f, 0xfb, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x71, 0xc0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 
-	0x01, 0x80, 0x7c, 0x00, 0x0f, 0xe1, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 
-	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x00, 0x60, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 
-	0x7c, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x78, 0x0e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x1e, 0xe0, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x1c, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x10, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 
-	0x7b, 0xe0, 0x00, 0x00, 0x73, 0xf0, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x00, 
-	0x7f, 0xf8, 0x00, 0x00, 0x77, 0xf8, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 
-	0x7f, 0xfc, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x3c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0xf0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x01, 0xe0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x1f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x0f, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00, 
-	0x01, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x07, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x03, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7e, 0x00, 0xfc, 0x00, 0x3e, 0x00, 0xe0, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x03, 0xf8, 0x3f, 0x80, 
-	0x03, 0xb8, 0x00, 0x00, 0x38, 0x0f, 0x80, 0x00, 
-	0x1f, 0x83, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7e, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x07, 0xc0, 0x07, 0xc0, 
-	0x07, 0xbc, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7f, 0x01, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00, 
-	0x3e, 0x00, 0xf8, 0x00, 0x07, 0x80, 0x03, 0xe0, 
-	0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x01, 0xdc, 0x00, 0x3b, 0x80, 0xe0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x0f, 0x0f, 0x1d, 0xe0, 
-	0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x00, 0x70, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x30, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x01, 0xdc, 0x00, 0x3b, 0xc0, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x1e, 0x3f, 0xbc, 0xf0, 
-	0x0f, 0x1e, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x77, 0x83, 0xdc, 0x00, 0x39, 0xc0, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x1e, 0x7f, 0xfc, 0xf0, 
-	0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x1c, 0xf9, 0xf8, 0x70, 
-	0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3b, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3c, 0xf0, 0xf8, 0x70, 
-	0x1e, 0x0f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x3f, 0xff, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x73, 0xc7, 0x9c, 0x00, 0x38, 0x70, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70, 
-	0x1c, 0x07, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70, 
-	0x1f, 0xff, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3e, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x39, 0xc0, 0x70, 0x70, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0x60, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x71, 0xef, 0x1c, 0x00, 0x38, 0x1c, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xf0, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x38, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xee, 0x1c, 0x00, 0x38, 0x1e, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xe0, 
-	0x38, 0x03, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xee, 0x1c, 0x00, 0x38, 0x0e, 0xe0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x39, 0xe1, 0xe1, 0xc0, 
-	0x78, 0x03, 0xc0, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 
-	0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0xfe, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00, 
-	0x1e, 0x00, 0xf8, 0x00, 0x3d, 0xe3, 0xe3, 0xc0, 
-	0x70, 0x01, 0xc0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x1f, 0x87, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x81, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x7c, 0xf8, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x3c, 0xff, 0xe7, 0x80, 
-	0x70, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x38, 0x07, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x1e, 0xfe, 0xff, 0x00, 
-	0xe0, 0x01, 0xe0, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 
-	0x38, 0x03, 0xc0, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x7c, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x03, 0xff, 0xc0, 0x00, 0x1e, 0x3c, 0x7c, 0x78, 
-	0xe0, 0x00, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 
-	0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x38, 0x01, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x38, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x01, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x0f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x01, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00, 
-	0xe0, 0x0f, 0x80, 0x38, 0x78, 0x03, 0xc0, 0x00, 
-	0xf0, 0x01, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x07, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0xf0, 0x01, 0xe0, 0x00, 
-	0xf0, 0x0f, 0x80, 0x78, 0x3c, 0x07, 0x80, 0x00, 
-	0x70, 0x03, 0xc0, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x0f, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0xf0, 0x1f, 0xc0, 0x78, 0x1c, 0x07, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x1f, 0x83, 0xf0, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00, 
-	0x70, 0x1f, 0xc0, 0x70, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x1e, 0x00, 0xf8, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x70, 0x1d, 0xc0, 0x70, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x1d, 0xc0, 0xf0, 0x07, 0xbc, 0x00, 0x00, 
-	0x0e, 0x0e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x38, 0x00, 0x3c, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x78, 0x3d, 0xe0, 0xf0, 0x07, 0xbc, 0x00, 0x00, 
-	0x0f, 0x1e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x3c, 0x07, 0x80, 0x00, 
-	0x38, 0x38, 0xe0, 0xe0, 0x03, 0xf8, 0x00, 0x00, 
-	0x07, 0x1c, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00, 
-	0x1f, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00, 
-	0x38, 0x38, 0xe0, 0xe0, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xbc, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0xc0, 0x00, 
-	0x0f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x38, 0xe1, 0xe0, 0x00, 0xe0, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x80, 0x00, 
-	0x03, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00, 
-	0x3c, 0x78, 0xf1, 0xe0, 0x01, 0xf0, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x00, 0x00, 
-	0x00, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x0e, 0x0e, 0x00, 0x00, 
-	0x1c, 0x70, 0x71, 0xc0, 0x01, 0xf0, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x70, 0x00, 0x1c, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x0f, 0x1e, 0x00, 0x00, 
-	0x1c, 0x70, 0x71, 0xc0, 0x03, 0xb8, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x00, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x1e, 0x70, 0x73, 0xc0, 0x07, 0xbc, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x08, 0x38, 0x00, 0x38, 0x0f, 0x00, 0x00, 
-	0x70, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00, 
-	0x1e, 0xf0, 0x7b, 0xc0, 0x0f, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x0e, 0x78, 0x00, 0x38, 0x07, 0x80, 0x00, 
-	0x78, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x3c, 0x01, 0xe0, 0x00, 0x07, 0xbc, 0x00, 0x00, 
-	0x0e, 0xe0, 0x3b, 0x80, 0x0f, 0x1e, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1e, 0x0f, 0xf0, 0x00, 0x38, 0x03, 0x80, 0x00, 
-	0x78, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x3c, 0x01, 0xe0, 0x00, 0x03, 0xb8, 0x00, 0x00, 
-	0x0e, 0xe0, 0x3b, 0x80, 0x1e, 0x0f, 0x00, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0x83, 0xe0, 0x00, 0x38, 0x03, 0xc0, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x1f, 0x07, 0xc0, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x0f, 0xe0, 0x3f, 0x80, 0x3c, 0x07, 0x80, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xf0, 0x00, 0x38, 0x01, 0xe0, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x0f, 0xff, 0x80, 0x00, 0x03, 0xf8, 0x00, 0x00, 
-	0x0f, 0xe0, 0x3f, 0x80, 0x38, 0x03, 0x80, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xff, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x07, 0xff, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xc0, 0x1f, 0x00, 0x78, 0x03, 0xc0, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x01, 0xff, 0x3c, 0x00, 0x38, 0x00, 0xf0, 0x00, 
-	0x07, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
-	0x03, 0xfe, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 
-	0x07, 0xc0, 0x1f, 0x00, 0xf0, 0x01, 0xe0, 0x00, 
-	0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xf0, 0xf8, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xfb, 0xfc, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3e, 0x3f, 0x1e, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x1e, 0x0e, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0x9c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 
-	0x78, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x3c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, 
-	0x3e, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0x8e, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x7c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x39, 0xf0, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, 
-	0x1f, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x01, 
-	0xe0, 0x70, 0x3c, 0x00, 0xe0, 0x38, 0x00, 0x00, 
-	0xe0, 0x38, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x3f, 0xf0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00, 
-	0xe0, 0x70, 0x38, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xf0, 0x78, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x78, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x70, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x70, 0x70, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x1e, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x70, 0xd8, 0x70, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x78, 0xf0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x7c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x71, 0xdc, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x61, 0xff, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x71, 0x8c, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x38, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x40, 0x7c, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x31, 0x8c, 0x60, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x39, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x33, 0x8e, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1d, 0xc0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x3b, 0x06, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1d, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1e, 0x00, 0x00, 
-	0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x0d, 0x80, 0x00, 0x00, 
-	0x1b, 0x06, 0xe0, 0x00, 0x1d, 0xc0, 0x00, 0x00, 
-	0x1f, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x78, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x38, 0x3c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1f, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x3c, 0x7c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 
-	0x1e, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1f, 0xf8, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x1f, 0xfc, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x1e, 0x03, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x40, 0x00, 0x39, 0xe0, 0x00, 0x00, 
-	0x07, 0x9c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x0f, 0x9c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x0e, 0x03, 0x80, 0x00, 0xe0, 0x38, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 
-	0x0b, 0x15, 0x17, 0x13, 0x1a, 0x13, 0x19, 0x13, 
-	0x09, 0x0b, 0x0c, 0x13, 0x13, 0x1e, 0x17, 0x06, 
-	0x0b, 0x0b, 0x0d, 0x14, 0x09, 0x0b, 0x09, 0x09, 
-	0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 
-	0x13, 0x13, 0x09, 0x09, 0x14, 0x14, 0x14, 0x13, 
-	0x23, 0x17, 0x17, 0x19, 0x19, 0x17, 0x15, 0x1a, 
-	0x19, 0x09, 0x11, 0x17, 0x13, 0x1d, 0x19, 0x1a, 
-	0x17, 0x1a, 0x19, 0x17, 0x15, 0x19, 0x17, 0x22, 
-	0x17, 0x15, 0x15, 0x09, 0x09, 0x09, 0x11, 0x13, 
-	0x0b, 0x12, 0x12, 0x11, 0x12, 0x12, 0x0a, 0x12, 
-	0x13, 0x07, 0x07, 0x11, 0x07, 0x1b, 0x13, 0x12, 
-	0x12, 0x12, 0x0b, 0x11, 0x09, 0x13, 0x11, 0x17, 
-	0x10, 0x11, 0x10, 0x0b, 0x09, 0x0b, 0x14, 0x1a, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00, 
-	0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 
-	0x1c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 
-	0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 
-	0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00, 
-	0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1f, 
-	0xfe, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00, 
-	0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x3f, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x78, 
-	0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00, 
-	0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0f, 0x80, 
-	0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x07, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x07, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x3f, 
-	0xf7, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x7c, 
-	0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x70, 
-	0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x00, 
-	0x3c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x70, 
-	0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x70, 
-	0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1e, 0x00, 
-	0x3c, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0xf0, 
-	0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, 
-	0x1f, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 
-	0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 
-	0x78, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf9, 0xf0, 
-	0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x7c, 
-	0x3f, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0xc1, 
-	0xf8, 0x00, 0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x7f, 0xe0, 
-	0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x00, 0x3f, 
-	0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 
-	0xf0, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 
-	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 
-	0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 
-	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 
-	0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 
-	0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3f, 0xc0, 
-	0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x3f, 
-	0xf7, 0x80, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 
-	0xe0, 0x00, 0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00, 
-	0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 
-	0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 
-	0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 
-	0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 
-	0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x80, 
-	0x00, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x0f, 
-	0xe3, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x80, 0x00, 0x00, 0x07, 0xe3, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01, 
-	0xc3, 0x80, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x07, 0xc0, 0x0e, 0x00, 0x00, 0x00, 0xf8, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01, 
-	0xc7, 0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
-	0x00, 0x1f, 0xe0, 0x1e, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0xc7, 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x03, 0xfe, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0xc7, 0x00, 0x00, 0x00, 0x3e, 0xde, 0x00, 0x00, 
-	0x00, 0x3c, 0x78, 0x3c, 0x00, 0x00, 0x07, 0x8f, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x76, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x87, 0x00, 0x00, 0x00, 0x3c, 0xcf, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x87, 0x00, 0x00, 0x00, 0x38, 0xc7, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x78, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03, 
-	0x8f, 0x00, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0x70, 0x00, 0x00, 0x07, 0x07, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0xf0, 0x00, 0x00, 0x07, 0x8f, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 
-	0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00, 
-	0x00, 0x38, 0x38, 0xe0, 0x00, 0x00, 0x03, 0x9e, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x1e, 0xc0, 0x00, 0x00, 
-	0x00, 0x3c, 0x79, 0xe0, 0x00, 0x00, 0x03, 0xfc, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x0e, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 
-	0x00, 0x1c, 0x71, 0xc0, 0x00, 0x00, 0x01, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0x1e, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 
-	0x00, 0x1f, 0xe3, 0xc0, 0x00, 0x00, 0x03, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x1e, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 
-	0x00, 0x07, 0xc3, 0x8f, 0x80, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xbf, 0xc0, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0x38, 0xe0, 0x00, 0x1e, 0x3c, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x0f, 0x78, 0xf0, 0x00, 0x3c, 0x1e, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x0e, 0x70, 0x70, 0x00, 0x38, 0x1e, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x1e, 0x70, 0x70, 0x00, 0x38, 0x0f, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 
-	0x38, 0x00, 0x00, 0x00, 0x70, 0xc3, 0x80, 0x00, 
-	0x00, 0x00, 0x1c, 0x70, 0x70, 0x00, 0x38, 0x07, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x3c, 0x70, 0x70, 0x00, 0x3c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00, 
-	0x00, 0x00, 0x38, 0x70, 0x70, 0x00, 0x3c, 0x07, 
-	0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x78, 0x00, 0x00, 0x00, 0x3e, 0xdf, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x78, 0xf0, 0x00, 0x1f, 0x1f, 
-	0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x78, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x38, 0xe0, 0x00, 0x0f, 0xff, 
-	0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x70, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x3f, 0xc0, 0x00, 0x07, 0xfe, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x70, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x0f, 0x80, 0x00, 0x03, 0xf8, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x07, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x01, 0xfc, 
-	0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 
-	0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 
-	0x80, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 
-	0x1f, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 
-	0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3e, 
-	0x1f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 
-	0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 
-	0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x78, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xf0, 0x00, 
-	0x00, 0x00, 0x70, 0x03, 0xc0, 0x00, 0x00, 0x70, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x01, 
-	0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x1f, 0x70, 0x00, 
-	0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x1e, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0x80, 0x00, 0x00, 0x01, 0xee, 0x00, 0x00, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x18, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00, 
-	0x00, 0x3b, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x1f, 0x00, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00, 
-	0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x71, 0xfc, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x1e, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x07, 0x8e, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x77, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 
-	0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x00, 
-	0x00, 0x7c, 0x0f, 0x80, 0x00, 0x00, 0x7f, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x07, 0xfc, 0x00, 0x00, 0x00, 0x78, 0x07, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x03, 0x80, 0x00, 0x00, 0x7e, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x7c, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x3c, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x78, 0x03, 
-	0xc0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xfd, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x07, 0xf1, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 
-	0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xc0, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 
-	0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 
-	0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01, 
-	0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x38, 0x03, 
-	0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x07, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x07, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03, 
-	0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x78, 0x03, 0xc0, 0x00, 0x00, 0x78, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e, 
-	0x0f, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x0f, 
-	0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3c, 0x1f, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x03, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 
-	0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x7c, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x00, 0x07, 0xc0, 0x00, 0x1e, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x7c, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1e, 0x00, 
-	0x1c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0xfe, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, 
-	0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 
-	0xe0, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x01, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x00, 
-	0x1c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 
-	0x00, 0xfe, 0x07, 0xf0, 0x00, 0x00, 0xfe, 0x00, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07, 
-	0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0xfc, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x80, 
-	0x1c, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, 
-	0x01, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0xee, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x0f, 
-	0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x80, 0x1e, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x07, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xc0, 0x1f, 0xc0, 0x00, 0x1f, 0x80, 
-	0x1c, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x7c, 0x00, 0x01, 0xef, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1e, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x0f, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1f, 0xc0, 
-	0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x07, 0x80, 0x00, 0x3c, 0x00, 0x01, 0xc7, 0x00, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x0f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1d, 0xc0, 
-	0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x0f, 0x03, 0xe3, 0x9e, 0x00, 0x03, 0xc7, 0x80, 
-	0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 
-	0x00, 0x18, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x3e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1d, 0xe0, 0x1d, 0xc0, 0x00, 0x1c, 0xe0, 
-	0x1c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00, 
-	0x0f, 0x0f, 0xf7, 0x8e, 0x00, 0x03, 0xc7, 0x80, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x7c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0xf0, 
-	0x1c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00, 
-	0x1e, 0x1f, 0xff, 0x8f, 0x00, 0x03, 0x83, 0x80, 
-	0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0x70, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x3e, 0x3f, 0x0f, 0x00, 0x07, 0x83, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 
-	0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xf0, 0x39, 0xc0, 0x00, 0x1c, 0x78, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x3c, 0x1f, 0x07, 0x00, 0x07, 0x01, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0xf0, 0x79, 0xc0, 0x00, 0x1c, 0x3c, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x3c, 0x78, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1c, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0x70, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 
-	0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0x9c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1e, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xf0, 0x0f, 0x07, 0x00, 0x0f, 0xff, 0xe0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f, 
-	0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x78, 0xf1, 0xc0, 0x00, 0x1c, 0x0f, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xe0, 0x0e, 0x07, 0x00, 0x1f, 0xff, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1e, 
-	0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07, 
-	0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 
-	0x38, 0xe0, 0x0e, 0x0f, 0x00, 0x1f, 0xff, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c, 
-	0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07, 
-	0x9c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00, 
-	0x38, 0xe0, 0x1e, 0x0e, 0x00, 0x1c, 0x00, 0x70, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 
-	0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1c, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x3d, 0xe1, 0xc0, 0x00, 0x1c, 0x03, 
-	0x9c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00, 
-	0x38, 0xe0, 0x1e, 0x1e, 0x00, 0x3c, 0x00, 0x78, 
-	0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1e, 
-	0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x03, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01, 
-	0xdc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x38, 0xe0, 0x3c, 0x1c, 0x00, 0x38, 0x00, 0x38, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 
-	0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 
-	0x01, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01, 
-	0xfc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 
-	0x3c, 0xf0, 0x7c, 0x3c, 0x00, 0x78, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 
-	0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1f, 0xc1, 0xc0, 0x00, 0x1c, 0x00, 
-	0xfc, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00, 
-	0x3c, 0x78, 0xfc, 0xf8, 0x00, 0x78, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07, 
-	0xe1, 0xf8, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00, 
-	0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0x7f, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0x78, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1c, 0x1f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0xfc, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, 
-	0x1c, 0x7f, 0xff, 0xf0, 0x00, 0x70, 0x00, 0x1c, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, 
-	0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x78, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0x7c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 
-	0x1e, 0x3f, 0xdf, 0xe0, 0x00, 0xf0, 0x00, 0x1e, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x3c, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00, 
-	0x3c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 
-	0x0f, 0x1f, 0x0f, 0x87, 0x80, 0xe0, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 
-	0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 
-	0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 
-	0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x1c, 
-	0x00, 0x1e, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 
-	0x00, 0x1c, 0x0f, 0x01, 0xc0, 0x00, 0x1c, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
-	0x0f, 0x80, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x07, 0xc0, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0xfe, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01, 
-	0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xe0, 0x00, 
-	0x0e, 0x00, 0x00, 0xe0, 0x03, 0xe0, 0x03, 0x80, 
-	0x3c, 0x00, 0x78, 0x00, 0x00, 0xf0, 0x00, 0x78, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xc0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03, 
-	0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00, 
-	0x1e, 0x00, 0x00, 0xf0, 0x03, 0xe0, 0x07, 0x80, 
-	0x1e, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x70, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xe0, 
-	0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x0f, 
-	0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00, 
-	0x1e, 0x00, 0x00, 0xf0, 0x07, 0xe0, 0x07, 0x80, 
-	0x0e, 0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0xf0, 
-	0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0xf0, 0x00, 0x00, 0x07, 0xc1, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f, 
-	0x83, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00, 
-	0x3c, 0x00, 0x00, 0x70, 0x07, 0xf0, 0x07, 0x00, 
-	0x0f, 0x01, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 
-	0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0x78, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00, 
-	0x3c, 0x00, 0x00, 0x70, 0x07, 0x70, 0x07, 0x00, 
-	0x07, 0x83, 0xc0, 0x00, 0x00, 0x1c, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 
-	0x38, 0x00, 0x00, 0x78, 0x07, 0x70, 0x0f, 0x00, 
-	0x03, 0x83, 0x80, 0x00, 0x00, 0x1e, 0x03, 0xc0, 
-	0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x3c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 
-	0x78, 0x00, 0x00, 0x78, 0x0f, 0x78, 0x0f, 0x00, 
-	0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, 0x07, 0x80, 
-	0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x1c, 
-	0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00, 
-	0x78, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00, 
-	0x01, 0xef, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x1e, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 
-	0x70, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 0x8f, 0x00, 
-	0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00, 
-	0xf0, 0x00, 0x00, 0x3c, 0x0e, 0x38, 0x1e, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00, 
-	0xf0, 0x00, 0x00, 0x3c, 0x1e, 0x3c, 0x1e, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0xde, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x07, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01, 
-	0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x01, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01, 
-	0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 
-	0x3f, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x01, 
-	0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1c, 0x3c, 0x00, 
-	0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x00, 
-	0x03, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83, 
-	0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1e, 0x3c, 0x00, 
-	0x01, 0xef, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0e, 
-	0x00, 0x00, 0x1c, 0x07, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83, 
-	0xc0, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00, 
-	0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1e, 
-	0x00, 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, 0x38, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7, 
-	0x80, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00, 
-	0x03, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 
-	0x00, 0x00, 0x1c, 0x03, 0xe0, 0x00, 0x00, 0x38, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7, 
-	0x80, 0x00, 0x00, 0x0f, 0x78, 0x0f, 0x78, 0x00, 
-	0x07, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x3c, 
-	0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x3c, 
-	0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xc7, 
-	0x00, 0x00, 0x00, 0x0f, 0x70, 0x07, 0x78, 0x00, 
-	0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0xb8, 
-	0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x1c, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xef, 
-	0x00, 0x00, 0x00, 0x07, 0x70, 0x07, 0x70, 0x00, 
-	0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x07, 0xf8, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 
-	0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x01, 0xef, 
-	0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00, 
-	0x1e, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc1, 0xf0, 
-	0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 
-	0xc1, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x0f, 0xc1, 0xf8, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00, 
-	0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 
-	0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f, 
-	0xff, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x07, 0xe0, 0x03, 0xf0, 0x00, 
-	0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 
-	0x00, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x00, 0x03, 
-	0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00, 
-	0x78, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x9f, 
-	0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00, 
-	0xf0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x70, 0x00, 
-	0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 
-	0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x03, 
-	0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 
-	0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 
-	0x38, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x39, 0xf0, 0x7e, 0x00, 0x00, 0x39, 0xfc, 
-	0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 
-	0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 
-	0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 
-	0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 
-	0x3b, 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3b, 0xfc, 0xff, 0x00, 0x00, 0x3b, 0xff, 
-	0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 
-	0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x80, 
-	0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 
-	0x3f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0xfd, 0xff, 0x80, 0x00, 0x3f, 0xff, 
-	0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1f, 0x00, 
-	0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 
-	0x1e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 
-	0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 
-	0x3f, 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3f, 0x1f, 0x8f, 0x80, 0x00, 0x3f, 0x0f, 
-	0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x00, 0x3c, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, 
-	0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x1f, 0x07, 0x80, 0x00, 0x3c, 0x07, 
-	0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 
-	0x07, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 
-	0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x3c, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x39, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x0f, 0x03, 0x80, 0x00, 0x3c, 0x03, 
-	0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b, 
-	0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 
-	0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0f, 0x00, 
-	0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 
-	0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1f, 0x00, 
-	0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 
-	0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x3f, 0x00, 
-	0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 
-	0x3e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 
-	0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x80, 
-	0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 
-	0xf8, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 
-	0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe3, 0x80, 
-	0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x07, 
-	0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 
-	0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 
-	0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03, 
-	0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x39, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 
-	0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, 0x00, 0x0f, 
-	0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07, 
-	0x80, 0x00, 0x01, 0xe0, 0x38, 0x0f, 0x00, 0x00, 
-	0xf0, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 
-	0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, 0x00, 0x1f, 
-	0xf8, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07, 
-	0x80, 0x00, 0x00, 0xe0, 0x3c, 0x0e, 0x00, 0x00, 
-	0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x3f, 
-	0xfc, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 
-	0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00, 
-	0x38, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 
-	0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 
-	0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x0f, 
-	0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 
-	0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 
-	0x40, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3e, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, 0x00, 
-	0x1e, 0x38, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e, 
-	0x00, 0x00, 0x00, 0x70, 0xec, 0x1c, 0x00, 0x00, 
-	0x0e, 0x78, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 
-	0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf1, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x03, 0x80, 0x00, 0x00, 0x70, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7e, 
-	0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3c, 0x1e, 
-	0x00, 0x00, 0x00, 0x78, 0xee, 0x3c, 0x00, 0x00, 
-	0x0f, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 
-	0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x71, 0xff, 
-	0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x1c, 
-	0x00, 0x00, 0x00, 0x38, 0xee, 0x38, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 
-	0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x7f, 
-	0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x3c, 
-	0x00, 0x00, 0x00, 0x38, 0xe6, 0x38, 0x00, 0x00, 
-	0x03, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 
-	0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x1f, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x3d, 0xc6, 0x78, 0x00, 0x00, 
-	0x03, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00, 
-	0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x78, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38, 
-	0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00, 
-	0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00, 
-	0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0x78, 
-	0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00, 
-	0x07, 0xf0, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 
-	0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x70, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 0x07, 0x70, 
-	0x00, 0x00, 0x00, 0x1d, 0xc3, 0x70, 0x00, 0x00, 
-	0x0f, 0x70, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3c, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78, 
-	0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x07, 0xf0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x1e, 0x78, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 
-	0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-	0x1f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 
-	0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x3c, 0x3c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0xfe, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, 
-	0x38, 0x1c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1f, 
-	0xfc, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 
-	0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00, 0x03, 0xe0, 
-	0x00, 0x00, 0x00, 0x0f, 0x03, 0xc0, 0x00, 0x00, 
-	0x78, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 
-	0x39, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xe7, 0x00, 
-	0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xf0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 
-	0x00, 0x07, 0xe3, 0x80, 0x00, 0x00, 0x01, 0xc0, 
-	0x00, 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 
-	0xf0, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 
-	0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 
-	0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 
-	0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0c, 0x94, 
-	0xea, 0xff, 0xfd, 0x70, 0xea, 0x00, 0x00, 0x01, 
-	0xe3, 0x5c, 0x00, 0xb7, 0xa5, 0x9f, 0xf0, 0x04, 
-	0xe0, 0x86, 0xc0, 0x0c, 0xe5, 0x9f, 0xf0, 0x00, 
-	0x00, 0x00, 0x0f, 0x74, 0x00, 0x00, 0x0c, 0x98, 
-	0x00, 0x00, 0x00, 0x0f, 0xf0, 0x24, 0x00, 0x09, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x0e, 0x4c, 0xea, 0xff, 0xfd, 0x03, 
-	0xea, 0x00, 0x00, 0x07, 0xe5, 0x9f, 0xc0, 0x1c, 
-	0xe5, 0x9c, 0x30, 0x00, 0xe3, 0x83, 0x33, 0x33, 
-	0xe1, 0x52, 0x00, 0x03, 0x05, 0x9f, 0xc0, 0x10, 
-	0x05, 0x9c, 0xc0, 0x00, 0x03, 0x8c, 0x23, 0x33, 
-	0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9f, 0xf0, 0x08, 
-	0x66, 0x00, 0x00, 0x60, 0x66, 0x00, 0x00, 0x5c, 
-	0x66, 0x00, 0x00, 0x58, 0x00, 0x00, 0x0e, 0x50, 
-	0x00, 0x00, 0x00, 0x01, 0xf0, 0x24, 0x00, 0x09, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x02, 0x6c, 0xa0, 0x00, 0x0b, 0x38, 
-	0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x0f, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 
-	0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x72, 0x17, 0xf7, 
-	0xd1, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xcd, 
-	0xf3, 0x57, 0x93, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x80, 0x00, 0x3f, 0xfe, 0xca, 0x20, 0xad, 0x9a, 
-	0xb5, 0xe9, 0x46, 0xe9, 0x00, 0x00, 0x40, 0x03, 
-	0x83, 0x12, 0x51, 0x00, 0xb5, 0x7f, 0x65, 0x09, 
-	0x80, 0x00, 0x40, 0x05, 0x80, 0x3f, 0xf8, 0x95, 
-	0x9d, 0xac, 0xd2, 0x28, 0x80, 0x00, 0x40, 0x04, 
-	0x8e, 0xac, 0x02, 0x5b, 0x3e, 0x70, 0x76, 0xbb, 
-	0x00, 0x00, 0x40, 0x07, 0x9c, 0x04, 0x1f, 0xd0, 
-	0xa9, 0x33, 0xef, 0x60, 0x80, 0x00, 0x40, 0x08, 
-	0xc0, 0x5f, 0xf4, 0xe0, 0x6c, 0x83, 0xbb, 0x96, 
-	0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 
-	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 
-	0xc9, 0x0f, 0xda, 0xa2, 0x21, 0x68, 0xc2, 0x35, 
-	0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x73, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 
-	0xff, 0xfe, 0x2f, 0xf1, 0x48, 0x3b, 0x9d, 0x27, 
-	0x00, 0x00, 0x3f, 0xee, 0xe8, 0x08, 0x97, 0x58, 
-	0x10, 0x16, 0xb3, 0x7d, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 
-	0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 
-	0x40, 0x40, 0x40, 0x40, 0x05, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x20, 
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x02, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x90, 0x90, 0x90, 
-	0x90, 0x90, 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 
-	0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x02, 
-	0x02, 0x02, 0x02, 0x02, 0x02, 0x88, 0x88, 0x88, 
-	0x88, 0x88, 0x88, 0x08, 0x08, 0x08, 0x08, 0x08, 
-	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
-	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 
-	0x02, 0x02, 0x02, 0x40, 0xe5, 0x9f, 0xc0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x01, 0x79, 0x19, 
-	0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, 
-	0x2e, 0x00, 0x5c, 0x7b, 0xe5, 0x9f, 0xc0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5d, 0x05, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x01, 0xc9, 0x08, 0x2e, 0x01, 0xca, 0x20, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc9, 0x08, 
-	0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 
-	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 
-	0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x40, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79, 
-	0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75, 
-	0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69, 
-	0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20, 
-	0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65, 
-	0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 
-	0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d, 
-	0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x57, 0x5e, 0x61, 0xa3, 
-	0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x0c, 
-	0x6c, 0x00, 0x00, 0x24, 0x64, 0x00, 0x00, 0x28, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, 
-	0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, 
-	0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, 
-	0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, 
-	0x2e, 0x08, 0x05, 0xc4, 0x2e, 0x08, 0x05, 0xcc, 
-	0x2e, 0x08, 0x05, 0xcc, 0x2e, 0x08, 0x05, 0xd4, 
-	0x2e, 0x08, 0x05, 0xd4, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 
-	0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 
-	0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 
-	0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 
-	0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 
-	0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 
-	0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 
-	0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 
-	0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 
-	0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 
-	0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 
-	0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 
-	0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 
-	0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 
-	0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 
-	0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 
-	0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 
-	0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 
-	0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 
-	0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 
-	0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 
-	0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 
-	0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 
-	0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 
-	0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 
-	0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 
-	0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 
-	0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 
-	0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 
-	0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 
-	0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 
-	0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 
-	0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 
-	0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 
-	0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 
-	0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 
-	0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 
-	0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 
-	0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 
-	0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 
-	0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 
-	0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 
-	0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 
-	0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 
-	0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 
-	0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 
-	0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 
-	0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 
-	0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 
-	0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 
-	0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, 
-	0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 
-	0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 
-	0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 
-	0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 
-	0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 
-	0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 
-	0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 
-	0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 
-	0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 
-	0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30, 
-	0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 
-	0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 
-	0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 
-	0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 
-	0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 
-	0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 
-	0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 
-	0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 
-	0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 
-	0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 
-	0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 
-	0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 
-	0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 
-	0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 
-	0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00, 
-	0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 
-	0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 
-	0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x38, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xfe, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 
-	0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36, 
-	0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 
-	0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 
-	0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 
-	0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 
-	0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 
-	0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 
-	0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 
-	0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-	0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 
-	0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 
-	0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 
-	0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 
-	0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, 
-	0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, 
-	0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, 
-	0x66, 0xce, 0x9a, 0x3f, 0x06, 0x06, 0x00, 0x00, 
-	0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 
-	0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 
-	0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 
-	0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 
-	0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 
-	0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 
-	0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 
-	0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 
-	0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 
-	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
-	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 
-	0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 
-	0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
-	0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 
-	0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 
-	0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 
-	0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 
-	0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x18, 
-	0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 
-	0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 
-	0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 
-	0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 
-	0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 
-	0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 
-	0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 
-	0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 
-	0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 
-	0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 
-	0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 
-	0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 
-	0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 
-	0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 
-	0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 
-	0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, 
-	0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 
-	0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 
-	0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x6c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 
-	0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x67, 0x20, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 
-	0x2e, 0x08, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
-	0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, 
-	0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 
-	0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 
-	0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0xb1, 0x0e, 0xa6, 0x06, 0x53, 
-	0x2e, 0x08, 0x17, 0xdc, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 
-	0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 
-	0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 
-	0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 
-	0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
-	0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19, 
-	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x04, 0xf5, 0x11, 0x38, 0x06, 0x53, 
-	0x2e, 0x08, 0x19, 0x0c, 0x2e, 0x08, 0x19, 0x00, 
-	0x2e, 0x08, 0x1a, 0x30, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 
-	0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-	0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80, 
-	0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22, 
-	0x00, 0xf0, 0x29, 0x6e, 0x00, 0x10, 0xd2, 0x92, 
-	0x00, 0xca, 0x6a, 0xde, 0x00, 0xa6, 0xaa, 0x10, 
-	0x00, 0x80, 0x3b, 0x80, 0x00, 0x80, 0xbc, 0x80, 
-	0x00, 0x80, 0x7e, 0x80, 0x00, 0xcf, 0x22, 0x73, 
-	0x00, 0x93, 0x48, 0x5d, 0x00, 0xa2, 0x73, 0x93, 
-	0x00, 0x25, 0xae, 0xad, 0x00, 0xa7, 0x9f, 0x60, 
-	0x00, 0x10, 0x10, 0x10, 0x00, 0x59, 0x10, 0x10, 
-	0x00, 0xa2, 0x10, 0x10, 0x00, 0xeb, 0x10, 0x10, 
-	0x00, 0x10, 0x10, 0x59, 0x00, 0x59, 0x10, 0x59, 
-	0x00, 0xa2, 0x10, 0x59, 0x00, 0xeb, 0x10, 0x59, 
-	0x00, 0x10, 0x10, 0xa2, 0x00, 0x59, 0x10, 0xa2, 
-	0x00, 0xa2, 0x10, 0xa2, 0x00, 0xeb, 0x10, 0xa2, 
-	0x00, 0x10, 0x10, 0xeb, 0x00, 0x59, 0x10, 0xeb, 
-	0x00, 0xa2, 0x10, 0xeb, 0x00, 0xeb, 0x10, 0xeb, 
-	0x00, 0x10, 0x2f, 0x10, 0x00, 0x59, 0x2f, 0x10, 
-	0x00, 0xa2, 0x2f, 0x10, 0x00, 0xeb, 0x2f, 0x10, 
-	0x00, 0x10, 0x2f, 0x59, 0x00, 0x59, 0x2f, 0x59, 
-	0x00, 0xa2, 0x2f, 0x59, 0x00, 0xeb, 0x2f, 0x59, 
-	0x00, 0x10, 0x2f, 0xa2, 0x00, 0x59, 0x2f, 0xa2, 
-	0x00, 0xa2, 0x2f, 0xa2, 0x00, 0xeb, 0x2f, 0xa2, 
-	0x00, 0x10, 0x2f, 0xeb, 0x00, 0x59, 0x2f, 0xeb, 
-	0x00, 0xa2, 0x2f, 0xeb, 0x00, 0xeb, 0x2f, 0xeb, 
-	0x00, 0x10, 0x4e, 0x10, 0x00, 0x59, 0x4e, 0x10, 
-	0x00, 0xa2, 0x4e, 0x10, 0x00, 0xeb, 0x4e, 0x10, 
-	0x00, 0x10, 0x4e, 0x59, 0x00, 0x59, 0x4e, 0x59, 
-	0x00, 0xa2, 0x4e, 0x59, 0x00, 0xeb, 0x4e, 0x59, 
-	0x00, 0x10, 0x4e, 0xa2, 0x00, 0x59, 0x4e, 0xa2, 
-	0x00, 0xa2, 0x4e, 0xa2, 0x00, 0xeb, 0x4e, 0xa2, 
-	0x00, 0x10, 0x4e, 0xeb, 0x00, 0x59, 0x4e, 0xeb, 
-	0x00, 0xa2, 0x4e, 0xeb, 0x00, 0xeb, 0x4e, 0xeb, 
-	0x00, 0x10, 0x6d, 0x10, 0x00, 0x59, 0x6d, 0x10, 
-	0x00, 0xa2, 0x6d, 0x10, 0x00, 0xeb, 0x6d, 0x10, 
-	0x00, 0x10, 0x6d, 0x59, 0x00, 0x59, 0x6d, 0x59, 
-	0x00, 0xa2, 0x6d, 0x59, 0x00, 0xeb, 0x6d, 0x59, 
-	0x00, 0x10, 0x6d, 0xa2, 0x00, 0x59, 0x6d, 0xa2, 
-	0x00, 0xa2, 0x6d, 0xa2, 0x00, 0xeb, 0x6d, 0xa2, 
-	0x00, 0x10, 0x6d, 0xeb, 0x00, 0x59, 0x6d, 0xeb, 
-	0x00, 0xa2, 0x6d, 0xeb, 0x00, 0xeb, 0x6d, 0xeb, 
-	0x00, 0x10, 0x8c, 0x10, 0x00, 0x59, 0x8c, 0x10, 
-	0x00, 0xa2, 0x8c, 0x10, 0x00, 0xeb, 0x8c, 0x10, 
-	0x00, 0x10, 0x8c, 0x59, 0x00, 0x59, 0x8c, 0x59, 
-	0x00, 0xa2, 0x8c, 0x59, 0x00, 0xeb, 0x8c, 0x59, 
-	0x00, 0x10, 0x8c, 0xa2, 0x00, 0x59, 0x8c, 0xa2, 
-	0x00, 0xa2, 0x8c, 0xa2, 0x00, 0xeb, 0x8c, 0xa2, 
-	0x00, 0x10, 0x8c, 0xeb, 0x00, 0x59, 0x8c, 0xeb, 
-	0x00, 0xa2, 0x8c, 0xeb, 0x00, 0xeb, 0x8c, 0xeb, 
-	0x00, 0x10, 0xab, 0x10, 0x00, 0x59, 0xab, 0x10, 
-	0x00, 0xa2, 0xab, 0x10, 0x00, 0xeb, 0xab, 0x10, 
-	0x00, 0x10, 0xab, 0x59, 0x00, 0x59, 0xab, 0x59, 
-	0x00, 0xa2, 0xab, 0x59, 0x00, 0xeb, 0xab, 0x59, 
-	0x00, 0x10, 0xab, 0xa2, 0x00, 0x59, 0xab, 0xa2, 
-	0x00, 0xa2, 0xab, 0xa2, 0x00, 0xeb, 0xab, 0xa2, 
-	0x00, 0x10, 0xab, 0xeb, 0x00, 0x59, 0xab, 0xeb, 
-	0x00, 0xa2, 0xab, 0xeb, 0x00, 0xeb, 0xab, 0xeb, 
-	0x00, 0x10, 0xca, 0x10, 0x00, 0x59, 0xca, 0x10, 
-	0x00, 0xa2, 0xca, 0x10, 0x00, 0xeb, 0xca, 0x10, 
-	0x00, 0x10, 0xca, 0x59, 0x00, 0x59, 0xca, 0x59, 
-	0x00, 0xa2, 0xca, 0x59, 0x00, 0xeb, 0xca, 0x59, 
-	0x00, 0x10, 0xca, 0xa2, 0x00, 0x59, 0xca, 0xa2, 
-	0x00, 0xa2, 0xca, 0xa2, 0x00, 0xeb, 0xca, 0xa2, 
-	0x00, 0x10, 0xca, 0xeb, 0x00, 0x59, 0xca, 0xeb, 
-	0x00, 0xa2, 0xca, 0xeb, 0x00, 0xeb, 0xca, 0xeb, 
-	0x00, 0x10, 0xe9, 0x10, 0x00, 0x59, 0xe9, 0x10, 
-	0x00, 0xa2, 0xe9, 0x10, 0x00, 0xeb, 0xe9, 0x10, 
-	0x00, 0x10, 0xe9, 0x59, 0x00, 0x59, 0xe9, 0x59, 
-	0x00, 0xa2, 0xe9, 0x59, 0x00, 0xeb, 0xe9, 0x59, 
-	0x00, 0x10, 0xe9, 0xa2, 0x00, 0x59, 0xe9, 0xa2, 
-	0x00, 0xa2, 0xe9, 0xa2, 0x00, 0xeb, 0xe9, 0xa2, 
-	0x00, 0x10, 0xe9, 0xeb, 0x00, 0x59, 0xe9, 0xeb, 
-	0x00, 0xa2, 0xe9, 0xeb, 0x00, 0xeb, 0xe9, 0xeb, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xc1, 0x11, 0x11, 0x10, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0f, 0x6d, 0xbb, 0xeb, 
-	0x8e, 0x01, 0xea, 0x25, 0x04, 0xd0, 0x82, 0x49, 
-	0xed, 0x4c, 0x8f, 0xc2, 0x66, 0x0b, 0x65, 0xc5, 
-	0x0c, 0xc2, 0x41, 0x19, 0x07, 0xa8, 0x94, 0x13, 
-	0x42, 0x09, 0x27, 0xb5, 0x32, 0x3f, 0x09, 0x98, 
-	0x2d, 0x97, 0x14, 0x33, 0x09, 0x04, 0x64, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xe0, 0x11, 0x21, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x13, 0x8e, 0xf7, 0xe7, 
-	0x6e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 0x05, 0x16, 
-	0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x5e, 0x9c, 0x0c, 
-	0xc3, 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, 0x82, 
-	0xd4, 0x16, 0x5e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 
-	0x05, 0x16, 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x50, 
-	0xff, 0xff, 0x24, 0xc0, 0xd4, 0x11, 0x20, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x0d, 0x4d, 0xf8, 0xd5, 
-	0x9e, 0x7f, 0x02, 0x22, 0x08, 0xa3, 0xbd, 0x94, 
-	0x53, 0x16, 0x79, 0xfc, 0x08, 0x88, 0x22, 0x8e, 
-	0xf6, 0x51, 0x4c, 0x59, 0xe7, 0xf0, 0x22, 0x20, 
-	0x8a, 0x3b, 0xd9, 0x45, 0x31, 0x67, 0x9f, 0xc0, 
-	0x88, 0x82, 0x28, 0xef, 0x65, 0x14, 0xc4, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0xe8, 0x00, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x14, 0x6d, 0xfb, 0x1d, 
-	0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 0xd7, 0x7c, 
-	0x13, 0x88, 0x1f, 0xbb, 0x1d, 0x77, 0xc1, 0x38, 
-	0x81, 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, 0x1f, 
-	0xbb, 0x1d, 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 
-	0xd7, 0x7c, 0x13, 0x88, 0x1f, 0x80, 0x00, 0x00, 
-	0xff, 0xff, 0x24, 0xc0, 0x9b, 0x00, 0x20, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x50, 0x3d, 0x75, 0xf7, 
-	0x14, 0x0a, 0xc3, 0x29, 0x9f, 0x51, 0xbc, 0xfb, 
-	0xdc, 0x7b, 0x8a, 0x05, 0x61, 0x94, 0xcf, 0xa8, 
-	0xde, 0x7d, 0xee, 0x3d, 0xc5, 0x02, 0xb0, 0xca, 
-	0x67, 0xd4, 0x6f, 0x3e, 0xf7, 0x1e, 0xe2, 0x81, 
-	0x58, 0x65, 0x33, 0xea, 0x37, 0x9f, 0x7b, 0x80, 
-	0xff, 0xff, 0x24, 0xc0, 0x12, 0xe0, 0x00, 0x00, 
-	0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xeb, 0x50, 0xfb, 0xe7, 
-	0x78, 0x1f, 0xde, 0xa1, 0x62, 0x99, 0x11, 0x36, 
-	0x02, 0x00, 0x97, 0xd6, 0x69, 0x98, 0x1f, 0xde, 
-	0xa1, 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, 0x97, 
-	0xd6, 0x69, 0x98, 0x1f, 0xde, 0xa1, 0x62, 0x99, 
-	0x11, 0x36, 0x02, 0x00, 0x97, 0xd6, 0x69, 0x90, 
-	0xff, 0xff, 0x24, 0xc0, 0x11, 0xba, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xdf, 0x95, 0x03, 0xa1, 
-	0x49, 0xc5, 0x45, 0xe7, 0x96, 0xe6, 0x1d, 0xdc, 
-	0x0d, 0x50, 0xa4, 0xe2, 0xa2, 0xf3, 0xcb, 0x73, 
-	0x0e, 0xee, 0x06, 0xa8, 0x52, 0x71, 0x51, 0x79, 
-	0xe5, 0xb9, 0x87, 0x77, 0x03, 0x54, 0x29, 0x38, 
-	0xa8, 0xbc, 0xf2, 0xdc, 0xc3, 0xbb, 0x81, 0xa0, 
-	0xff, 0xff, 0x24, 0xc0, 0x11, 0x21, 0xc3, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0xe7, 0xae, 0x35, 0x0d, 
-	0x42, 0x14, 0xc2, 0xf9, 0x4a, 0x13, 0x55, 0xa6, 
-	0x6e, 0xf4, 0x88, 0x53, 0x0b, 0xe5, 0x28, 0x4d, 
-	0x56, 0x99, 0xbb, 0xd2, 0x21, 0x4c, 0x2f, 0x94, 
-	0xa1, 0x35, 0x5a, 0x66, 0xef, 0x48, 0x85, 0x30, 
-	0xbe, 0x52, 0x84, 0xd5, 0x69, 0x9b, 0xbd, 0x20, 
-	0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x48, 
-	0x2e, 0x08, 0x1f, 0x4c, 0x2e, 0x08, 0x1f, 0x50, 
-	0x2e, 0x08, 0x1f, 0x58, 0x2e, 0x08, 0x1f, 0x5c, 
-	0x2e, 0x08, 0x1f, 0x60, 0x6e, 0x00, 0x01, 0x00, 
-	0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x08, 
-	0x6e, 0x00, 0x01, 0x0c, 0x6e, 0x00, 0x01, 0x04, 
-	0x6e, 0x00, 0x01, 0x10, 0x6e, 0x00, 0x01, 0x14, 
-	0x2e, 0x08, 0x60, 0x58, 0x00, 0x00, 0x00, 0x0d, 
-	0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00, 
-	0x2e, 0x08, 0x1f, 0xac, 0x2e, 0x08, 0x1f, 0xb0, 
-	0x2e, 0x08, 0x1f, 0xb4, 0x2e, 0x08, 0x1f, 0xb8, 
-	0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x04, 
-	0x70, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, 
-	0x70, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x30, 
-	0x2e, 0x01, 0xcc, 0x09, 0x2e, 0x01, 0xcb, 0x99, 
-	0x2e, 0x01, 0xcb, 0x11, 0x2e, 0x01, 0xcb, 0x09, 
-	0x2e, 0x01, 0xcc, 0x41, 0x2e, 0x01, 0xcb, 0xd1, 
-	0x2e, 0x01, 0xcc, 0x85, 0x2e, 0x01, 0xcc, 0x7d, 
-	0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 
-	0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
-	0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 
-	0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 
-	0xff, 0x80, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 
-	0xff, 0xe0, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 
-	0xff, 0xf8, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 
-	0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 
-	0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xc0, 0x00, 
-	0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x00, 
-	0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xfc, 0x00, 
-	0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0x00, 
-	0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xc0, 
-	0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0, 
-	0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfc, 
-	0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 
-	0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x7f, 0xef, 0xff, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-	0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, 
-};
-
diff -Nru a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
--- a/drivers/media/dvb/ttpci/budget-ci.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/ttpci/budget-ci.c	Thu Jan  8 23:00:23 2004
@@ -41,75 +41,14 @@
 	struct tasklet_struct msp430_irq_tasklet;
 };
 
-
-
-#ifndef BORROWED_FROM_AV7110_H_BUT_REALLY_BELONGS_IN_SAA7146_DEFS_H
-
-#define DEBINOSWAP 0x000e0000
-#define GPIO_IRQHI 0x10
-#define GPIO_INPUT 0x00
-
-void gpio_set(struct saa7146_dev* saa, u8 pin, u8 data)
-{
-        u32 value = 0;
-
-        /* sanity check */
-        if(pin > 3)
-                return;
-
-        /* read old register contents */
-        value = saa7146_read(saa, GPIO_CTRL );
-
-        value &= ~(0xff << (8*pin));
-        value |= (data << (8*pin));
-
-        saa7146_write(saa, GPIO_CTRL, value);
-}
-
-
-
-static int wait_for_debi_done(struct saa7146_dev *saa)
-{
-	int start = jiffies;
-
-	/* wait for registers to be programmed */
-	while (1) {
-		if (saa7146_read(saa, MC2) & 2)
-			break;
-		if (jiffies - start > HZ / 20) {
-			printk ("DVB (%s): timed out while waiting"
-				" for registers getting programmed\n",
-				__FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	/* wait for transfer to complete */
-	start = jiffies;
-	while (1) {
-		if (!(saa7146_read(saa, PSR) & SPCI_DEBI_S))
-			break;
-		saa7146_read(saa, MC2);
-		if (jiffies - start > HZ / 4) {
-			printk ("DVB (%s): timed out while waiting"
-				" for transfer completion\n",
-				__FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	return 0;
-}
-
-
-static u32 debiread (struct saa7146_dev *saa, u32 config, int addr, int count)
+static u32 budget_debiread4 (struct saa7146_dev *saa, u32 config, int addr, int count)
 {
 	u32 result = 0;
 
 	if (count > 4 || count <= 0)
 		return 0;
 
-	if (wait_for_debi_done(saa) < 0)
+	if (saa7146_wait_for_debi_done(saa) < 0)
 		return 0;
 
 	saa7146_write (saa, DEBI_COMMAND,
@@ -118,7 +57,7 @@
 	saa7146_write(saa, DEBI_CONFIG, config);
 	saa7146_write(saa, MC2, (2 << 16) | 2);
 
-	wait_for_debi_done(saa);
+	saa7146_wait_for_debi_done(saa);
 
 	result = saa7146_read(saa, DEBI_AD);
 	result &= (0xffffffffUL >> ((4 - count) * 8));
@@ -126,20 +65,6 @@
 	return result;
 }
 
-
-
-/* DEBI during interrupt */
-static inline u32 irdebi(struct saa7146_dev *saa, u32 config, int addr, u32 val, int count)
-{
-	u32 res;
-	res = debiread(saa, config, addr, count);
-	return res;
-}
-#endif
-
-
-
-
 /* from reading the following remotes:
    Zenith Universal 7 / TV Mode 807 / VCR Mode 837
    Hauppauge (from NOVA-CI-s box product)
@@ -150,7 +75,7 @@
 	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8,
 	KEY_9,
 	KEY_ENTER,
-	0,
+	KEY_RED,
 	KEY_POWER,              /* RADIO on Hauppauge */
 	KEY_MUTE,
 	0,
@@ -162,11 +87,11 @@
 	0, 0, 0, 0, 0, 0, 0,
 	KEY_UP, KEY_DOWN,
 	KEY_OPTION,             /* RESERVED on Hauppauge */
-	0,
+	KEY_BREAK,
 	/* 0x2X */
 	KEY_CHANNELUP, KEY_CHANNELDOWN,
 	KEY_PREVIOUS,           /* Prev. Ch on Zenith, SOURCE on Hauppauge */
-	0, 0, 0,
+	0, KEY_RESTART, KEY_OK,
 	KEY_CYCLEWINDOWS,       /* MINIMIZE on Hauppauge */
 	0,
 	KEY_ENTER,              /* VCR mode on Zenith */
@@ -177,7 +102,7 @@
 	KEY_MENU,               /* FULL SCREEN on Hauppauge */
 	0,
 	/* 0x3X */
-	0,
+	KEY_SLOW,
 	KEY_PREVIOUS,           /* VCR mode on Zenith */
 	KEY_REWIND,
 	0,
@@ -189,7 +114,7 @@
 	KEY_C,
 	0,
 	KEY_EXIT,
-	0,
+	KEY_POWER2,
 	KEY_TUNER,              /* VCR mode on Zenith */
 	0,
 };
@@ -217,7 +142,7 @@
 	struct budget_ci *budget_ci = (struct budget_ci*) data;
 	struct saa7146_dev *saa = budget_ci->budget.dev;
 	struct input_dev *dev = &budget_ci->input_dev;
-	unsigned int code = irdebi(saa, DEBINOSWAP, 0x1234, 0, 2) >> 8;
+	unsigned int code = budget_debiread4(saa, DEBINOSWAP, 0x1234, 2) >> 8;
 
 	if (code & 0x40) {
 	        code &= 0x3f;
@@ -271,7 +196,7 @@
 
 	saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);
 
-	gpio_set(saa, 3, GPIO_IRQHI);
+	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); 
 
 	return 0;
 }
@@ -283,8 +208,8 @@
 	struct input_dev *dev = &budget_ci->input_dev;
 
 	saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06);
-	gpio_set(saa, 3, GPIO_INPUT);
-	gpio_set(saa, 2, GPIO_INPUT);
+	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
+	saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);
 
 	if (del_timer(&dev->timer))
 		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
diff -Nru a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h
--- a/drivers/media/dvb/ttpci/budget.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttpci/budget.h	Thu Jan  8 23:00:24 2004
@@ -64,8 +64,8 @@
 	.ext_priv = &x_var ## _info, \
 	.ext = &budget_extension };
 
-#define TS_WIDTH  (4*188)
-#define TS_HEIGHT (1024/4)
+#define TS_WIDTH  (376)
+#define TS_HEIGHT (512)
 #define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
 #define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
 
diff -Nru a/drivers/media/dvb/ttpci/fdump.c b/drivers/media/dvb/ttpci/fdump.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/fdump.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int main(int argc, char **argv)
+{
+    unsigned char buf[8];
+    unsigned int i, count, bytes = 0;
+    FILE *fd_in, *fd_out;
+
+    if (argc != 4) {
+	fprintf(stderr, "\n\tusage: %s <ucode.bin> <array_name> <output_name>\n\n", argv[0]);
+	return -1;
+    }
+
+    fd_in = fopen(argv[1], "rb");
+    if (fd_in == NULL) {
+	fprintf(stderr, "firmware file '%s' not found\n", argv[1]);
+	return -1;
+    }
+
+    fd_out = fopen(argv[3], "w+");
+    if (fd_out == NULL) {
+	fprintf(stderr, "cannot create output file '%s'\n", argv[3]);
+	return -1;
+    }
+
+    fprintf(fd_out, "\n#include <asm/types.h>\n\nu8 %s [] = {", argv[2]);
+
+    while ((count = fread(buf, 1, 8, fd_in)) > 0) {
+	fprintf(fd_out, "\n\t");
+	for (i = 0; i < count; i++, bytes++)
+	    fprintf(fd_out, "0x%02x, ", buf[i]);
+    }
+
+    fprintf(fd_out, "\n};\n\n");
+    
+    fclose(fd_in);
+    fclose(fd_out);
+
+    return 0;
+}
diff -Nru a/drivers/media/dvb/ttpci/ttpci-eeprom.c b/drivers/media/dvb/ttpci/ttpci-eeprom.c
--- a/drivers/media/dvb/ttpci/ttpci-eeprom.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttpci/ttpci-eeprom.c	Thu Jan  8 23:00:24 2004
@@ -142,3 +142,9 @@
 }
 
 EXPORT_SYMBOL(ttpci_eeprom_parse_mac);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
+MODULE_DESCRIPTION("Decode dvb_net MAC address from EEPROM of PCI DVB cards "
+		"made by Siemens, Technotrend, Hauppauge");
+
diff -Nru a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	Thu Jan  8 23:00:24 2004
@@ -2,7 +2,7 @@
  * TTUSB DVB driver
  *
  * Copyright (c) 2002 Holger Waechtler <holger@convergence.de>
- * Copyright (c) 2003 Felix Domke <tmbinc@gmx.net>
+ * Copyright (c) 2003 Felix Domke <tmbinc@elitedvb.net>
  *
  *	This program is free software; you can redistribute it and/or
  *	modify it under the terms of the GNU General Public License as
@@ -742,11 +742,7 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_iso_irq(struct urb *urb)
-#else
 static void ttusb_iso_irq(struct urb *urb, struct pt_regs *ptregs)
-#endif
 {
 	struct ttusb *ttusb = urb->context;
 
@@ -787,9 +783,7 @@
 			ttusb_process_frame(ttusb, data, len);
 		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	usb_submit_urb(urb, GFP_ATOMIC);
-#endif
 }
 
 static void ttusb_free_iso_urbs(struct ttusb *ttusb)
@@ -879,13 +873,6 @@
 		}
 	}
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	for (i = 0; i < ISO_BUF_COUNT; i++) {
-		int next = (i + 1) % ISO_BUF_COUNT;
-		ttusb->iso_urb[i]->next = ttusb->iso_urb[next];
-	}
-#endif
-
 	for (i = 0; i < ISO_BUF_COUNT; i++) {
 		if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_KERNEL))) {
 			ttusb_stop_iso_xfer(ttusb);
@@ -1076,22 +1063,6 @@
 };
 #endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void *ttusb_probe(struct usb_device *udev, unsigned int ifnum,
-		  const struct usb_device_id *id)
-{
-	struct ttusb *ttusb;
-	int result, channel;
-
-	if (ifnum != 0)
-		return NULL;
-
-	dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
-
-	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
-		return NULL;
-
-#else
 static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
 	struct usb_device *udev;
@@ -1105,8 +1076,6 @@
 	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
 		return -ENOMEM;
 
-#endif
-
 	memset(ttusb, 0, sizeof(struct ttusb));
 
 	for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel) {
@@ -1180,35 +1149,22 @@
 			   S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
 			   | S_IROTH | S_IWOTH, &stc_fops, ttusb);
 #endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	return (void *) ttusb;
-#else
+
 	usb_set_intfdata(intf, (void *) ttusb);
 
 	return 0;
-#endif
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_disconnect(struct usb_device *udev, void *data)
-{
-	struct ttusb *ttusb = data;
-#else
 static void ttusb_disconnect(struct usb_interface *intf)
 {
 	struct ttusb *ttusb = usb_get_intfdata(intf);
 
 	usb_set_intfdata(intf, NULL);
-#endif
 
 	ttusb->disconnecting = 1;
 
 	ttusb_stop_iso_xfer(ttusb);
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
-#undef devfs_remove
-#define devfs_remove(x)	devfs_unregister(ttusb->stc_devfs_handle);
-#endif
 #if 0
 	devfs_remove(TTUSB_BUDGET_NAME);
 #endif
diff -Nru a/drivers/media/dvb/ttusb-dec/Kconfig b/drivers/media/dvb/ttusb-dec/Kconfig
--- a/drivers/media/dvb/ttusb-dec/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/media/dvb/ttusb-dec/Kconfig	Thu Jan  8 23:00:23 2004
@@ -1,24 +1,18 @@
 config DVB_TTUSB_DEC
-	tristate "Technotrend/Hauppauge USB DEC2000-T devices"
-	depends on DVB_CORE && USB && !STANDALONE
+	tristate "Technotrend/Hauppauge USB DEC devices"
+	depends on DVB_CORE && USB
+	select FW_LOADER
 	help
 	  Support for external USB adapters designed by Technotrend and
-	  produced by Hauppauge, shipped under the brand name 'DEC2000-T'.
+	  produced by Hauppauge, shipped under the brand name 'DEC2000-t'
+	  and 'DEC3000-s'.
 
           Even if these devices have a MPEG decoder built in, they transmit
 	  only compressed MPEG data over the USB bus, so you need
 	  an external software decoder to watch TV on your computer.	  
 
-	  Say Y if you own such a device and want to use it.
+	  The DEC devices require firmware in order to boot into a mode in
+	  which they are slaves to the PC.  See
+	  linux/Documentation/dvb/ttusb-dec.txt for details.
 
-config DVB_TTUSB_DEC_FIRMWARE_FILE
-	string "Full pathname of dec2000t.bin firmware file"
-	depends on DVB_TTUSB_DEC
-	default "/etc/dvb/dec2000t.bin"
-	help
-	  The DEC2000-T requires a firmware in order to boot into a mode in
-	  which it is a slave to the PC.  The firmware file can obtained as
-	  follows:
-	    wget http://hauppauge.lightpath.net/de/dec215a.exe
-	    unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
-	    mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+	  Say Y if you own such a device and want to use it.
diff -Nru a/drivers/media/dvb/ttusb-dec/Makefile b/drivers/media/dvb/ttusb-dec/Makefile
--- a/drivers/media/dvb/ttusb-dec/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttusb-dec/Makefile	Thu Jan  8 23:00:24 2004
@@ -1,11 +1,3 @@
-
-obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o dec2000_frontend.o
+obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
-
-host-progs	:= fdump
-
-$(obj)/ttusb_dec.o: $(obj)/dsp_dec2000.h
-
-$(obj)/dsp_dec2000.h: $(patsubst "%", %, $(CONFIG_DVB_TTUSB_DEC_FIRMWARE_FILE)) $(obj)/fdump
-	$(obj)/fdump $< dsp_dec2000 > $@
diff -Nru a/drivers/media/dvb/ttusb-dec/dec2000_frontend.c b/drivers/media/dvb/ttusb-dec/dec2000_frontend.c
--- a/drivers/media/dvb/ttusb-dec/dec2000_frontend.c	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,178 +0,0 @@
-/*
- * TTUSB DEC-2000-t Frontend
- *
- * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include "dvb_frontend.h"
-#include "dvb_functions.h"
-
-static int debug = 0;
-
-#define dprintk	if (debug) printk
-
-static struct dvb_frontend_info dec2000_frontend_info = {
-	.name			= "TechnoTrend/Hauppauge DEC-2000-t Frontend",
-	.type			= FE_OFDM,
-	.frequency_min		= 51000000,
-	.frequency_max		= 858000000,
-	.frequency_stepsize	= 62500,
-	.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-		FE_CAN_HIERARCHY_AUTO,
-};
-
-static int dec2000_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
-				  void *arg)
-{
-	dprintk("%s\n", __FUNCTION__);
-
-	switch (cmd) {
-
-	case FE_GET_INFO:
-		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
-		memcpy(arg, &dec2000_frontend_info,
-		       sizeof (struct dvb_frontend_info));
-		break;
-
-	case FE_READ_STATUS: {
-			fe_status_t *status = (fe_status_t *)arg;
-			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
-			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
-				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
-			break;
-		}
-
-	case FE_READ_BER: {
-			u32 *ber = (u32 *)arg;
-			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
-			*ber = 0;
-			return -ENOSYS;
-			break;
-		}
-
-	case FE_READ_SIGNAL_STRENGTH: {
-			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
-			*(s32 *)arg = 0xFF;
-			return -ENOSYS;
-			break;
-		}
-
-	case FE_READ_SNR:
-		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
-		*(s32 *)arg = 0;
-		return -ENOSYS;
-		break;
-
-	case FE_READ_UNCORRECTED_BLOCKS:
-		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
-		*(u32 *)arg = 0;
-		return -ENOSYS;
-		break;
-
-	case FE_SET_FRONTEND:{
-			struct dvb_frontend_parameters *p =
-				(struct dvb_frontend_parameters *)arg;
-			u8 b[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-				   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-				   0x00, 0xff, 0x00, 0x00, 0x00, 0xff };
-			u32 freq;
-			struct i2c_msg msg = { addr: 0x71, flags: 0, len:20 };
-
-			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
-
-			dprintk("            frequency->%d\n", p->frequency);
-			dprintk("            symbol_rate->%d\n",
-				p->u.qam.symbol_rate);
-			dprintk("            inversion->%d\n", p->inversion);
-
-			freq = htonl(p->frequency / 1000);
-			memcpy(&b[4], &freq, sizeof (int));
-			msg.buf = b;
-			fe->i2c->xfer(fe->i2c, &msg, 1);
-
-			break;
-		}
-
-	case FE_GET_FRONTEND:
-		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
-		break;
-
-	case FE_SLEEP:
-		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
-		return -ENOSYS;
-		break;
-
-	case FE_INIT:
-		dprintk("%s: FE_INIT\n", __FUNCTION__);
-		break;
-
-	case FE_RESET:
-		dprintk("%s: FE_RESET\n", __FUNCTION__);
-		break;
-
-	default:
-		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
-		return -EINVAL;
-
-	}
-
-	return 0;
-}
-
-static int dec2000_frontend_attach(struct dvb_i2c_bus *i2c, void **data)
-{
-	dprintk("%s\n", __FUNCTION__);
-
-	return dvb_register_frontend(dec2000_frontend_ioctl, i2c, NULL,
-			      &dec2000_frontend_info);
-}
-
-static void dec2000_frontend_detach(struct dvb_i2c_bus *i2c, void *data)
-{
-	dprintk("%s\n", __FUNCTION__);
-
-	dvb_unregister_frontend(dec2000_frontend_ioctl, i2c);
-}
-
-static int __init dec2000_frontend_init(void)
-{
-	return dvb_register_i2c_device(THIS_MODULE, dec2000_frontend_attach,
-				       dec2000_frontend_detach);
-}
-
-static void __exit dec2000_frontend_exit(void)
-{
-	dvb_unregister_i2c_device(dec2000_frontend_attach);
-}
-
-module_init(dec2000_frontend_init);
-module_exit(dec2000_frontend_exit);
-
-MODULE_DESCRIPTION("TechnoTrend/Hauppauge DEC-2000-t Frontend");
-MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org");
-MODULE_LICENSE("GPL");
-
-MODULE_PARM(debug, "i");
-MODULE_PARM_DESC(debug, "Debug level");
-
diff -Nru a/drivers/media/dvb/ttusb-dec/fdump.c b/drivers/media/dvb/ttusb-dec/fdump.c
--- a/drivers/media/dvb/ttusb-dec/fdump.c	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,36 +0,0 @@
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-
-int main (int argc, char **argv)
-{
-	unsigned char buf[8];
-	unsigned int i, count, bytes = 0;
-	int fd;
-
-	if (argc != 3) {
-		fprintf (stderr, "\n\tusage: %s <ucode.bin> <array_name>\n\n",
-			 argv[0]);
-		return -1;
-	}
-
-	fd = open (argv[1], O_RDONLY);
-
-	printf ("\n#include <asm/types.h>\n\nu8 %s [] __initdata = {",
-		argv[2]);
-
-	while ((count = read (fd, buf, 8)) > 0) {
-		printf ("\n\t");
-		for (i=0;i<count;i++, bytes++)
-			printf ("0x%02x, ", buf[i]);
-	}
-
-	printf ("\n};\n\n");
-	close (fd);
-
-	return 0;
-}
-
diff -Nru a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c	Thu Jan  8 23:00:24 2004
@@ -19,19 +19,154 @@
  *
  */
 
-#include <linux/version.h>
+#include <asm/semaphore.h>
+#include <linux/list.h>
 #include <linux/module.h>
+#include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/spinlock.h>
 #include <linux/usb.h>
+#include <linux/version.h>
+#include <linux/interrupt.h>
+#include <linux/firmware.h>
 
-#include "ttusb_dec.h"
+#include "dmxdev.h"
+#include "dvb_demux.h"
+#include "dvb_i2c.h"
+#include "dvb_filter.h"
 #include "dvb_frontend.h"
+#include "dvb_net.h"
 
 static int debug = 0;
 
 #define dprintk	if (debug) printk
 
+#define DRIVER_NAME		"TechnoTrend/Hauppauge DEC USB"
+
+#define COMMAND_PIPE		0x03
+#define RESULT_PIPE		0x84
+#define STREAM_PIPE		0x88
+
+#define COMMAND_PACKET_SIZE	0x3c
+#define ARM_PACKET_SIZE		0x1000
+
+#define ISO_BUF_COUNT		0x04
+#define FRAMES_PER_ISO_BUF	0x04
+#define ISO_FRAME_SIZE		0x0380
+
+#define	MAX_AV_PES_LENGTH	6144
+
+#define LOF_HI			10600000
+#define LOF_LO			9750000
+
+enum ttusb_dec_model {
+	TTUSB_DEC2000T,
+	TTUSB_DEC3000S
+};
+
+enum ttusb_dec_packet_type {
+	PACKET_AV_PES,
+	PACKET_SECTION
+};
+
+struct ttusb_dec {
+	enum ttusb_dec_model		model;
+	char				*model_name;
+	char				*firmware_name;
+
+	/* DVB bits */
+	struct dvb_adapter		*adapter;
+	struct dmxdev			dmxdev;
+	struct dvb_demux		demux;
+	struct dmx_frontend		frontend;
+	struct dvb_i2c_bus		i2c_bus;
+	struct dvb_net			dvb_net;
+	struct dvb_frontend_info	*frontend_info;
+	int (*frontend_ioctl) (struct dvb_frontend *, unsigned int, void *);
+
+	u16			pid[DMX_PES_OTHER];
+	int			hi_band;
+
+	/* USB bits */
+	struct usb_device	*udev;
+	u8			trans_count;
+	unsigned int		command_pipe;
+	unsigned int		result_pipe;
+	unsigned int		stream_pipe;
+	int			interface;
+	struct semaphore	usb_sem;
+
+	void			*iso_buffer;
+	dma_addr_t		iso_dma_handle;
+	struct urb		*iso_urb[ISO_BUF_COUNT];
+	int			iso_stream_count;
+	struct semaphore	iso_sem;
+
+	u8				packet[MAX_AV_PES_LENGTH + 4];
+	enum ttusb_dec_packet_type	packet_type;
+	int				packet_state;
+	int				packet_length;
+	int				packet_payload_length;
+
+	int				av_pes_stream_count;
+	int				filter_stream_count;
+
+	struct dvb_filter_pes2ts	a_pes2ts;
+	struct dvb_filter_pes2ts	v_pes2ts;
+
+	u8			v_pes[16 + MAX_AV_PES_LENGTH];
+	int			v_pes_length;
+	int			v_pes_postbytes;
+
+	struct list_head	urb_frame_list;
+	struct tasklet_struct	urb_tasklet;
+	spinlock_t		urb_frame_list_lock;
+
+	struct list_head	filter_info_list;
+	spinlock_t		filter_info_list_lock;
+
+	int			active; /* Loaded successfully */
+};
+
+struct urb_frame {
+	u8			data[ISO_FRAME_SIZE];
+	int			length;
+	struct list_head	urb_frame_list;
+};
+
+struct filter_info {
+	u8			stream_id;
+	struct dvb_demux_filter	*filter;
+	struct list_head	filter_info_list;
+};
+
+static struct dvb_frontend_info dec2000t_frontend_info = {
+	.name			= "TechnoTrend/Hauppauge DEC2000-t Frontend",
+	.type			= FE_OFDM,
+	.frequency_min		= 51000000,
+	.frequency_max		= 858000000,
+	.frequency_stepsize	= 62500,
+	.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+		FE_CAN_HIERARCHY_AUTO,
+};
+
+static struct dvb_frontend_info dec3000s_frontend_info = {
+	.name			= "TechnoTrend/Hauppauge DEC3000-s Frontend",
+	.type			= FE_QPSK,
+	.frequency_min		= 950000,
+	.frequency_max		= 2150000,
+	.frequency_stepsize	= 125,
+	.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+		FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+		FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+		FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+		FE_CAN_HIERARCHY_AUTO,
+};
+
 static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
 				  int param_length, const u8 params[],
 				  int *result_length, u8 cmd_result[])
@@ -62,8 +197,8 @@
 		printk("\n");
 	}
 
-	result = usb_bulk_msg(dec->udev, dec->command_pipe, b, sizeof(b),
-			      &actual_len, HZ);
+	result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
+			      sizeof(b), &actual_len, HZ);
 
 	if (result) {
 		printk("%s: command bulk message failed: error %d\n",
@@ -72,8 +207,8 @@
 		return result;
 	}
 
-	result = usb_bulk_msg(dec->udev, dec->result_pipe, c, sizeof(c),
-			      &actual_len, HZ);
+	result = usb_bulk_msg(dec->udev, dec->result_pipe, c,
+			      sizeof(c), &actual_len, HZ);
 
 	if (result) {
 		printk("%s: result bulk message failed: error %d\n",
@@ -110,8 +245,9 @@
 
 static void ttusb_dec_set_pids(struct ttusb_dec *dec)
 {
-	u8 b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-		   0xff, 0xff };
+	u8 b[] = { 0x00, 0x00, 0x00, 0x00,
+		   0x00, 0x00, 0xff, 0xff,
+		   0xff, 0xff, 0xff, 0xff };
 
 	u16 pcr = htons(dec->pid[DMX_PES_PCR]);
 	u16 audio = htons(dec->pid[DMX_PES_AUDIO]);
@@ -129,55 +265,20 @@
 				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
 		dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
 				       ttusb_dec_av_pes2ts_cb, dec->demux.feed);
-}
-
-static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
-				     const struct i2c_msg msgs[], int num)
-{
-	int result, i;
-
-	dprintk("%s\n", __FUNCTION__);
-
-	for (i = 0; i < num; i++)
-		if ((result = ttusb_dec_send_command(i2c->data, msgs[i].addr,
-						     msgs[i].len, msgs[i].buf,
-						     NULL, NULL)))
-			return result;
-
-	return 0;
+	dec->v_pes_length = 0;
+	dec->v_pes_postbytes = 0;
 }
 
 static void ttusb_dec_process_av_pes(struct ttusb_dec * dec, u8 * av_pes,
 				     int length)
 {
-	int i;
-	u16 csum = 0;
-	u8 c;
-
-	if (length < 16) {
-		printk("%s: packet too short.\n", __FUNCTION__);
+	if (length < 8) {
+		printk("%s: packet too short - discarding\n", __FUNCTION__);
 		return;
 	}
 
-	for (i = 0; i < length; i += 2) {
-		csum ^= le16_to_cpup((u16 *)(av_pes + i));
-		c = av_pes[i];
-		av_pes[i] = av_pes[i + 1];
-		av_pes[i + 1] = c;
-	}
-
-	if (csum) {
-		printk("%s: checksum failed.\n", __FUNCTION__);
-		return;
-	}
-
-	if (length > 8 + MAX_AV_PES_LENGTH + 4) {
-		printk("%s: packet too long.\n", __FUNCTION__);
-		return;
-	}
-
-	if (!(av_pes[0] == 'A' && av_pes[1] == 'V')) {
-		printk("%s: invalid AV_PES packet.\n", __FUNCTION__);
+	if (length > 8 + MAX_AV_PES_LENGTH) {
+		printk("%s: packet too long - discarding\n", __FUNCTION__);
 		return;
 	}
 
@@ -194,15 +295,14 @@
 				       &av_pes[12], prebytes);
 
 				dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-						  dec->v_pes_length + prebytes);
+					  dec->v_pes_length + prebytes, 1);
 			}
 
 			if (av_pes[5] & 0x10) {
 				dec->v_pes[7] = 0x80;
 				dec->v_pes[8] = 0x05;
 
-				dec->v_pes[9] = 0x21 |
-						((av_pes[8] & 0xc0) >> 5);
+			dec->v_pes[9] = 0x21 | ((av_pes[8] & 0xc0) >> 5);
 				dec->v_pes[10] = ((av_pes[8] & 0x3f) << 2) |
 						 ((av_pes[9] & 0xc0) >> 6);
 				dec->v_pes[11] = 0x01 |
@@ -210,18 +310,17 @@
 						 ((av_pes[10] & 0x80) >> 6);
 				dec->v_pes[12] = ((av_pes[10] & 0x7f) << 1) |
 						 ((av_pes[11] & 0xc0) >> 7);
-				dec->v_pes[13] = 0x01 |
-						 ((av_pes[11] & 0x7f) << 1);
+			dec->v_pes[13] = 0x01 | ((av_pes[11] & 0x7f) << 1);
 
 				memcpy(&dec->v_pes[14], &av_pes[12 + prebytes],
-				       length - 16 - prebytes);
-				dec->v_pes_length = 14 + length - 16 - prebytes;
+			       length - 12 - prebytes);
+			dec->v_pes_length = 14 + length - 12 - prebytes;
 			} else {
 				dec->v_pes[7] = 0x00;
 				dec->v_pes[8] = 0x00;
 
-				memcpy(&dec->v_pes[9], &av_pes[8], length - 12);
-				dec->v_pes_length = 9 + length - 12;
+			memcpy(&dec->v_pes[9], &av_pes[8], length - 8);
+			dec->v_pes_length = 9 + length - 8;
 			}
 
 			dec->v_pes_postbytes = postbytes;
@@ -239,106 +338,208 @@
 
 			if (postbytes == 0)
 				dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-							  dec->v_pes_length);
+						  dec->v_pes_length, 1);
 
 			break;
 		}
 
 	case 0x02:		/* MainAudioStream */
-		dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12);
+		dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 8,
+				  av_pes[5] & 0x10);
 		break;
 
 	default:
 		printk("%s: unknown AV_PES type: %02x.\n", __FUNCTION__,
 		       av_pes[2]);
 		break;
+	}
+}
+
+static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet,
+				     int length)
+{
+	struct list_head *item;
+	struct filter_info *finfo;
+	struct dvb_demux_filter *filter = NULL;
+	unsigned long flags;
+	u8 sid;
 
+	sid = packet[1];
+	spin_lock_irqsave(&dec->filter_info_list_lock, flags);
+	for (item = dec->filter_info_list.next; item != &dec->filter_info_list;
+	     item = item->next) {
+		finfo = list_entry(item, struct filter_info, filter_info_list);
+		if (finfo->stream_id == sid) {
+			filter = finfo->filter;
+			break;
+		}
+	}
+	spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
+
+	if (filter)
+		filter->feed->cb.sec(&packet[2], length - 2, NULL, 0,
+				     &filter->filter, DMX_OK);
+}
+
+static void ttusb_dec_process_packet(struct ttusb_dec *dec)
+{
+	int i;
+	u16 csum = 0;
+
+	if (dec->packet_length % 2) {
+		printk("%s: odd sized packet - discarding\n", __FUNCTION__);
+		return;
+	}
+
+	for (i = 0; i < dec->packet_length; i += 2)
+		csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]);
+
+	if (csum) {
+		printk("%s: checksum failed - discarding\n", __FUNCTION__);
+		return;
+	}
+
+	switch (dec->packet_type) {
+	case PACKET_AV_PES:
+		if (dec->av_pes_stream_count)
+			ttusb_dec_process_av_pes(dec, dec->packet,
+						 dec->packet_payload_length);
+		break;
+
+	case PACKET_SECTION:
+		if (dec->filter_stream_count)
+			ttusb_dec_process_filter(dec, dec->packet,
+						 dec->packet_payload_length);
+		break;
+	}
+}
+
+static void swap_bytes(u8 *b, int length)
+{
+	u8 c;
+
+	length -= length % 2;
+	for (; length; b += 2, length -= 2) {
+		c = *b;
+		*b = *(b + 1);
+		*(b + 1) = c;
 	}
 }
 
 static void ttusb_dec_process_urb_frame(struct ttusb_dec * dec, u8 * b,
 					int length)
 {
+	swap_bytes(b, length);
+
 	while (length) {
-		switch (dec->av_pes_state) {
+		switch (dec->packet_state) {
 
 		case 0:
 		case 1:
+		case 2:
+			if (*b++ == 0xaa)
+				dec->packet_state++;
+			else
+				dec->packet_state = 0;
+
+			length--;
+			break;
+
 		case 3:
-			if (*b++ == 0xaa) {
-				dec->av_pes_state++;
-				if (dec->av_pes_state == 4)
-					dec->av_pes_length = 0;
+			if (*b++ == 0x00) {
+				dec->packet_state++;
+				dec->packet_length = 0;
 			} else {
-				dec->av_pes_state = 0;
+				dec->packet_state = 0;
 			}
 
 			length--;
 			break;
 
-		case 2:
-			if (*b++ == 0x00) {
-				dec->av_pes_state++;
+		case 4:
+			dec->packet[dec->packet_length++] = *b++;
+
+			if (dec->packet_length == 3) {
+				if (dec->packet[0] == 'A' &&
+				    dec->packet[1] == 'V') {
+					dec->packet_type = PACKET_AV_PES;
+					dec->packet_state++;
+				} else if (dec->packet[0] == 'S') {
+					dec->packet_type = PACKET_SECTION;
+					dec->packet_state++;
 			} else {
-				dec->av_pes_state = 0;
+					dec->packet_state = 0;
+				}
 			}
 
 			length--;
 			break;
 
-		case 4:
-			dec->av_pes[dec->av_pes_length++] = *b++;
+		case 5:
+			dec->packet[dec->packet_length++] = *b++;
 
-			if (dec->av_pes_length == 8) {
-				dec->av_pes_state++;
-				dec->av_pes_payload_length = le16_to_cpup(
-						(u16 *)(dec->av_pes + 6));
+			if (dec->packet_type == PACKET_AV_PES &&
+			    dec->packet_length == 8) {
+				dec->packet_state++;
+				dec->packet_payload_length = 8 +
+					(dec->packet[6] << 8) +
+					dec->packet[7];
+			} else if (dec->packet_type == PACKET_SECTION &&
+				   dec->packet_length == 5) {
+				dec->packet_state++;
+				dec->packet_payload_length = 5 +
+					((dec->packet[3] & 0x0f) << 8) +
+					dec->packet[4];
 			}
 
 			length--;
 			break;
 
-		case 5: {
-				int remainder = dec->av_pes_payload_length +
-						8 - dec->av_pes_length;
+		case 6: {
+			int remainder = dec->packet_payload_length -
+					dec->packet_length;
 
 				if (length >= remainder) {
-					memcpy(dec->av_pes + dec->av_pes_length,
+				memcpy(dec->packet + dec->packet_length,
 					       b, remainder);
-					dec->av_pes_length += remainder;
+				dec->packet_length += remainder;
 					b += remainder;
 					length -= remainder;
-					dec->av_pes_state++;
+				dec->packet_state++;
 				} else {
-					memcpy(&dec->av_pes[dec->av_pes_length],
+				memcpy(&dec->packet[dec->packet_length],
 					       b, length);
-					dec->av_pes_length += length;
+				dec->packet_length += length;
 					length = 0;
 				}
 
 				break;
 			}
 
-		case 6:
-			dec->av_pes[dec->av_pes_length++] = *b++;
+		case 7: {
+			int tail = 4;
+
+			dec->packet[dec->packet_length++] = *b++;
 
-			if (dec->av_pes_length ==
-			    8 + dec->av_pes_payload_length + 4) {
-				ttusb_dec_process_av_pes(dec, dec->av_pes,
-							 dec->av_pes_length);
-				dec->av_pes_state = 0;
+			if (dec->packet_type == PACKET_SECTION &&
+			    dec->packet_payload_length % 2)
+				tail++;
+
+			if (dec->packet_length ==
+			    dec->packet_payload_length + tail) {
+				ttusb_dec_process_packet(dec);
+				dec->packet_state = 0;
 			}
 
 			length--;
 			break;
+		}
 
 		default:
 			printk("%s: illegal packet state encountered.\n",
 			       __FUNCTION__);
-			dec->av_pes_state = 0;
-
+			dec->packet_state = 0;
 		}
-
 	}
 }
 
@@ -367,11 +568,7 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_dec_process_urb(struct urb *urb)
-#else
 static void ttusb_dec_process_urb(struct urb *urb, struct pt_regs *ptregs)
-#endif
 {
 	struct ttusb_dec *dec = urb->context;
 
@@ -380,6 +577,7 @@
 
 		for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
 			struct usb_iso_packet_descriptor *d;
+
 			u8 *b;
 			int length;
 			struct urb_frame *frame;
@@ -412,10 +610,8 @@
 				urb->status);
 	}
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	if (dec->iso_stream_count)
 		usb_submit_urb(urb, GFP_ATOMIC);
-#endif
 }
 
 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
@@ -433,9 +629,8 @@
 		urb->complete = ttusb_dec_process_urb;
 		urb->pipe = dec->stream_pipe;
 		urb->transfer_flags = URB_ISO_ASAP;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 		urb->interval = 1;
-#endif
+
 		urb->number_of_packets = FRAMES_PER_ISO_BUF;
 		urb->transfer_buffer_length = ISO_FRAME_SIZE *
 					      FRAMES_PER_ISO_BUF;
@@ -462,12 +657,8 @@
 	dec->iso_stream_count--;
 
 	if (!dec->iso_stream_count) {
-		u8 b0[] = { 0x00 };
-
 		for (i = 0; i < ISO_BUF_COUNT; i++)
 			usb_unlink_urb(dec->iso_urb[i]);
-
-		ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
 	}
 
 	up(&dec->iso_sem);
@@ -495,15 +686,11 @@
 		return -EAGAIN;
 
 	if (!dec->iso_stream_count) {
-		u8 b0[] = { 0x05 };
-
-		ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
-
 		ttusb_dec_setup_urbs(dec);
 
 		for (i = 0; i < ISO_BUF_COUNT; i++) {
-			if ((result = usb_submit_urb(dec->iso_urb[i]
-						    , GFP_KERNEL))) {
+			if ((result = usb_submit_urb(dec->iso_urb[i],
+						     GFP_ATOMIC))) {
 				printk("%s: failed urb submission %d: "
 				       "error %d\n", __FUNCTION__, i, result);
 
@@ -517,7 +704,7 @@
 			}
 		}
 
-		dec->av_pes_state = 0;
+		dec->packet_state = 0;
 		dec->v_pes_postbytes = 0;
 	}
 
@@ -525,41 +712,17 @@
 
 	up(&dec->iso_sem);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ttusb_dec_set_streaming_interface(dec);
-#endif
-
 	return 0;
 }
 
-static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+static int ttusb_dec_start_ts_feed(struct dvb_demux_feed *dvbdmxfeed)
 {
 	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
 	struct ttusb_dec *dec = dvbdmx->priv;
+	u8 b0[] = { 0x05 };
 
 	dprintk("%s\n", __FUNCTION__);
 
-	if (!dvbdmx->dmx.frontend)
-		return -EINVAL;
-
-	dprintk("  pid: 0x%04X\n", dvbdmxfeed->pid);
-
-	switch (dvbdmxfeed->type) {
-
-	case DMX_TYPE_TS:
-		dprintk("  type: DMX_TYPE_TS\n");
-		break;
-
-	case DMX_TYPE_SEC:
-		dprintk("  type: DMX_TYPE_SEC\n");
-		break;
-
-	default:
-		dprintk("  type: unknown (%d)\n", dvbdmxfeed->type);
-		return -EINVAL;
-
-	}
-
 	dprintk("  ts_type:");
 
 	if (dvbdmxfeed->ts_type & TS_DECODER)
@@ -609,22 +772,151 @@
 
 	}
 
+	ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
+
+	dec->av_pes_stream_count++;
 	ttusb_dec_start_iso_xfer(dec);
 
 	return 0;
 }
 
-static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+static int ttusb_dec_start_sec_feed(struct dvb_demux_feed *dvbdmxfeed)
 {
 	struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
+	u8 b0[] = { 0x00, 0x00, 0x00, 0x01,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00, 0xff, 0x00, 0x00,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00 };
+	u16 pid;
+	u8 c[COMMAND_PACKET_SIZE];
+	int c_length;
+	int result;
+	struct filter_info *finfo;
+	unsigned long flags;
+	u8 x = 1;
+
+	dprintk("%s\n", __FUNCTION__);
+
+	pid = htons(dvbdmxfeed->pid);
+	memcpy(&b0[0], &pid, 2);
+	memcpy(&b0[4], &x, 1);
+	memcpy(&b0[5], &dvbdmxfeed->filter->filter.filter_value[0], 1);
+
+	result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0,
+					&c_length, c);
+
+	if (!result) {
+		if (c_length == 2) {
+			if (!(finfo = kmalloc(sizeof(struct filter_info),
+					      GFP_ATOMIC)))
+				return -ENOMEM;
+
+			finfo->stream_id = c[1];
+			finfo->filter = dvbdmxfeed->filter;
+
+			spin_lock_irqsave(&dec->filter_info_list_lock, flags);
+			list_add_tail(&finfo->filter_info_list,
+				      &dec->filter_info_list);
+			spin_unlock_irqrestore(&dec->filter_info_list_lock,
+					       flags);
+
+			dvbdmxfeed->priv = finfo;
+
+			dec->filter_stream_count++;
+			ttusb_dec_start_iso_xfer(dec);
+
+			return 0;
+		}
+
+		return -EAGAIN;
+	} else
+		return result;
+}
+
+static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
 
 	dprintk("%s\n", __FUNCTION__);
 
+	if (!dvbdmx->dmx.frontend)
+		return -EINVAL;
+
+	dprintk("  pid: 0x%04X\n", dvbdmxfeed->pid);
+
+	switch (dvbdmxfeed->type) {
+
+	case DMX_TYPE_TS:
+		return ttusb_dec_start_ts_feed(dvbdmxfeed);
+		break;
+
+	case DMX_TYPE_SEC:
+		return ttusb_dec_start_sec_feed(dvbdmxfeed);
+		break;
+
+	default:
+		dprintk("  type: unknown (%d)\n", dvbdmxfeed->type);
+		return -EINVAL;
+
+	}
+}
+
+static int ttusb_dec_stop_ts_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
+	u8 b0[] = { 0x00 };
+
+	ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
+
+	dec->av_pes_stream_count--;
+
 	ttusb_dec_stop_iso_xfer(dec);
 
 	return 0;
 }
 
+static int ttusb_dec_stop_sec_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
+	u8 b0[] = { 0x00, 0x00 };
+	struct filter_info *finfo = (struct filter_info *)dvbdmxfeed->priv;
+	unsigned long flags;
+
+	b0[1] = finfo->stream_id;
+	spin_lock_irqsave(&dec->filter_info_list_lock, flags);
+	list_del(&finfo->filter_info_list);
+	spin_unlock_irqrestore(&dec->filter_info_list_lock, flags);
+	kfree(finfo);
+	ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL);
+
+	dec->filter_stream_count--;
+
+	ttusb_dec_stop_iso_xfer(dec);
+
+	return 0;
+}
+
+static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+{
+	dprintk("%s\n", __FUNCTION__);
+
+	switch (dvbdmxfeed->type) {
+	case DMX_TYPE_TS:
+		return ttusb_dec_stop_ts_feed(dvbdmxfeed);
+		break;
+
+	case DMX_TYPE_SEC:
+		return ttusb_dec_stop_sec_feed(dvbdmxfeed);
+		break;
+	}
+
+	return 0;
+}
+
 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
 {
 	int i;
@@ -659,7 +951,7 @@
 	for (i = 0; i < ISO_BUF_COUNT; i++) {
 		struct urb *urb;
 
-		if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
+		if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
 			ttusb_dec_free_iso_urbs(dec);
 			return -ENOMEM;
 		}
@@ -669,13 +961,6 @@
 
 	ttusb_dec_setup_urbs(dec);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	for (i = 0; i < ISO_BUF_COUNT; i++) {
-		int next = (i + 1) % ISO_BUF_COUNT;
-		dec->iso_urb[i]->next = dec->iso_urb[next];
-	}
-#endif
-
 	return 0;
 }
 
@@ -711,20 +996,46 @@
 	ttusb_dec_alloc_iso_urbs(dec);
 }
 
-#include "dsp_dec2000.h"
-
 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
 {
 	int i, j, actual_len, result, size, trans_count;
-	u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xc8, 0x61,
-		    0x00 };
+	u8 b0[] = { 0x00, 0x00, 0x00, 0x00,
+		    0x00, 0x00, 0x00, 0x00,
+		    0x00, 0x00 };
 	u8 b1[] = { 0x61 };
 	u8 b[ARM_PACKET_SIZE];
-	u32 dsp_length = htonl(sizeof(dsp_dec2000));
+	u8 *firmware = NULL;
+	size_t firmware_size = 0;
+	u32 firmware_csum = 0;
+	u32 firmware_size_nl;
+	u32 firmware_csum_nl;
+	const struct firmware *fw_entry = NULL;
 
 	dprintk("%s\n", __FUNCTION__);
 
-	memcpy(b0, &dsp_length, 4);
+	if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev)) {
+		printk(KERN_ERR "%s: Firmware (%s) unavailable.\n",
+		       __FUNCTION__, dec->firmware_name);
+		return 1;
+	}
+
+	firmware = fw_entry->data;
+	firmware_size = fw_entry->size;
+
+	switch (dec->model) {
+		case TTUSB_DEC2000T:
+			firmware_csum = 0x1bc86100;
+			break;
+
+		case TTUSB_DEC3000S:
+			firmware_csum = 0x00000000;
+			break;
+	}
+
+	firmware_size_nl = htonl(firmware_size);
+	memcpy(b0, &firmware_size_nl, 4);
+	firmware_csum_nl = htonl(firmware_csum);
+	memcpy(&b0[6], &firmware_csum_nl, 4);
 
 	result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
 
@@ -734,8 +1045,8 @@
 	trans_count = 0;
 	j = 0;
 
-	for (i = 0; i < sizeof(dsp_dec2000); i += COMMAND_PACKET_SIZE) {
-		size = sizeof(dsp_dec2000) - i;
+	for (i = 0; i < firmware_size; i += COMMAND_PACKET_SIZE) {
+		size = firmware_size - i;
 		if (size > COMMAND_PACKET_SIZE)
 			size = COMMAND_PACKET_SIZE;
 
@@ -743,7 +1054,7 @@
 		b[j + 1] = trans_count++;
 		b[j + 2] = 0xf0;
 		b[j + 3] = size;
-		memcpy(&b[j + 4], &dsp_dec2000[i], size);
+		memcpy(&b[j + 4], &firmware[i], size);
 
 		j += COMMAND_PACKET_SIZE + 4;
 
@@ -764,7 +1075,7 @@
 	return result;
 }
 
-static void ttusb_dec_init_stb(struct ttusb_dec *dec)
+static int ttusb_dec_init_stb(struct ttusb_dec *dec)
 {
 	u8 c[COMMAND_PACKET_SIZE];
 	int c_length;
@@ -774,9 +1085,14 @@
 
 	result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
 
-	if (!result)
+	if (!result) {
 		if (c_length != 0x0c || (c_length == 0x0c && c[9] != 0x63))
-			ttusb_dec_boot_dsp(dec);
+			return ttusb_dec_boot_dsp(dec);
+		else
+			return 0;
+	}
+	else
+		return result;
 }
 
 static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
@@ -785,22 +1101,13 @@
 
 	dprintk("%s\n", __FUNCTION__);
 
-	if ((result = dvb_register_adapter(&dec->adapter, "dec2000")) < 0) {
+	if ((result = dvb_register_adapter(&dec->adapter, dec->model_name)) < 0) {
 		printk("%s: dvb_register_adapter failed: error %d\n",
 		       __FUNCTION__, result);
 
 		return result;
 	}
 
-	if (!(dec->i2c_bus = dvb_register_i2c_bus(ttusb_dec_i2c_master_xfer,
-						  dec, dec->adapter, 0))) {
-		printk("%s: dvb_register_i2c_bus failed\n", __FUNCTION__);
-
-		dvb_unregister_adapter(dec->adapter);
-
-		return -ENOMEM;
-	}
-
 	dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
 
 	dec->demux.priv = (void *)dec;
@@ -814,8 +1121,6 @@
 		printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
 		       result);
 
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -830,8 +1135,6 @@
 		       __FUNCTION__, result);
 
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -846,8 +1149,6 @@
 
 		dvb_dmxdev_release(&dec->dmxdev);
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -861,8 +1162,6 @@
 		dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
 		dvb_dmxdev_release(&dec->dmxdev);
 		dvb_dmx_release(&dec->demux);
-		dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-				       0);
 		dvb_unregister_adapter(dec->adapter);
 
 		return result;
@@ -882,7 +1181,6 @@
 	dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
 	dvb_dmxdev_release(&dec->dmxdev);
 	dvb_dmx_release(&dec->demux);
-	dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter, 0);
 	dvb_unregister_adapter(dec->adapter);
 }
 
@@ -914,35 +1212,282 @@
 	}
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void *ttusb_dec_probe(struct usb_device *udev, unsigned int ifnum,
-			     const struct usb_device_id *id)
+static int ttusb_dec_2000t_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
+				  void *arg)
 {
-	struct ttusb_dec *dec;
+	struct ttusb_dec *dec = fe->data;
 
 	dprintk("%s\n", __FUNCTION__);
 
-	if (ifnum != 0)
-		return NULL;
+	switch (cmd) {
+
+	case FE_GET_INFO:
+		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
+		memcpy(arg, dec->frontend_info,
+		       sizeof (struct dvb_frontend_info));
+		break;
+
+	case FE_READ_STATUS: {
+			fe_status_t *status = (fe_status_t *)arg;
+			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
+			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
+				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+			break;
+		}
+
+	case FE_READ_BER: {
+			u32 *ber = (u32 *)arg;
+			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
+			*ber = 0;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SIGNAL_STRENGTH: {
+			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
+			*(s32 *)arg = 0xFF;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SNR:
+		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
+		*(s32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_READ_UNCORRECTED_BLOCKS:
+		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
+		*(u32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_SET_FRONTEND: {
+			struct dvb_frontend_parameters *p =
+				(struct dvb_frontend_parameters *)arg;
+		u8 b[] = { 0x00, 0x00, 0x00, 0x03,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x01,
+			   0x00, 0x00, 0x00, 0xff,
+			   0x00, 0x00, 0x00, 0xff };
+			u32 freq;
+
+			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
+
+			dprintk("            frequency->%d\n", p->frequency);
+			dprintk("            symbol_rate->%d\n",
+				p->u.qam.symbol_rate);
+			dprintk("            inversion->%d\n", p->inversion);
+
+			freq = htonl(p->frequency / 1000);
+			memcpy(&b[4], &freq, sizeof (u32));
+			ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
+
+			break;
+		}
+
+	case FE_GET_FRONTEND:
+		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
+		break;
+
+	case FE_SLEEP:
+		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
+		return -ENOSYS;
+		break;
+
+	case FE_INIT:
+		dprintk("%s: FE_INIT\n", __FUNCTION__);
+		break;
+
+	case FE_RESET:
+		dprintk("%s: FE_RESET\n", __FUNCTION__);
+		break;
+
+	default:
+		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
+		return -EINVAL;
 
-	if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
-		printk("%s: couldn't allocate memory.\n", __FUNCTION__);
-		return NULL;
 	}
 
-	memset(dec, 0, sizeof(struct ttusb_dec));
+	return 0;
+}
 
-	dec->udev = udev;
+static int ttusb_dec_3000s_frontend_ioctl(struct dvb_frontend *fe,
+					  unsigned int cmd, void *arg)
+{
+	struct ttusb_dec *dec = fe->data;
 
-	ttusb_dec_init_usb(dec);
-	ttusb_dec_init_stb(dec);
-	ttusb_dec_init_dvb(dec);
-	ttusb_dec_init_v_pes(dec);
-	ttusb_dec_init_tasklet(dec);
+	dprintk("%s\n", __FUNCTION__);
+
+	switch (cmd) {
+
+	case FE_GET_INFO:
+		dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
+		memcpy(arg, dec->frontend_info,
+		       sizeof (struct dvb_frontend_info));
+		break;
+
+	case FE_READ_STATUS: {
+			fe_status_t *status = (fe_status_t *)arg;
+			dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
+			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
+				  FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+			break;
+		}
+
+	case FE_READ_BER: {
+			u32 *ber = (u32 *)arg;
+			dprintk("%s: FE_READ_BER\n", __FUNCTION__);
+			*ber = 0;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SIGNAL_STRENGTH: {
+			dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
+			*(s32 *)arg = 0xFF;
+			return -ENOSYS;
+			break;
+		}
+
+	case FE_READ_SNR:
+		dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
+		*(s32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_READ_UNCORRECTED_BLOCKS:
+		dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
+		*(u32 *)arg = 0;
+		return -ENOSYS;
+		break;
+
+	case FE_SET_FRONTEND: {
+			struct dvb_frontend_parameters *p =
+				(struct dvb_frontend_parameters *)arg;
+		u8 b[] = { 0x00, 0x00, 0x00, 0x01,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x01,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x0d,
+			   0x00, 0x00, 0x00, 0x00,
+			   0x00, 0x00, 0x00, 0x00 };
+			u32 freq;
+			u32 sym_rate;
+			u32 band;
+
+
+			dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
+
+			dprintk("            frequency->%d\n", p->frequency);
+			dprintk("            symbol_rate->%d\n",
+				p->u.qam.symbol_rate);
+			dprintk("            inversion->%d\n", p->inversion);
+
+		freq = htonl(p->frequency * 1000 +
+		       (dec->hi_band ? LOF_HI : LOF_LO));
+			memcpy(&b[4], &freq, sizeof(u32));
+			sym_rate = htonl(p->u.qam.symbol_rate);
+			memcpy(&b[12], &sym_rate, sizeof(u32));
+			band = htonl(dec->hi_band ? LOF_HI : LOF_LO);
+			memcpy(&b[24], &band, sizeof(u32));
+
+			ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
+
+			break;
+		}
+
+	case FE_GET_FRONTEND:
+		dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
+		break;
+
+	case FE_SLEEP:
+		dprintk("%s: FE_SLEEP\n", __FUNCTION__);
+		return -ENOSYS;
+		break;
+
+	case FE_INIT:
+		dprintk("%s: FE_INIT\n", __FUNCTION__);
+		break;
+
+	case FE_RESET:
+		dprintk("%s: FE_RESET\n", __FUNCTION__);
+		break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+		dprintk("%s: FE_DISEQC_SEND_MASTER_CMD\n", __FUNCTION__);
+		break;
+
+	case FE_DISEQC_SEND_BURST:
+		dprintk("%s: FE_DISEQC_SEND_BURST\n", __FUNCTION__);
+		break;
+
+	case FE_SET_TONE: {
+			fe_sec_tone_mode_t tone = (fe_sec_tone_mode_t)arg;
+			dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
+			dec->hi_band = (SEC_TONE_ON == tone);
+			break;
+		}
+
+	case FE_SET_VOLTAGE:
+		dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
+		break;
+
+	default:
+		dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
+		return -EINVAL;
+
+	}
+
+	return 0;
+}
+
+static void ttusb_dec_init_frontend(struct ttusb_dec *dec)
+{
+	dec->i2c_bus.adapter = dec->adapter;
+
+	switch (dec->model) {
+		case TTUSB_DEC2000T:
+			dec->frontend_info = &dec2000t_frontend_info;
+			dec->frontend_ioctl = ttusb_dec_2000t_frontend_ioctl;
+			break;
+
+		case TTUSB_DEC3000S:
+			dec->frontend_info = &dec3000s_frontend_info;
+			dec->frontend_ioctl = ttusb_dec_3000s_frontend_ioctl;
+			break;
+	}
+
+	dvb_register_frontend(dec->frontend_ioctl, &dec->i2c_bus, (void *)dec,
+			      dec->frontend_info);
+}
+
+static void ttusb_dec_exit_frontend(struct ttusb_dec *dec)
+{
+	dvb_unregister_frontend(dec->frontend_ioctl, &dec->i2c_bus);
+}
+
+static void ttusb_dec_init_filters(struct ttusb_dec *dec)
+{
+	INIT_LIST_HEAD(&dec->filter_info_list);
+	dec->filter_info_list_lock = SPIN_LOCK_UNLOCKED;
+}
+
+static void ttusb_dec_exit_filters(struct ttusb_dec *dec)
+{
+	struct list_head *item;
+	struct filter_info *finfo;
 
-	return (void *)dec;
+	while ((item = dec->filter_info_list.next) != &dec->filter_info_list) {
+		finfo = list_entry(item, struct filter_info, filter_info_list);
+		list_del(&finfo->filter_info_list);
+		kfree(finfo);
+	}
 }
-#else
+
 static int ttusb_dec_probe(struct usb_interface *intf,
 			   const struct usb_device_id *id)
 {
@@ -958,48 +1503,67 @@
 		return -ENOMEM;
 	}
 
+	usb_set_intfdata(intf, (void *)dec);
+
 	memset(dec, 0, sizeof(struct ttusb_dec));
 
+	switch (id->idProduct) {
+		case 0x1006:
+			dec->model = TTUSB_DEC3000S;
+			dec->model_name = "DEC3000-s";
+		dec->firmware_name = "dvb-ttusb-dec-3000s-2.15a.fw";
+			break;
+
+		case 0x1008:
+			dec->model = TTUSB_DEC2000T;
+			dec->model_name = "DEC2000-t";
+		dec->firmware_name = "dvb-ttusb-dec-2000t-2.15a.fw";
+			break;
+	}
+
 	dec->udev = udev;
 
 	ttusb_dec_init_usb(dec);
-	ttusb_dec_init_stb(dec);
+	if (ttusb_dec_init_stb(dec)) {
+		ttusb_dec_exit_usb(dec);
+		return 0;
+	}
 	ttusb_dec_init_dvb(dec);
+	ttusb_dec_init_frontend(dec);
 	ttusb_dec_init_v_pes(dec);
+	ttusb_dec_init_filters(dec);
 	ttusb_dec_init_tasklet(dec);
 
-	usb_set_intfdata(intf, (void *)dec);
+	dec->active = 1;
+
 	ttusb_dec_set_streaming_interface(dec);
 
 	return 0;
 }
-#endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-static void ttusb_dec_disconnect(struct usb_device *udev, void *data)
-{
-	struct ttusb_dec *dec = data;
-#else
 static void ttusb_dec_disconnect(struct usb_interface *intf)
 {
 	struct ttusb_dec *dec = usb_get_intfdata(intf);
 
 	usb_set_intfdata(intf, NULL);
-#endif
 
 	dprintk("%s\n", __FUNCTION__);
 
+	if (dec->active) {
 	ttusb_dec_exit_tasklet(dec);
+		ttusb_dec_exit_filters(dec);
 	ttusb_dec_exit_usb(dec);
+		ttusb_dec_exit_frontend(dec);
 	ttusb_dec_exit_dvb(dec);
+	}
 
 	kfree(dec);
 }
 
 static struct usb_device_id ttusb_dec_table[] = {
-	{USB_DEVICE(0x0b48, 0x1006)},	/* Unconfirmed */
-	{USB_DEVICE(0x0b48, 0x1007)},	/* Unconfirmed */
-	{USB_DEVICE(0x0b48, 0x1008)},	/* DEC 2000 t */
+	{USB_DEVICE(0x0b48, 0x1006)},	/* DEC3000-s */
+	/*{USB_DEVICE(0x0b48, 0x1007)},	   Unconfirmed */
+	{USB_DEVICE(0x0b48, 0x1008)},	/* DEC2000-t */
 	{}
 };
 
diff -Nru a/drivers/media/dvb/ttusb-dec/ttusb_dec.h b/drivers/media/dvb/ttusb-dec/ttusb_dec.h
--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.h	Thu Jan  8 23:00:23 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,99 +0,0 @@
-/*
- * TTUSB DEC Driver
- *
- * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#ifndef _TTUSB_DEC_H
-#define _TTUSB_DEC_H
-
-#include <asm/semaphore.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include "dmxdev.h"
-#include "dvb_demux.h"
-#include "dvb_filter.h"
-#include "dvb_i2c.h"
-#include "dvb_net.h"
-
-#define DRIVER_NAME		"TechnoTrend/Hauppauge DEC USB"
-
-#define COMMAND_PIPE		0x03
-#define RESULT_PIPE		0x84
-#define STREAM_PIPE		0x88
-
-#define COMMAND_PACKET_SIZE	0x3c
-#define ARM_PACKET_SIZE		0x1000
-
-#define ISO_BUF_COUNT		0x04
-#define FRAMES_PER_ISO_BUF	0x04
-#define ISO_FRAME_SIZE		0x0380
-
-#define	MAX_AV_PES_LENGTH	6144
-
-struct ttusb_dec {
-	/* DVB bits */
-	struct dvb_adapter	*adapter;
-	struct dmxdev		dmxdev;
-	struct dvb_demux	demux;
-	struct dmx_frontend	frontend;
-	struct dvb_i2c_bus	*i2c_bus;
-	struct dvb_net		dvb_net;
-
-	u16			pid[DMX_PES_OTHER];
-
-	/* USB bits */
-	struct usb_device	*udev;
-	u8			trans_count;
-	unsigned int		command_pipe;
-	unsigned int		result_pipe;
-	unsigned int		stream_pipe;
-	int			interface;
-	struct semaphore	usb_sem;
-
-	void			*iso_buffer;
-	dma_addr_t		iso_dma_handle;
-	struct urb		*iso_urb[ISO_BUF_COUNT];
-	int			iso_stream_count;
-	struct semaphore	iso_sem;
-
-	u8			av_pes[MAX_AV_PES_LENGTH + 4];
-	int			av_pes_state;
-	int			av_pes_length;
-	int			av_pes_payload_length;
-
-	struct dvb_filter_pes2ts	a_pes2ts;
-	struct dvb_filter_pes2ts	v_pes2ts;
-
-	u8			v_pes[16 + MAX_AV_PES_LENGTH];
-	int			v_pes_length;
-	int			v_pes_postbytes;
-
-	struct list_head	urb_frame_list;
-	struct tasklet_struct	urb_tasklet;
-	spinlock_t		urb_frame_list_lock;
-};
-
-struct urb_frame {
-	u8			data[ISO_FRAME_SIZE];
-	int			length;
-	struct list_head	urb_frame_list;
-};
-
-#endif
diff -Nru a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c
--- a/drivers/media/video/video-buf.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/media/video/video-buf.c	Thu Jan  8 23:00:24 2004
@@ -1078,7 +1078,7 @@
  */
 static struct page*
 videobuf_vm_nopage(struct vm_area_struct *vma, unsigned long vaddr,
-		  int write_access)
+		  int *type)
 {
 	struct page *page;
 
@@ -1090,6 +1090,8 @@
 	if (!page)
 		return NOPAGE_OOM;
 	clear_user_page(page_address(page), vaddr, page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
diff -Nru a/drivers/message/fusion/isense.c b/drivers/message/fusion/isense.c
--- a/drivers/message/fusion/isense.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/message/fusion/isense.c	Thu Jan  8 23:00:24 2004
@@ -5,11 +5,11 @@
  *      Error Report logging output.  This module implements SCSI-3
  *      Opcode lookup and a sorted table of SCSI-3 ASC/ASCQ strings.
  *
- *  Copyright (c) 1991-2002 Steven J. Ralston
+ *  Copyright (c) 1991-2003 Steven J. Ralston
  *  Written By: Steven J. Ralston
  *  (yes I wrote some of the orig. code back in 1991!)
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: isense.c,v 1.33 2002/02/27 18:44:19 sralston Exp $
  */
@@ -66,7 +66,7 @@
 #endif
 
 #define MODULEAUTHOR "Steven J. Ralston"
-#define COPYRIGHT "Copyright (c) 2001-2002 " MODULEAUTHOR
+#define COPYRIGHT "Copyright (c) 2001-2003 " MODULEAUTHOR
 #include "mptbase.h"
 
 #include "isense.h"
diff -Nru a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c
--- a/drivers/message/fusion/mptbase.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/message/fusion/mptbase.c	Thu Jan  8 23:00:23 2004
@@ -44,10 +44,10 @@
  *      for gobs of hard work fixing and optimizing LAN code.
  *      THANK YOU!
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Originally By: Steven J. Ralston
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptbase.c,v 1.126 2002/12/16 15:28:45 pdelaney Exp $
  */
@@ -3138,7 +3138,7 @@
 {
 	int hard_reset_done = 0;
 	u32 ioc_state;
-	int cnt = 0;
+	int cntdn, cnt = 0;
 
 	dprintk((KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name));
 	if ((int)ioc->chip_type > (int)FC929) {
@@ -3161,7 +3161,8 @@
 	dprintk((MYIOC_s_INFO_FMT "Diagnostic reset successful!\n",
 			ioc->name));
 
-	for (cnt=0; cnt<HZ*20; cnt++) {
+	cntdn = ((sleepFlag == CAN_SLEEP) ? HZ : 1000) * 20;	/* 20 seconds */
+	for (cnt=0; cnt<cntdn; cnt++) {
 		if ((ioc_state = mpt_GetIocState(ioc, 1)) == MPI_IOC_STATE_READY) {
 			dprintk((MYIOC_s_INFO_FMT "KickStart successful! (cnt=%d)\n",
 					ioc->name, cnt));
diff -Nru a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h
--- a/drivers/message/fusion/mptbase.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/message/fusion/mptbase.h	Thu Jan  8 23:00:23 2004
@@ -8,10 +8,10 @@
  *  Credits:
  *     (see mptbase.c)
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Originally By: Steven J. Ralston
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptbase.h,v 1.144 2003/01/28 21:31:56 pdelaney Exp $
  */
@@ -77,11 +77,11 @@
 #endif
 
 #ifndef COPYRIGHT
-#define COPYRIGHT	"Copyright (c) 1999-2002 " MODULEAUTHOR
+#define COPYRIGHT	"Copyright (c) 1999-2003 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON	"2.05.00.03"
-#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-2.05.00.03"
+#define MPT_LINUX_VERSION_COMMON	"2.05.00.05"
+#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-2.05.00.05"
 #define WHAT_MAGIC_STRING		"@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
diff -Nru a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c
--- a/drivers/message/fusion/mptctl.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/message/fusion/mptctl.c	Thu Jan  8 23:00:23 2004
@@ -29,10 +29,10 @@
  *
  *      (see also mptbase.c)
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Originally By: Steven J. Ralston, Noah Romer
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptctl.c,v 1.63 2002/12/03 21:26:33 pdelaney Exp $
  */
@@ -91,7 +91,7 @@
 #include "../../scsi/scsi.h"
 #include "../../scsi/hosts.h"
 
-#define COPYRIGHT	"Copyright (c) 1999-2001 LSI Logic Corporation"
+#define COPYRIGHT	"Copyright (c) 1999-2003 LSI Logic Corporation"
 #define MODULEAUTHOR	"Steven J. Ralston, Noah Romer, Pamela Delaney"
 #include "mptbase.h"
 #include "mptctl.h"
@@ -2984,6 +2984,21 @@
 	/* De-register callback handler from base module */
 	mpt_deregister(mptctl_id);
 	printk(KERN_INFO MYNAM ": Deregistered from Fusion MPT base driver\n");
+
+#ifdef CONFIG_COMPAT
+	unregister_ioctl32_conversion(MPTIOCINFO);
+	unregister_ioctl32_conversion(MPTIOCINFO1);
+	unregister_ioctl32_conversion(MPTTARGETINFO);
+	unregister_ioctl32_conversion(MPTTEST);
+	unregister_ioctl32_conversion(MPTEVENTQUERY);
+	unregister_ioctl32_conversion(MPTEVENTENABLE);
+	unregister_ioctl32_conversion(MPTEVENTREPORT);
+	unregister_ioctl32_conversion(MPTHARDRESET);
+	unregister_ioctl32_conversion(MPTCOMMAND32);
+	unregister_ioctl32_conversion(MPTFWDOWNLOAD32);
+	unregister_ioctl32_conversion(HP_GETHOSTINFO);
+	unregister_ioctl32_conversion(HP_GETTARGETINFO);
+#endif
 
 	/* Free allocated memory */
 	for (i=0; i<MPT_MAX_ADAPTERS; i++) {
diff -Nru a/drivers/message/fusion/mptctl.h b/drivers/message/fusion/mptctl.h
--- a/drivers/message/fusion/mptctl.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/message/fusion/mptctl.h	Thu Jan  8 23:00:24 2004
@@ -15,10 +15,10 @@
  *
  *      (see also mptbase.c)
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Originally By: Steven J. Ralston
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptctl.h,v 1.13 2002/12/03 21:26:33 pdelaney Exp $
  */
diff -Nru a/drivers/message/fusion/mptlan.c b/drivers/message/fusion/mptlan.c
--- a/drivers/message/fusion/mptlan.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/message/fusion/mptlan.c	Thu Jan  8 23:00:24 2004
@@ -23,8 +23,9 @@
  *
  *      (see also mptbase.c)
  *
- *  Copyright (c) 2000-2002 LSI Logic Corporation
+ *  Copyright (c) 2000-2003 LSI Logic Corporation
  *  Originally By: Noah Romer
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptlan.c,v 1.53 2002/10/17 20:15:58 pdelaney Exp $
  */
diff -Nru a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c
--- a/drivers/message/fusion/mptscsih.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/message/fusion/mptscsih.c	Thu Jan  8 23:00:23 2004
@@ -21,10 +21,10 @@
  *
  *      (see mptbase.c)
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Original author: Steven J. Ralston
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptscsih.c,v 1.104 2002/12/03 21:26:34 pdelaney Exp $
  */
@@ -178,9 +178,12 @@
 static int	mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
 static void	mptscsih_timer_expired(unsigned long data);
 static void	mptscsih_taskmgmt_timeout(unsigned long data);
+static void	mptscsih_schedule_reset(void *hd);
 static int	mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd);
 static int	mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum);
 
+static struct mpt_work_struct   mptscsih_rstTask;
+
 #ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
 static int	mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io);
 static void	mptscsih_domainValidation(void *hd);
@@ -1058,7 +1061,7 @@
 					    SCpnt->use_sg, scsi_to_pci_dma_dir(SCpnt->sc_data_direction));
 			} else if (SCpnt->request_bufflen) {
 				scPrivate	*my_priv;
-		
+
 				my_priv = (scPrivate *) &SCpnt->SCp;
 				pci_unmap_single(hd->ioc->pcidev, (dma_addr_t)(ulong)my_priv->p1,
 					   SCpnt->request_bufflen,
@@ -2155,7 +2158,7 @@
 	MPT_SCSI_HOST	*hd = NULL;
 	int size = 0;
 
-	dprintk(("Called mptscsih_proc_info: hostno=%d, func=%d\n", hostno, func));
+	dprintk(("Called mptscsih_proc_info: hostno=%d, func=%d\n", host->host_no, func));
 	dprintk(("buffer %p, start=%p (%p) offset=%ld length = %d\n",
 			buffer, start, *start, offset, length));
 
@@ -2788,13 +2791,14 @@
 	MPT_FRAME_HDR	*mf;
 	u32		 ctx2abort;
 	int		 scpnt_idx;
+	spinlock_t	*host_lock = SCpnt->device->host->host_lock;
 
 	/* If we can't locate our host adapter structure, return FAILED status.
 	 */
 	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL) {
 		SCpnt->result = DID_RESET << 16;
 		SCpnt->scsi_done(SCpnt);
-		nehprintk((KERN_WARNING MYNAM ": mptscsih_abort: "
+		dtmprintk((KERN_WARNING MYNAM ": mptscsih_abort: "
 			   "Can't locate host! (sc=%p)\n",
 			   SCpnt));
 		return FAILED;
@@ -2816,7 +2820,7 @@
 
 		SCpnt->result = DID_RESET << 16;
 		SCpnt->scsi_done(SCpnt);
-		nehprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
+		dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
 			   "Command not in the active list! (sc=%p)\n",
 			   hd->ioc->name, SCpnt));
 		return SUCCESS;
@@ -2827,13 +2831,16 @@
 	 *  call to mptscsih_tm_pending_wait() will set the pending flag if we are
 	 *  successful.
 	 */
+	spin_unlock_irq(host_lock);
 	if (mptscsih_tm_pending_wait(hd) == FAILED){
-		nehprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
+		dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
 			   "Timed out waiting for previous TM to complete! "
 			   "(sc = %p)\n",
 			   hd->ioc->name, SCpnt));
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
+	spin_lock_irq(host_lock);
 
 	/* If this command is pended, then timeout/hang occurred
 	 * during DV. Post command and flush pending Q
@@ -2842,7 +2849,7 @@
 	if ((mf = mptscsih_search_pendingQ(hd, scpnt_idx)) != NULL) {
 		mptscsih_put_msgframe(ScsiDoneCtx, hd->ioc->id, mf);
 		post_pendingQ_commands(hd);
-		nehprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
+		dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_abort: "
 			   "Found command in pending queue! (sc=%p)\n",
 			   hd->ioc->name, SCpnt));
 	}
@@ -2858,8 +2865,10 @@
 	ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext;
 
 	hd->abortSCpnt = SCpnt;
+
+	spin_unlock_irq(host_lock);
 	if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
-	                       SCpnt->device->id, SCpnt->device->lun, ctx2abort, NO_SLEEP)
+	                       SCpnt->device->id, SCpnt->device->lun, ctx2abort, CAN_SLEEP)
 		< 0) {
 
 		/* The TM request failed and the subsequent FW-reload failed!
@@ -2873,8 +2882,10 @@
 		hd->tmPending = 0;
 		hd->tmState = TM_STATE_NONE;
 
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
+	spin_lock_irq(host_lock);
 	return FAILED;
 
 }
@@ -2892,11 +2903,12 @@
 mptscsih_dev_reset(Scsi_Cmnd * SCpnt)
 {
 	MPT_SCSI_HOST	*hd;
+	spinlock_t	*host_lock = SCpnt->device->host->host_lock;
 
 	/* If we can't locate our host adapter structure, return FAILED status.
 	 */
 	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-		nehprintk((KERN_WARNING MYNAM ": mptscsih_dev_reset: "
+		dtmprintk((KERN_WARNING MYNAM ": mptscsih_dev_reset: "
 			   "Can't locate host! (sc=%p)\n",
 			   SCpnt));
 		return FAILED;
@@ -2915,16 +2927,18 @@
 	 *  call to mptscsih_tm_pending_wait() will set the pending flag if we are
 	 *  successful.
 	 */
+	spin_unlock_irq(host_lock);
 	if (mptscsih_tm_pending_wait(hd) == FAILED) {
-		nehprintk((KERN_WARNING MYNAM ": %s: mptscsih_dev_reset: "
+		dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_dev_reset: "
 			   "Timed out waiting for previous TM to complete! "
 			   "(sc = %p)\n",
 			   hd->ioc->name, SCpnt));
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
 
 	if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
-	                       SCpnt->device->id, 0, 0, NO_SLEEP)
+	                       SCpnt->device->id, 0, 0, CAN_SLEEP)
 		< 0){
 		/* The TM request failed and the subsequent FW-reload failed!
 		 * Fatal error case.
@@ -2933,8 +2947,10 @@
 		 		hd->ioc->name, SCpnt);
 		hd->tmPending = 0;
 		hd->tmState = TM_STATE_NONE;
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
+	spin_lock_irq(host_lock);
 	return SUCCESS;
 
 }
@@ -2952,11 +2968,12 @@
 mptscsih_bus_reset(Scsi_Cmnd * SCpnt)
 {
 	MPT_SCSI_HOST	*hd;
+	spinlock_t	*host_lock = SCpnt->device->host->host_lock;
 
 	/* If we can't locate our host adapter structure, return FAILED status.
 	 */
 	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-		nehprintk((KERN_WARNING MYNAM ": mptscsih_bus_reset: "
+		dtmprintk((KERN_WARNING MYNAM ": mptscsih_bus_reset: "
 			   "Can't locate host! (sc=%p)\n",
 			   SCpnt ) );
 		return FAILED;
@@ -2973,17 +2990,19 @@
 	 *  call to mptscsih_tm_pending_wait() will set the pending flag if we are
 	 *  successful.
 	 */
+	spin_unlock_irq(host_lock);
 	if (mptscsih_tm_pending_wait(hd) == FAILED) {
-		nehprintk((KERN_WARNING MYNAM ": %s: mptscsih_bus_reset: "
+		dtmprintk((KERN_WARNING MYNAM ": %s: mptscsih_bus_reset: "
 			   "Timed out waiting for previous TM to complete! "
 			   "(sc = %p)\n",
 			   hd->ioc->name, SCpnt));
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
 
 	/* We are now ready to execute the task management request. */
 	if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
-	                       0, 0, 0, NO_SLEEP)
+	                       0, 0, 0, CAN_SLEEP)
 	    < 0){
 
 		/* The TM request failed and the subsequent FW-reload failed!
@@ -2994,9 +3013,10 @@
 		       hd->ioc->name, SCpnt);
 		hd->tmPending = 0;
 		hd->tmState = TM_STATE_NONE;
+		spin_lock_irq(host_lock);
 		return FAILED;
 	}
-
+	spin_lock_irq(host_lock);
 	return SUCCESS;
 }
 
@@ -3015,10 +3035,11 @@
 {
 	MPT_SCSI_HOST *  hd;
 	int              status = SUCCESS;
+	spinlock_t	*host_lock = SCpnt->device->host->host_lock;
 
 	/*  If we can't locate the host to reset, then we failed. */
 	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-		nehprintk( ( KERN_WARNING MYNAM ": mptscsih_host_reset: "
+		dtmprintk( ( KERN_WARNING MYNAM ": mptscsih_host_reset: "
 			     "Can't locate host! (sc=%p)\n",
 			     SCpnt ) );
 		return FAILED;
@@ -3032,7 +3053,8 @@
 	/*  If our attempts to reset the host failed, then return a failed
 	 *  status.  The host will be taken off line by the SCSI mid-layer.
 	 */
-	if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0){
+	spin_unlock_irq(host_lock);
+	if (mpt_HardResetHandler(hd->ioc, CAN_SLEEP) < 0){
 		status = FAILED;
 	} else {
 		/*  Make sure TM pending is cleared and TM state is set to
@@ -3041,9 +3063,10 @@
 		hd->tmPending = 0;
 		hd->tmState = TM_STATE_NONE;
 	}
+	spin_lock_irq(host_lock);
 
 
-	nehprintk( ( KERN_WARNING MYNAM ": mptscsih_host_reset: "
+	dtmprintk( ( KERN_WARNING MYNAM ": mptscsih_host_reset: "
 		     "Status = %s\n",
 		     (status == SUCCESS) ? "SUCCESS" : "FAILED" ) );
 
@@ -3075,7 +3098,8 @@
 			break;
 		}
 		spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags);
-		mdelay(250);
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(HZ/4);
 	} while (--loop_count);
 
 	return status;
@@ -4716,13 +4740,30 @@
 	/* Call the reset handler. Already had a TM request
 	 * timeout - so issue a diagnostic reset
 	 */
-	if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0) {
+	MPT_INIT_WORK(&mptscsih_rstTask, mptscsih_schedule_reset, (void *)hd);
+	SCHEDULE_TASK(&mptscsih_rstTask);
+	return;
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*	mptscsih_schedule_reset - Call back for timeout on a
+ *	task management request.
+ *	@data: Pointer to MPT_SCSI_HOST recast as an unsigned long
+ *
+ */
+static void
+mptscsih_schedule_reset(void *arg)
+{
+        MPT_SCSI_HOST           *hd;
+        hd = (MPT_SCSI_HOST *) arg;
+
+	if (mpt_HardResetHandler(hd->ioc, CAN_SLEEP) < 0) {
 		printk((KERN_WARNING " Firmware Reload FAILED!!\n"));
 	} else {
 		/* Because we have reset the IOC, no TM requests can be
 		 * pending.  So let's make sure the tmPending flag is reset.
 		 */
-		nehprintk((KERN_WARNING MYNAM
+		dtmprintk((KERN_WARNING MYNAM
 			   ": %s: mptscsih_taskmgmt_timeout\n",
 			   hd->ioc->name));
 		hd->tmPending = 0;
@@ -6900,7 +6941,7 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static int
-__init get_setup_token(char *p)
+get_setup_token(char *p)
 {
 	char *cur = setup_token;
 	char *pc;
@@ -6918,7 +6959,7 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static int
-__init mptscsih_setup(char *str)
+mptscsih_setup(char *str)
 {
 	char *cur = str;
 	char *pc, *pv;
diff -Nru a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h
--- a/drivers/message/fusion/mptscsih.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/message/fusion/mptscsih.h	Thu Jan  8 23:00:24 2004
@@ -15,10 +15,10 @@
  *
  *      (see also mptbase.c)
  *
- *  Copyright (c) 1999-2002 LSI Logic Corporation
+ *  Copyright (c) 1999-2003 LSI Logic Corporation
  *  Originally By: Steven J. Ralston
  *  (mailto:netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: mptscsih.h,v 1.21 2002/12/03 21:26:35 pdelaney Exp $
  */
diff -Nru a/drivers/message/fusion/scsi3.h b/drivers/message/fusion/scsi3.h
--- a/drivers/message/fusion/scsi3.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/message/fusion/scsi3.h	Thu Jan  8 23:00:23 2004
@@ -4,10 +4,10 @@
  *      (Ultimately) SCSI-3 definitions; for now, inheriting
  *      SCSI-2 definitions.
  *
- *  Copyright (c) 1996-2002 Steven J. Ralston
+ *  Copyright (c) 1996-2003 Steven J. Ralston
  *  Written By: Steven J. Ralston (19960517)
  *  (mailto:sjralston1@netscape.net)
- *  (mailto:Pam.Delaney@lsil.com)
+ *  (mailto:mpt_linux_developer@lsil.com)
  *
  *  $Id: scsi3.h,v 1.9 2002/02/27 18:45:02 sralston Exp $
  */
diff -Nru a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c
--- a/drivers/mtd/chips/jedec_probe.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/mtd/chips/jedec_probe.c	Thu Jan  8 23:00:24 2004
@@ -8,6 +8,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/init.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <asm/io.h>
@@ -15,6 +16,7 @@
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
+#include <linux/init.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
diff -Nru a/drivers/mtd/maps/sun_uflash.c b/drivers/mtd/maps/sun_uflash.c
--- a/drivers/mtd/maps/sun_uflash.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/mtd/maps/sun_uflash.c	Thu Jan  8 23:00:24 2004
@@ -95,8 +95,8 @@
 	if(0 != pdev->name && 0 < strlen(pdev->name)) {
 		pdev->map.name = pdev->name;
 	}
-	pdev->phys = edev->resource[0].start;
-	pdev->virt = 
+	pdev->map.phys = edev->resource[0].start;
+	pdev->map.virt = 
 		(unsigned long)ioremap_nocache(edev->resource[0].start, pdev->map.size);
 	if(0 == pdev->map.virt) {
 		printk("%s: failed to map device\n", __FUNCTION__);
diff -Nru a/drivers/net/8139too.c b/drivers/net/8139too.c
--- a/drivers/net/8139too.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/8139too.c	Thu Jan  8 23:00:23 2004
@@ -2475,10 +2475,11 @@
 	tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
 	RTL_W32 (RxMissed, 0);
 
+	spin_unlock_irqrestore (&tp->lock, flags);
+
 	pci_set_power_state (pdev, 3);
 	pci_save_state (pdev, tp->pci_state);
 
-	spin_unlock_irqrestore (&tp->lock, flags);
 	return 0;
 }
 
diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c
--- a/drivers/net/Space.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/Space.c	Thu Jan  8 23:00:23 2004
@@ -350,7 +350,7 @@
 	 * Backwards compatibility - historically an I/O base of 1 was 
 	 * used to indicate not to probe for this ethN interface 
 	 */
-	if (dev->base_addr == 1) {
+	if (__dev_get_by_name(dev->name) || dev->base_addr == 1) {
 		free_netdev(dev);
 		return -ENXIO;
 	}
diff -Nru a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
--- a/drivers/net/bonding/bond_main.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/bonding/bond_main.c	Thu Jan  8 23:00:24 2004
@@ -3910,7 +3910,6 @@
 
 		unregister_netdevice(dev);
 		bond_deinit(dev);
-		free_netdev(dev);
 	}
 
 #ifdef CONFIG_PROC_FS
@@ -4007,6 +4006,8 @@
 #ifdef CONFIG_PROC_FS
 	bond_create_proc_info(bond);
 #endif
+
+	dev->destructor = free_netdev;
 
 	list_add_tail(&bond->bond_list, &bond_dev_list);
 
diff -Nru a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c
--- a/drivers/net/cs89x0.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/cs89x0.c	Thu Jan  8 23:00:24 2004
@@ -47,7 +47,7 @@
                     : <klee@crystal.cirrus.com>)
                     : Don't call netif_wake_queue() in net_send_packet()
                     : Fixed an out-of-mem bug in dma_rx()
-                    : Updated Documentation/cs89x0.txt
+                    : Updated Documentation/networking/cs89x0.txt
 
   Andrew Morton     : andrewm@uow.edu.au / Kernel 2.3.99-pre1
                     : Use skb_reserve to longword align IP header (two places)
diff -Nru a/drivers/net/e100/e100_config.c b/drivers/net/e100/e100_config.c
--- a/drivers/net/e100/e100_config.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/e100/e100_config.c	Thu Jan  8 23:00:23 2004
@@ -60,7 +60,7 @@
  * All other init functions will only set values that are
  * different from the 82557 default.
  */
-void __devinit
+void
 e100_config_init_82557(struct e100_private *bdp)
 {
 	/* initialize config block */
@@ -104,7 +104,7 @@
 	e100_config_mulcast_enbl(bdp, false);
 }
 
-static void __devinit
+static void
 e100_config_init_82558(struct e100_private *bdp)
 {
 	/* MWI enable. This should be turned on only if the adapter is a 82558/9
@@ -136,7 +136,7 @@
 	e100_config_long_rx(bdp, true);
 }
 
-static void __devinit
+static void
 e100_config_init_82550(struct e100_private *bdp)
 {
 	/* The D102 chip allows for 32 config bytes.  This value is
@@ -160,7 +160,7 @@
 }
 
 /* Initialize the adapter's configure block */
-void __devinit
+void
 e100_config_init(struct e100_private *bdp)
 {
 	e100_config_init_82557(bdp);
diff -Nru a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c
--- a/drivers/net/e100/e100_main.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/e100/e100_main.c	Thu Jan  8 23:00:24 2004
@@ -124,7 +124,7 @@
 static void e100_non_tx_background(unsigned long);
 static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb);
 /* Global Data structures and variables */
-char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation";
+char e100_copyright[] = "Copyright (c) 2003 Intel Corporation";
 char e100_driver_version[]="2.3.30-k1";
 const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver";
 char e100_short_driver_name[] = "e100";
@@ -539,7 +539,7 @@
 	readw(&(bdp->scb->scb_status));	/* flushes last write, read-safe */
 }
 
-static int __devinit
+static int
 e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
 {
 	static int first_time = true;
@@ -823,7 +823,7 @@
  *
  * This routine does range checking on command-line options
  */
-void __devinit
+void
 e100_check_options(int board, struct e100_private *bdp)
 {
 	if (board >= E100_MAX_NIC) {
@@ -894,7 +894,7 @@
  * If the option's value is '-1' use the specified default.
  * Otherwise, if the value is invalid, change it to the default.
  */
-void __devinit
+void
 e100_set_int_option(int *option, int val, int min, int max, int default_val,
 		    char *name)
 {
@@ -928,7 +928,7 @@
  * Otherwise, if the value is invalid (not 0 or 1), 
  * change it to the default.
  */
-void __devinit
+void
 e100_set_bool_option(struct e100_private *bdp, int val, u32 mask,
 		     int default_val, char *name)
 {
@@ -1241,7 +1241,7 @@
  *      true: if successful
  *      false: otherwise
  */
-static unsigned char __devinit
+static unsigned char
 e100_init(struct e100_private *bdp)
 {
 	u32 st_timeout = 0;
@@ -1290,7 +1290,7 @@
  *      true: if S/W was successfully initialized
  *      false: otherwise
  */
-static unsigned char __devinit
+static unsigned char
 e100_sw_init(struct e100_private *bdp)
 {
 	bdp->next_cu_cmd = START_WAIT;	// init the next cu state
@@ -1318,7 +1318,7 @@
 	return 1;
 }
 
-static void __devinit
+static void
 e100_tco_workaround(struct e100_private *bdp)
 {
 	int i;
@@ -1519,7 +1519,7 @@
  *      0: if the operation was successful
  *      %-ENOMEM: if memory allocation failed
  */
-unsigned char __devinit
+unsigned char
 e100_alloc_space(struct e100_private *bdp)
 {
 	unsigned long off;
@@ -2508,7 +2508,7 @@
  *      true: if successfully cleared stat counters
  *      false: otherwise
  */
-static unsigned char __devinit
+static unsigned char
 e100_clr_cntrs(struct e100_private *bdp)
 {
 	volatile u32 *pcmd_complete;
@@ -2873,7 +2873,7 @@
 /***************************************************************************/
 
 /* Read PWA (printed wired assembly) number */
-void __devinit
+void
 e100_rd_pwa_no(struct e100_private *bdp)
 {
 	bdp->pwa_no = e100_eeprom_read(bdp, EEPROM_PWA_NO);
@@ -2882,7 +2882,7 @@
 }
 
 /* Read the permanent ethernet address from the eprom. */
-void __devinit
+void
 e100_rd_eaddr(struct e100_private *bdp)
 {
 	int i;
@@ -2947,7 +2947,7 @@
 /***************************************************************************/
 
 /* Print the board's configuration */
-void __devinit
+void
 e100_print_brd_conf(struct e100_private *bdp)
 {
 	/* Print the string if checksum Offloading was enabled */
@@ -2975,7 +2975,7 @@
  *      true: if successfull
  *      false: otherwise
  */
-static unsigned char __devinit
+static unsigned char
 e100_pci_setup(struct pci_dev *pcid, struct e100_private *bdp)
 {
 	struct net_device *dev = bdp->device;
@@ -3754,7 +3754,7 @@
 	return 0;
 }
 
-static inline int __devinit
+static inline int
 e100_10BaseT_adapter(struct e100_private *bdp)
 {
 	return ((bdp->pdev->device == 0x1229) &&
@@ -3762,7 +3762,7 @@
 		(bdp->pdev->subsystem_device == 0x0003));
 }
 
-static void __devinit
+static void
 e100_get_speed_duplex_caps(struct e100_private *bdp)
 {
 	u16 status;
diff -Nru a/drivers/net/e100/e100_phy.c b/drivers/net/e100/e100_phy.c
--- a/drivers/net/e100/e100_phy.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/e100/e100_phy.c	Thu Jan  8 23:00:23 2004
@@ -132,7 +132,7 @@
 	}
 }
 
-static unsigned char __devinit
+static unsigned char
 e100_phy_valid(struct e100_private *bdp, unsigned int phy_address)
 {
 	u16 ctrl_reg, stat_reg;
@@ -150,7 +150,7 @@
 	return true;
 }
 
-static void __devinit
+static void
 e100_phy_address_detect(struct e100_private *bdp)
 {
 	unsigned int addr;
@@ -180,7 +180,7 @@
 	}
 }
 
-static void __devinit
+static void
 e100_phy_id_detect(struct e100_private *bdp)
 {
 	u16 low_id_reg, high_id_reg;
@@ -204,7 +204,7 @@
 		      ((unsigned int) high_id_reg << 16));
 }
 
-static void __devinit
+static void
 e100_phy_isolate(struct e100_private *bdp)
 {
 	unsigned int phy_address;
@@ -227,7 +227,7 @@
 	}
 }
 
-static unsigned char __devinit
+static unsigned char
 e100_phy_specific_setup(struct e100_private *bdp)
 {
 	u16 misc_reg;
@@ -380,7 +380,7 @@
  * Returns:
  *	NOTHING
  */
-static void __devinit
+static void
 e100_fix_polarity(struct e100_private *bdp)
 {
 	u16 status;
@@ -916,7 +916,7 @@
 	schedule_timeout(HZ / 2);
 }
 
-unsigned char __devinit
+unsigned char
 e100_phy_init(struct e100_private *bdp)
 {
 	e100_phy_reset(bdp);
diff -Nru a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
--- a/drivers/net/hamradio/scc.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/hamradio/scc.c	Thu Jan  8 23:00:24 2004
@@ -1196,11 +1196,7 @@
  	if (scc->stat.tx_state == TXS_TIMEOUT)		/* we had a timeout? */
  	{
  		scc->stat.tx_state = TXS_WAIT;
-
- 		if (scc->kiss.mintime != TIMER_OFF)	/* try it again */
- 			scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
- 		else
- 			scc_start_tx_timer(scc, t_dwait, 0);
+		scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
  		return;
  	}
  	
@@ -1274,8 +1270,7 @@
 	del_timer(&scc->tx_wdog);
 
 	scc_key_trx(scc, TX_OFF);
-
-	if (scc->kiss.mintime != TIMER_OFF)
+	if(scc->kiss.mintime)
 		scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
 	scc->stat.tx_state = TXS_WAIT;
 }
diff -Nru a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c
--- a/drivers/net/irda/ali-ircc.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/irda/ali-ircc.c	Thu Jan  8 23:00:23 2004
@@ -8,6 +8,8 @@
  * Created at:    2000/10/16 03:46PM
  * Modified at:   2001/1/3 02:55PM
  * Modified by:   Benjamin Kong <benjamin_kong@ali.com.tw>
+ * Modified at:   2003/11/6 and support for ALi south-bridge chipsets M1563
+ * Modified by:   Clear Zhang <clear_zhang@ali.com.tw>
  * 
  *     Copyright (c) 2000 Benjamin Kong <benjamin_kong@ali.com.tw>
  *     All Rights Reserved
@@ -68,6 +70,7 @@
 {
 	{ "M1543", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x43, ali_ircc_probe_53, ali_ircc_init_43 },
 	{ "M1535", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x53, ali_ircc_probe_53, ali_ircc_init_53 },
+	{ "M1563", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x63, ali_ircc_probe_53, ali_ircc_init_53 },
 	{ NULL }
 };
 
@@ -1331,7 +1334,7 @@
 	}
 	
 	/* Turn on interrups */
-	outb(UART_IER_RLSI | UART_IER_RDI |UART_IER_THRI, iobase+UART_IER);
+	outb(UART_IER_RDI , iobase+UART_IER);
 
 	/* Ready to play! */
 	netif_start_queue(dev); //benjamin by irport
diff -Nru a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
--- a/drivers/net/pcmcia/3c574_cs.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/pcmcia/3c574_cs.c	Thu Jan  8 23:00:23 2004
@@ -1092,8 +1092,12 @@
 {
 	struct el3_private *lp = (struct el3_private *)dev->priv;
 
-	if (netif_device_present(dev))
+	if (netif_device_present(dev)) {
+		unsigned long flags;
+		spin_lock_irqsave(&lp->window_lock, flags);
 		update_stats(dev);
+		spin_unlock_irqrestore(&lp->window_lock, flags);
+	}
 	return &lp->stats;
 }
 
@@ -1105,7 +1109,6 @@
 {
 	struct el3_private *lp = (struct el3_private *)dev->priv;
 	ioaddr_t ioaddr = dev->base_addr;
-	unsigned long flags;
 	u8 rx, tx, up;
 
 	DEBUG(2, "%s: updating the statistics.\n", dev->name);
@@ -1113,8 +1116,6 @@
 	if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
 		return;
 		
-	spin_lock_irqsave(&lp->window_lock, flags);
-
 	/* Unlike the 3c509 we need not turn off stats updates while reading. */
 	/* Switch to the stats window, and read everything. */
 	EL3WINDOW(6);
@@ -1139,7 +1140,6 @@
 	lp->stats.tx_bytes 			+= tx + ((up & 0xf0) << 12);
 
 	EL3WINDOW(1);
-	spin_unlock_irqrestore(&lp->window_lock, flags);
 }
 
 static int el3_rx(struct net_device *dev, int worklimit)
@@ -1281,6 +1281,8 @@
 	DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
 	
 	if (DEV_OK(link)) {
+		unsigned long flags;
+
 		/* Turn off statistics ASAP.  We update lp->stats below. */
 		outw(StatsDisable, ioaddr + EL3_CMD);
 		
@@ -1290,8 +1292,9 @@
 		
 		/* Note: Switching to window 0 may disable the IRQ. */
 		EL3WINDOW(0);
-		
+		spin_lock_irqsave(&lp->window_lock, flags);
 		update_stats(dev);
+		spin_unlock_irqrestore(&lp->window_lock, flags);
 	}
 
 	link->open--;
diff -Nru a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
--- a/drivers/net/pcmcia/pcnet_cs.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/pcmcia/pcnet_cs.c	Thu Jan  8 23:00:24 2004
@@ -11,7 +11,7 @@
 
     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
 
-    pcnet_cs.c 1.149 2002/06/29 06:27:37
+    pcnet_cs.c 1.153 2003/11/09 18:53:09
     
     The network driver code is based on Donald Becker's NE2000 code:
 
@@ -74,7 +74,7 @@
 MODULE_PARM(pc_debug, "i");
 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 static char *version =
-"pcnet_cs.c 1.149 2002/06/29 06:27:37 (David Hinds)";
+"pcnet_cs.c 1.153 2003/11/09 18:53:09 (David Hinds)";
 #else
 #define DEBUG(n, args...)
 #endif
@@ -871,13 +871,15 @@
 
     MII interface support for DL10019 and DL10022 based cards
 
-    On the DL10019, the MII IO direction bit is 0x10; on  the DL10022
+    On the DL10019, the MII IO direction bit is 0x10; on the DL10022
     it is 0x20.  Setting both bits seems to work on both card types.
 
 ======================================================================*/
 
 #define DLINK_GPIO		0x1c
 #define DLINK_DIAG		0x1d
+#define DLINK_EEPROM		0x1e
+
 #define MDIO_SHIFT_CLK		0x80
 #define MDIO_DATA_OUT		0x40
 #define MDIO_DIR_WRITE		0x30
@@ -940,6 +942,98 @@
     outb_p(0x00, addr);
 }
 
+/*======================================================================
+
+    EEPROM access routines for DL10019 and DL10022 based cards
+
+======================================================================*/
+
+#define EE_EEP		0x40
+#define EE_ASIC		0x10
+#define EE_CS		0x08
+#define EE_CK		0x04
+#define EE_DO		0x02
+#define EE_DI		0x01
+#define EE_ADOT		0x01	/* DataOut for ASIC */
+#define EE_READ_CMD	0x06
+
+#define DL19FDUPLX	0x0400	/* DL10019 Full duplex mode */
+
+static int read_eeprom(ioaddr_t ioaddr, int location)
+{
+    int i, retval = 0;
+    ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
+    int read_cmd = location | (EE_READ_CMD << 8);
+
+    outb(0, ee_addr);
+    outb(EE_EEP|EE_CS, ee_addr);
+
+    /* Shift the read command bits out. */
+    for (i = 10; i >= 0; i--) {
+	short dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
+	outb_p(EE_EEP|EE_CS|dataval, ee_addr);
+	outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr);
+    }
+    outb(EE_EEP|EE_CS, ee_addr);
+
+    for (i = 16; i > 0; i--) {
+	outb_p(EE_EEP|EE_CS | EE_CK, ee_addr);
+	retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0);
+	outb_p(EE_EEP|EE_CS, ee_addr);
+    }
+
+    /* Terminate the EEPROM access. */
+    outb(0, ee_addr);
+    return retval;
+}
+
+/*
+    The internal ASIC registers can be changed by EEPROM READ access
+    with EE_ASIC bit set.
+    In ASIC mode, EE_ADOT is used to output the data to the ASIC.
+*/
+
+static void write_asic(ioaddr_t ioaddr, int location, short asic_data)
+{
+	int i;
+	ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
+	short dataval;
+	int read_cmd = location | (EE_READ_CMD << 8);
+
+	asic_data |= read_eeprom(ioaddr, location);
+
+	outb(0, ee_addr);
+	outb(EE_ASIC|EE_CS|EE_DI, ee_addr);
+
+	read_cmd = read_cmd >> 1;
+
+	/* Shift the read command bits out. */
+	for (i = 9; i >= 0; i--) {
+		dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr);
+		outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
+	}
+	// sync
+	outb(EE_ASIC|EE_CS, ee_addr);
+	outb(EE_ASIC|EE_CS|EE_CK, ee_addr);
+	outb(EE_ASIC|EE_CS, ee_addr);
+
+	for (i = 15; i >= 0; i--) {
+		dataval = (asic_data & (1 << i)) ? EE_ADOT : 0;
+		outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
+		outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr);
+		outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
+	}
+
+	/* Terminate the ASIC access. */
+	outb(EE_ASIC|EE_DI, ee_addr);
+	outb(EE_ASIC|EE_DI| EE_CK, ee_addr);
+	outb(EE_ASIC|EE_DI, ee_addr);
+
+	outb(0, ee_addr);
+}
+
 /*====================================================================*/
 
 static void set_misc_reg(struct net_device *dev)
@@ -1154,6 +1248,9 @@
 	if (link && (info->flags & IS_DL10022)) {
 	    /* Disable collision detection on full duplex links */
 	    outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
+	} else if (link && (info->flags & IS_DL10019)) {
+	    /* Disable collision detection on full duplex links */
+	    write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0);
 	}
 	if (link) {
 	    if (info->phy_id == info->eth_phy) {
diff -Nru a/drivers/net/pppoe.c b/drivers/net/pppoe.c
--- a/drivers/net/pppoe.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/pppoe.c	Thu Jan  8 23:00:24 2004
@@ -1151,3 +1151,4 @@
 MODULE_AUTHOR("Michal Ostrowski <mostrows@speakeasy.net>");
 MODULE_DESCRIPTION("PPP over Ethernet driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_NETPROTO(PF_PPPOX);
diff -Nru a/drivers/net/sis900.c b/drivers/net/sis900.c
--- a/drivers/net/sis900.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/sis900.c	Thu Jan  8 23:00:23 2004
@@ -18,10 +18,11 @@
    preliminary Rev. 1.0 Jan. 18, 1998
    http://www.sis.com.tw/support/databook.htm
 
+   Rev 1.08.07 Nov.  2 2003 Daniele Venzano <webvenza@libero.it> add suspend/resume support
    Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
-   Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary 
+   Rev 1.08.05 Jun.  6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
    Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support
-   Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
+   Rev 1.08.03 Feb.  1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
    Rev 1.08.02 Nov. 30 2001 Hui-Fen Hsu workaround for EDB & bug fix for dhcp problem
    Rev 1.08.01 Aug. 25 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY
    Rev 1.08.00 Jun. 11 2001 Hui-Fen Hsu workaround for RTL8201 PHY and some bug fix
@@ -72,7 +73,7 @@
 #include "sis900.h"
 
 #define SIS900_MODULE_NAME "sis900"
-#define SIS900_DRV_VERSION "v1.08.06 9/24/2002"
+#define SIS900_DRV_VERSION "v1.08.07 11/02/2003"
 
 static char version[] __devinitdata =
 KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";
@@ -169,6 +170,7 @@
 
 	unsigned int tx_full;			/* The Tx queue is full.    */
 	u8 host_bridge_rev;
+	u32 pci_state[16];
 };
 
 MODULE_AUTHOR("Jim Huang <cmhuang@sis.com.tw>, Ollie Lho <ollie@sis.com.tw>");
@@ -305,7 +307,7 @@
 		*( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr);
 	}
 
-	/* enable packet filitering */
+	/* enable packet filtering */
 	outl(rfcrSave | RFEN, rfcr + ioaddr);
 
 	return 1;
@@ -994,7 +996,7 @@
 		}
 	}
 
-	/* enable packet filitering */
+	/* enable packet filtering */
 	outl(rfcrSave | RFEN, rfcr + ioaddr);
 }
 
@@ -1466,7 +1468,7 @@
  *	@net_dev: the net device to transmit with
  *
  *	Set the transmit buffer descriptor, 
- *	and write TxENA to enable transimt state machine.
+ *	and write TxENA to enable transmit state machine.
  *	tell upper layer if the buffer is full
  */
 
@@ -2184,11 +2186,72 @@
 	pci_set_drvdata(pci_dev, NULL);
 }
 
+#ifdef CONFIG_PM
+
+static int sis900_suspend(struct pci_dev *pci_dev, u32 state)
+{
+	struct net_device *net_dev = pci_get_drvdata(pci_dev);
+	struct sis900_private *sis_priv = net_dev->priv;
+	long ioaddr = net_dev->base_addr;
+
+	if(!netif_running(net_dev))
+		return 0;
+
+	netif_stop_queue(net_dev);
+
+	/* Stop the chip's Tx and Rx Status Machine */
+	outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr);
+
+	pci_set_power_state(pci_dev, 3);
+	pci_save_state(pci_dev, sis_priv->pci_state);
+
+	return 0;
+}
+
+static int sis900_resume(struct pci_dev *pci_dev)
+{
+	struct net_device *net_dev = pci_get_drvdata(pci_dev);
+	struct sis900_private *sis_priv = net_dev->priv;
+	long ioaddr = net_dev->base_addr;
+
+	if(!netif_running(net_dev))
+		return 0;
+	pci_restore_state(pci_dev, sis_priv->pci_state);
+	pci_set_power_state(pci_dev, 0);
+
+	sis900_init_rxfilter(net_dev);
+
+	sis900_init_tx_ring(net_dev);
+	sis900_init_rx_ring(net_dev);
+
+	set_rx_mode(net_dev);
+
+	netif_device_attach(net_dev);
+	netif_start_queue(net_dev);
+
+	/* Workaround for EDB */
+	sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
+
+	/* Enable all known interrupts by setting the interrupt mask. */
+	outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
+	outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
+	outl(IE, ioaddr + ier);
+
+	sis900_check_mode(net_dev, sis_priv->mii);
+
+	return 0;
+}
+#endif /* CONFIG_PM */
+
 static struct pci_driver sis900_pci_driver = {
 	.name		= SIS900_MODULE_NAME,
 	.id_table	= sis900_pci_tbl,
 	.probe		= sis900_probe,
 	.remove		= __devexit_p(sis900_remove),
+#ifdef CONFIG_PM
+	.suspend	= sis900_suspend,
+	.resume		= sis900_resume,
+#endif /* CONFIG_PM */
 };
 
 static int __init sis900_init_module(void)
diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/tg3.c	Thu Jan  8 23:00:24 2004
@@ -56,8 +56,8 @@
 
 #define DRV_MODULE_NAME		"tg3"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"2.3"
-#define DRV_MODULE_RELDATE	"November 5, 2003"
+#define DRV_MODULE_VERSION	"2.5"
+#define DRV_MODULE_RELDATE	"December 22, 2003"
 
 #define TG3_DEF_MAC_MODE	0
 #define TG3_DEF_RX_MODE		0
@@ -176,6 +176,10 @@
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX,
@@ -2688,7 +2692,13 @@
 				mss |= (tsflags << 11);
 			}
 		} else {
-			mss += tcp_opt_len;
+			if (tcp_opt_len || skb->nh.iph->ihl > 5) {
+				int tsflags;
+
+				tsflags = ((skb->nh.iph->ihl - 5) +
+					   (tcp_opt_len >> 2));
+				base_flags |= tsflags << 12;
+			}
 		}
 	}
 #else
@@ -2895,7 +2905,13 @@
 				mss |= (tsflags << 11);
 			}
 		} else {
-			mss += tcp_opt_len;
+			if (tcp_opt_len || skb->nh.iph->ihl > 5) {
+				int tsflags;
+
+				tsflags = ((skb->nh.iph->ihl - 5) +
+					   (tcp_opt_len >> 2));
+				base_flags |= tsflags << 12;
+			}
 		}
 	}
 #else
@@ -3860,180 +3876,181 @@
 #if TG3_TSO_SUPPORT != 0
 
 #define TG3_TSO_FW_RELEASE_MAJOR	0x1
-#define TG3_TSO_FW_RELASE_MINOR		0x3
+#define TG3_TSO_FW_RELASE_MINOR		0x4
 #define TG3_TSO_FW_RELEASE_FIX		0x0
 #define TG3_TSO_FW_START_ADDR		0x08000000
 #define TG3_TSO_FW_TEXT_ADDR		0x08000000
-#define TG3_TSO_FW_TEXT_LEN		0x1ac0
-#define TG3_TSO_FW_RODATA_ADDR		0x08001650
+#define TG3_TSO_FW_TEXT_LEN		0x1a90
+#define TG3_TSO_FW_RODATA_ADDR		0x08001a900
 #define TG3_TSO_FW_RODATA_LEN		0x60
-#define TG3_TSO_FW_DATA_ADDR		0x080016a0
+#define TG3_TSO_FW_DATA_ADDR		0x08001b20
 #define TG3_TSO_FW_DATA_LEN		0x20
-#define TG3_TSO_FW_SBSS_ADDR		0x080016c0
+#define TG3_TSO_FW_SBSS_ADDR		0x08001b40
 #define TG3_TSO_FW_SBSS_LEN		0x2c
-#define TG3_TSO_FW_BSS_ADDR		0x080016e0
-#define TG3_TSO_FW_BSS_LEN		0x890
+#define TG3_TSO_FW_BSS_ADDR		0x08001b70
+#define TG3_TSO_FW_BSS_LEN		0x894
 
 static u32 tg3TsoFwText[] = {
 	0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800,
 	0x37bd4000, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000010, 0x00000000,
 	0x0000000d, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0x3c04fefe,
-	0xafbf0018, 0x0e0005e0, 0x34840002, 0x0e000670, 0x00000000, 0x3c030800,
-	0x90631b78, 0x24020002, 0x3c040800, 0x24841acc, 0x14620003, 0x24050001,
-	0x3c040800, 0x24841ac0, 0x24060002, 0x00003821, 0xafa00010, 0x0e000684,
+	0xafbf0018, 0x0e0005d4, 0x34840002, 0x0e000664, 0x00000000, 0x3c030800,
+	0x90631b58, 0x24020002, 0x3c040800, 0x24841a9c, 0x14620003, 0x24050001,
+	0x3c040800, 0x24841a90, 0x24060003, 0x00003821, 0xafa00010, 0x0e000678,
 	0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001,
 	0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008,
-	0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf0018,
-	0xafb10014, 0x0e000052, 0xafb00010, 0x24110001, 0x8f706820, 0x32020100,
-	0x10400003, 0x00000000, 0x0e0000b2, 0x00000000, 0x8f706820, 0x32022000,
-	0x10400004, 0x32020001, 0x0e0001e3, 0x24040001, 0x32020001, 0x10400003,
-	0x00000000, 0x0e00009a, 0x00000000, 0x0a00003a, 0xaf715028, 0x8fbf0018,
-	0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800,
-	0x24841ae0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-	0x0e000684, 0xafa00014, 0x3c040800, 0x248423e8, 0xa4800000, 0x3c010800,
-	0xa0201ba8, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800,
-	0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800,
-	0xac201bcc, 0x8f624434, 0x3c010800, 0xac221b98, 0x8f624438, 0x3c010800,
-	0xac221b9c, 0x8f624410, 0xac80f7a8, 0x3c010800, 0xac201b94, 0x3c010800,
-	0xac2023f0, 0x3c010800, 0xac2023d8, 0x3c010800, 0xac2023dc, 0x3c010800,
-	0xac202410, 0x3c010800, 0xac221ba0, 0x8f620068, 0x24030007, 0x00021702,
-	0x10430005, 0x00000000, 0x8f620068, 0x00021702, 0x14400004, 0x24020001,
-	0x3c010800, 0x0a00008e, 0xac20241c, 0xac820034, 0x3c040800, 0x24841aec,
-	0x3c050800, 0x8ca5241c, 0x00003021, 0x00003821, 0xafa00010, 0x0e000684,
-	0xafa00014, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800,
-	0x24841af8, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-	0x0e000684, 0xafa00014, 0x0e000052, 0x00000000, 0x0e0000ab, 0x00002021,
-	0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001, 0x8f636820, 0x00821004,
-	0x00021027, 0x00621824, 0x03e00008, 0xaf636820, 0x27bdffd0, 0xafbf002c,
-	0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014,
-	0xafb00010, 0x8f665c5c, 0x3c030800, 0x24631bcc, 0x8c620000, 0x14460005,
-	0x3c0200ff, 0x3c020800, 0x90421ba8, 0x14400115, 0x3c0200ff, 0x3442fff8,
-	0x00c28824, 0xac660000, 0x00111902, 0x306300ff, 0x30c20003, 0x000211c0,
-	0x00623825, 0x00e02821, 0x00061602, 0x3c030800, 0x90631ba8, 0x3044000f,
-	0x1460002b, 0x00804021, 0x24020001, 0x3c010800, 0xa0221ba8, 0x00071100,
-	0x00821025, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800,
-	0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800,
-	0xac201bc0, 0x3c010800, 0xac201bc4, 0x3c010800, 0xa42223e8, 0x9623000c,
-	0x30628000, 0x10400008, 0x30627fff, 0x2442003e, 0x3c010800, 0xa4221ba6,
-	0x24020001, 0x3c010800, 0x0a0000f9, 0xac222404, 0x24620036, 0x3c010800,
-	0xa4221ba6, 0x3c010800, 0xac202404, 0x3c010800, 0xac202400, 0x3c010800,
-	0x0a000101, 0xac202408, 0x9622000c, 0x3c010800, 0xa42223fc, 0x3c040800,
-	0x24841bac, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac311bd8,
-	0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac261bdc, 0x8c820000,
-	0x24a30001, 0x306701ff, 0x00021100, 0x3c010800, 0x00220821, 0xac271be0,
-	0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac281be4, 0x96230008,
-	0x3c020800, 0x8c421bbc, 0x00432821, 0x3c010800, 0xac251bbc, 0x9622000a,
-	0x30420004, 0x14400018, 0x00071100, 0x8f630c14, 0x3063000f, 0x2c620002,
-	0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800, 0x8c421b50, 0x3063000f,
-	0x24420001, 0x3c010800, 0xac221b50, 0x2c620002, 0x1040fff7, 0x3c02c000,
-	0x00c21825, 0xaf635c5c, 0x8f625c50, 0x30420002, 0x10400014, 0x00000000,
-	0x0a000133, 0x00000000, 0x3c030800, 0x8c631b90, 0x3c040800, 0x94841ba4,
-	0x01021025, 0x3c010800, 0xa42223ea, 0x24020001, 0x3c010800, 0xac221bc8,
-	0x24630001, 0x0085202a, 0x3c010800, 0x10800003, 0xac231b90, 0x3c010800,
-	0xa4251ba4, 0x3c060800, 0x24c61bac, 0x8cc20000, 0x24420001, 0xacc20000,
-	0x28420080, 0x14400005, 0x00000000, 0x0e00065e, 0x24040002, 0x0a0001d9,
-	0x00000000, 0x3c020800, 0x8c421bc8, 0x1040007f, 0x24020001, 0x3c040800,
-	0x90841ba8, 0x14820077, 0x24020003, 0x3c150800, 0x96b51ba6, 0x3c050800,
-	0x8ca51bbc, 0x32a3ffff, 0x00a3102a, 0x14400073, 0x00000000, 0x14a30003,
-	0x00000000, 0x3c010800, 0xac242400, 0x10600061, 0x00009021, 0x24d60004,
-	0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100, 0x3c110800, 0x02308821,
-	0x0e00062d, 0x8e311bd8, 0x00403021, 0x10c00059, 0x00000000, 0x9628000a,
-	0x31020040, 0x10400004, 0x2407180c, 0x8e22000c, 0x2407188c, 0xacc20018,
-	0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825,
-	0x3c030800, 0x00701821, 0x8c631be0, 0x3c020800, 0x00501021, 0x8c421be4,
-	0x00031d00, 0x00021400, 0x00621825, 0xacc30014, 0x8ec30004, 0x96220008,
-	0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x0282102a, 0x14400002,
-	0x02b22823, 0x00802821, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000,
-	0x8e220000, 0xacc20000, 0x8e220004, 0x8e63fff4, 0x00431021, 0xacc20004,
-	0xa4c5000e, 0x8e62fff4, 0x00441021, 0xae62fff4, 0x96230008, 0x0043102a,
-	0x14400005, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0xae62fff0,
-	0xacc00008, 0x3242ffff, 0x14540008, 0x24020305, 0x31020080, 0x54400001,
-	0x34e70010, 0x24020905, 0xa4c2000c, 0x0a0001bc, 0x34e70020, 0xa4c2000c,
-	0x3c020800, 0x8c422400, 0x10400003, 0x3c024b65, 0x0a0001c4, 0x34427654,
-	0x3c02b49a, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa,
-	0x00c02021, 0x3242ffff, 0x0054102b, 0x1440ffa4, 0x00000000, 0x24020002,
-	0x3c010800, 0x0a0001d9, 0xa0221ba8, 0x8ec2083c, 0x24420001, 0x0a0001d9,
-	0xaec2083c, 0x14820003, 0x00000000, 0x0e0004b9, 0x00000000, 0x8fbf002c,
+	0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c,
+	0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001,
+	0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000,
+	0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001ef, 0x24040001,
+	0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800,
+	0x90421b88, 0x14520003, 0x00000000, 0x0e0004bf, 0x00000000, 0x0a00003c,
+	0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
+	0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ab0, 0x00002821, 0x00003021,
+	0x00003821, 0xafbf0018, 0xafa00010, 0x0e000678, 0xafa00014, 0x3c040800,
+	0x248423c8, 0xa4800000, 0x3c010800, 0xa0201b88, 0x3c010800, 0xac201b8c,
+	0x3c010800, 0xac201b90, 0x3c010800, 0xac201b94, 0x3c010800, 0xac201b9c,
+	0x3c010800, 0xac201ba8, 0x3c010800, 0xac201bac, 0x8f624434, 0x3c010800,
+	0xac221b78, 0x8f624438, 0x3c010800, 0xac221b7c, 0x8f624410, 0xac80f7a8,
+	0x3c010800, 0xac201b74, 0x3c010800, 0xac2023d0, 0x3c010800, 0xac2023b8,
+	0x3c010800, 0xac2023bc, 0x3c010800, 0xac2023f0, 0x3c010800, 0xac221b80,
+	0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068,
+	0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac2023fc,
+	0xac820034, 0x3c040800, 0x24841abc, 0x3c050800, 0x8ca523fc, 0x00003021,
+	0x00003821, 0xafa00010, 0x0e000678, 0xafa00014, 0x8fbf0018, 0x03e00008,
+	0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac8, 0x00002821, 0x00003021,
+	0x00003821, 0xafbf0018, 0xafa00010, 0x0e000678, 0xafa00014, 0x0e00005b,
+	0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020,
+	0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008,
+	0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020,
+	0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800,
+	0x24631bac, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b88,
+	0x14400118, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902,
+	0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602,
+	0x3c030800, 0x90631b88, 0x3044000f, 0x14600036, 0x00804821, 0x24020001,
+	0x3c010800, 0xa0221b88, 0x00051100, 0x00821025, 0x3c010800, 0xac201b8c,
+	0x3c010800, 0xac201b90, 0x3c010800, 0xac201b94, 0x3c010800, 0xac201b9c,
+	0x3c010800, 0xac201ba8, 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4,
+	0x3c010800, 0xa42223c8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222400,
+	0x30428000, 0x3c010800, 0xa4231bb6, 0x10400005, 0x24020001, 0x3c010800,
+	0xac2223e4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023e4,
+	0x9622000a, 0x3c030800, 0x94631bb6, 0x3c010800, 0xac2023e0, 0x3c010800,
+	0xac2023e8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800,
+	0xa42223c0, 0x3c010800, 0x0a000115, 0xa4231b86, 0x9622000c, 0x3c010800,
+	0xa42223dc, 0x3c040800, 0x24841b8c, 0x8c820000, 0x00021100, 0x3c010800,
+	0x00220821, 0xac311bb8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
+	0xac271bbc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800,
+	0x00220821, 0xac261bc0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
+	0xac291bc4, 0x96230008, 0x3c020800, 0x8c421b9c, 0x00432821, 0x3c010800,
+	0xac251b9c, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14,
+	0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800,
+	0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30, 0x2c620002,
+	0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002,
+	0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b70,
+	0x3c040800, 0x94841b84, 0x01221025, 0x3c010800, 0xa42223ca, 0x24020001,
+	0x3c010800, 0xac221ba8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003,
+	0xac231b70, 0x3c010800, 0xa4251b84, 0x3c060800, 0x24c61b8c, 0x8cc20000,
+	0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000652,
+	0x24040002, 0x0a0001e5, 0x00000000, 0x3c020800, 0x8c421ba8, 0x10400077,
+	0x24020001, 0x3c050800, 0x90a51b88, 0x14a20071, 0x00000000, 0x3c150800,
+	0x96b51b86, 0x3c040800, 0x8c841b9c, 0x32a3ffff, 0x0083102a, 0x1440006b,
+	0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523e0, 0x1060005b,
+	0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100,
+	0x3c110800, 0x02308821, 0x0e000621, 0x8e311bb8, 0x00402821, 0x10a00053,
+	0x00000000, 0x9628000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e22000c,
+	0x2407188c, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bc0, 0x3c020800,
+	0x00501021, 0x8c421bc4, 0x00031d00, 0x00021400, 0x00621825, 0xaca30014,
+	0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021,
+	0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000, 0x30c4ffff,
+	0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004, 0x8e63fff4,
+	0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021, 0xae62fff4,
+	0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0, 0xae60fff4,
+	0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008, 0x24020305,
+	0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c, 0x0a0001ca,
+	0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223e0, 0x10400003, 0x3c024b65,
+	0x0a0001d2, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c, 0x30e2ffff,
+	0xaca20010, 0x0e00059f, 0x00a02021, 0x3242ffff, 0x0054102b, 0x1440ffaa,
+	0x00000000, 0x24020002, 0x3c010800, 0x0a0001e5, 0xa0221b88, 0x8ec2083c,
+	0x24420001, 0x0a0001e5, 0xaec2083c, 0x0e0004bf, 0x00000000, 0x8fbf002c,
 	0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014,
 	0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028, 0xafb30024,
 	0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff, 0x3442fff8,
-	0x3c060800, 0x24c61bc4, 0x02428824, 0x9623000e, 0x8cc20000, 0x00431021,
-	0xacc20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, 0x0e000643,
+	0x3c060800, 0x24c61ba4, 0x02428824, 0x9623000e, 0x8cc20000, 0x00431021,
+	0xacc20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, 0x0e000637,
 	0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002,
 	0x10400121, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1040011c,
-	0x00000000, 0x0a000200, 0x00000000, 0x8e240008, 0x8e230014, 0x00041402,
+	0x00000000, 0x0a00020c, 0x00000000, 0x8e240008, 0x8e230014, 0x00041402,
 	0x000241c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f, 0x00031942,
 	0x30637800, 0x00021100, 0x24424000, 0x00625021, 0x9542000a, 0x3084ffff,
-	0x30420008, 0x104000b3, 0x000429c0, 0x3c020800, 0x8c422410, 0x1440002d,
-	0x25050008, 0x95020014, 0x3c010800, 0xa42223e0, 0x8d070010, 0x00071402,
-	0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4, 0x9502000e, 0x30e3ffff,
-	0x00431023, 0x3c010800, 0xac222418, 0x8f626800, 0x3c030010, 0x00431024,
-	0x10400005, 0x00000000, 0x9503001a, 0x9502001c, 0x0a000235, 0x00431021,
-	0x9502001a, 0x3c010800, 0xac22240c, 0x3c02c000, 0x02421825, 0x3c010800,
-	0xac282410, 0x3c010800, 0xac322414, 0xaf635c9c, 0x8f625c90, 0x30420002,
+	0x30420008, 0x104000b3, 0x000429c0, 0x3c020800, 0x8c4223f0, 0x1440002d,
+	0x25050008, 0x95020014, 0x3c010800, 0xa42223c0, 0x8d070010, 0x00071402,
+	0x3c010800, 0xa42223c2, 0x3c010800, 0xa42723c4, 0x9502000e, 0x30e3ffff,
+	0x00431023, 0x3c010800, 0xac2223f8, 0x8f626800, 0x3c030010, 0x00431024,
+	0x10400005, 0x00000000, 0x9503001a, 0x9502001c, 0x0a000241, 0x00431021,
+	0x9502001a, 0x3c010800, 0xac2223ec, 0x3c02c000, 0x02421825, 0x3c010800,
+	0xac2823f0, 0x3c010800, 0xac3223f4, 0xaf635c9c, 0x8f625c90, 0x30420002,
 	0x104000df, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000da,
-	0x00000000, 0x0a000242, 0x00000000, 0x9502000e, 0x3c030800, 0x946323e4,
+	0x00000000, 0x0a00024e, 0x00000000, 0x9502000e, 0x3c030800, 0x946323c4,
 	0x00434823, 0x3123ffff, 0x2c620008, 0x1040001c, 0x00000000, 0x95020014,
 	0x24420028, 0x00a22821, 0x00031042, 0x1840000b, 0x00002021, 0x24c60848,
 	0x00403821, 0x94a30000, 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000,
 	0x0087102a, 0x1440fff9, 0x24a50002, 0x31220001, 0x1040001f, 0x3c024000,
-	0x3c040800, 0x2484240c, 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021,
-	0x0a000281, 0xac820000, 0x8f626800, 0x3c030010, 0x00431024, 0x10400009,
-	0x00000000, 0x9502001a, 0x3c030800, 0x8c63240c, 0x00431021, 0x3c010800,
-	0xac22240c, 0x0a000282, 0x3c024000, 0x9502001a, 0x9504001c, 0x3c030800,
-	0x8c63240c, 0x00441023, 0x00621821, 0x3c010800, 0xac23240c, 0x3c024000,
+	0x3c040800, 0x248423ec, 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021,
+	0x0a00028d, 0xac820000, 0x8f626800, 0x3c030010, 0x00431024, 0x10400009,
+	0x00000000, 0x9502001a, 0x3c030800, 0x8c6323ec, 0x00431021, 0x3c010800,
+	0xac2223ec, 0x0a00028e, 0x3c024000, 0x9502001a, 0x9504001c, 0x3c030800,
+	0x8c6323ec, 0x00441023, 0x00621821, 0x3c010800, 0xac2323ec, 0x3c024000,
 	0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000,
-	0x9542000a, 0x30420010, 0x10400095, 0x00000000, 0x3c060800, 0x24c62410,
-	0x3c020800, 0x944223e4, 0x8cc50000, 0x3c040800, 0x8c842418, 0x24420030,
-	0x00a22821, 0x94a20004, 0x3c030800, 0x8c63240c, 0x00441023, 0x00621821,
+	0x9542000a, 0x30420010, 0x10400095, 0x00000000, 0x3c060800, 0x24c623f0,
+	0x3c020800, 0x944223c4, 0x8cc50000, 0x3c040800, 0x8c8423f8, 0x24420030,
+	0x00a22821, 0x94a20004, 0x3c030800, 0x8c6323ec, 0x00441023, 0x00621821,
 	0x00603821, 0x00032402, 0x30e2ffff, 0x00823821, 0x00071402, 0x00e23821,
-	0x00071027, 0x3c010800, 0xac23240c, 0xa4a20006, 0x3c030800, 0x8c632414,
+	0x00071027, 0x3c010800, 0xac2323ec, 0xa4a20006, 0x3c030800, 0x8c6323f4,
 	0x3c0200ff, 0x3442fff8, 0x00628824, 0x96220008, 0x24040001, 0x24034000,
 	0x000241c0, 0x00e01021, 0xa502001a, 0xa500001c, 0xacc00000, 0x3c010800,
-	0xac241b70, 0xaf635cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
-	0x3c010800, 0xac201b70, 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002,
-	0x10400003, 0x00000000, 0x3c010800, 0xac201b70, 0x3c020800, 0x8c421b70,
-	0x1040ffec, 0x00000000, 0x3c040800, 0x0e000643, 0x8c842414, 0x0a000320,
-	0x00000000, 0x3c030800, 0x90631ba8, 0x24020002, 0x14620003, 0x3c034b65,
-	0x0a0002d7, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, 0x24100002,
-	0x24100001, 0x01002021, 0x0e000346, 0x02003021, 0x24020003, 0x3c010800,
-	0xa0221ba8, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c632400,
-	0x10620006, 0x00000000, 0x3c020800, 0x944223e8, 0x00021400, 0x0a000315,
-	0xae220014, 0x3c040800, 0x248423ea, 0x94820000, 0x00021400, 0xae220014,
-	0x3c020800, 0x8c421bcc, 0x3c03c000, 0x3c010800, 0xa0201ba8, 0x00431025,
+	0xac241b50, 0xaf635cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
+	0x3c010800, 0xac201b50, 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002,
+	0x10400003, 0x00000000, 0x3c010800, 0xac201b50, 0x3c020800, 0x8c421b50,
+	0x1040ffec, 0x00000000, 0x3c040800, 0x0e000637, 0x8c8423f4, 0x0a00032c,
+	0x00000000, 0x3c030800, 0x90631b88, 0x24020002, 0x14620003, 0x3c034b65,
+	0x0a0002e3, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, 0x24100002,
+	0x24100001, 0x01002021, 0x0e000352, 0x02003021, 0x24020003, 0x3c010800,
+	0xa0221b88, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323e0,
+	0x10620006, 0x00000000, 0x3c020800, 0x944223c8, 0x00021400, 0x0a000321,
+	0xae220014, 0x3c040800, 0x248423ca, 0x94820000, 0x00021400, 0xae220014,
+	0x3c020800, 0x8c421bac, 0x3c03c000, 0x3c010800, 0xa0201b88, 0x00431025,
 	0xaf625c5c, 0x8f625c50, 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2,
 	0x8c820000, 0x00431025, 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa,
-	0x00000000, 0x3c020800, 0x24421b94, 0x8c430000, 0x24630001, 0xac430000,
+	0x00000000, 0x3c020800, 0x24421b74, 0x8c430000, 0x24630001, 0xac430000,
 	0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14,
-	0x3c020800, 0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50,
+	0x3c020800, 0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30,
 	0x2c620002, 0x1040fff7, 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c,
 	0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x12600003, 0x00000000,
-	0x0e0004b9, 0x00000000, 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c,
-	0x8fb00018, 0x03e00008, 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b98,
+	0x0e0004bf, 0x00000000, 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c,
+	0x8fb00018, 0x03e00008, 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b78,
 	0x8c820000, 0x00031c02, 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004,
 	0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444,
 	0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008,
 	0x3042ffff, 0x3c024000, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
 	0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821,
-	0x14c00017, 0x256e0008, 0x3c020800, 0x8c422404, 0x1040000a, 0x2402003e,
-	0x3c010800, 0xa42223e0, 0x24020016, 0x3c010800, 0xa42223e2, 0x2402002a,
-	0x3c010800, 0x0a000360, 0xa42223e4, 0x95620014, 0x3c010800, 0xa42223e0,
-	0x8d670010, 0x00071402, 0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4,
-	0x3c040800, 0x948423e4, 0x3c030800, 0x946323e2, 0x95cf0006, 0x3c020800,
-	0x944223e0, 0x00832023, 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821,
+	0x14c00011, 0x256e0008, 0x3c020800, 0x8c4223e4, 0x10400007, 0x24020016,
+	0x3c010800, 0xa42223c2, 0x2402002a, 0x3c010800, 0x0a000366, 0xa42223c4,
+	0x8d670010, 0x00071402, 0x3c010800, 0xa42223c2, 0x3c010800, 0xa42723c4,
+	0x3c040800, 0x948423c4, 0x3c030800, 0x946323c2, 0x95cf0006, 0x3c020800,
+	0x944223c0, 0x00832023, 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821,
 	0x3082ffff, 0x14c0001a, 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800,
-	0xa42223e6, 0x95820004, 0x95830006, 0x3c010800, 0xac2023f4, 0x3c010800,
-	0xac2023f8, 0x00021400, 0x00431025, 0x3c010800, 0xac221bd0, 0x95220004,
-	0x3c010800, 0xa4221bd4, 0x95230002, 0x01e51023, 0x0043102a, 0x10400010,
-	0x24020001, 0x3c010800, 0x0a000394, 0xac222408, 0x3c030800, 0x8c6323f8,
-	0x3c020800, 0x94421bd4, 0x00431021, 0xa5220004, 0x3c020800, 0x94421bd0,
-	0xa5820004, 0x3c020800, 0x8c421bd0, 0xa5820006, 0x3c020800, 0x8c422400,
-	0x3c0d0800, 0x8dad23f4, 0x3c0a0800, 0x144000e5, 0x8d4a23f8, 0x3c020800,
-	0x94421bd4, 0x004a1821, 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d,
-	0x01435023, 0x3c020800, 0x944223e6, 0x30420009, 0x10400008, 0x00000000,
-	0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, 0x944223e6, 0x30420009,
-	0x01a26823, 0x3c020800, 0x8c422408, 0x1040004a, 0x01203821, 0x3c020800,
-	0x944223e2, 0x00004021, 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff,
+	0xa42223c6, 0x95820004, 0x95830006, 0x3c010800, 0xac2023d4, 0x3c010800,
+	0xac2023d8, 0x00021400, 0x00431025, 0x3c010800, 0xac221bb0, 0x95220004,
+	0x3c010800, 0xa4221bb4, 0x95230002, 0x01e51023, 0x0043102a, 0x10400010,
+	0x24020001, 0x3c010800, 0x0a00039a, 0xac2223e8, 0x3c030800, 0x8c6323d8,
+	0x3c020800, 0x94421bb4, 0x00431021, 0xa5220004, 0x3c020800, 0x94421bb0,
+	0xa5820004, 0x3c020800, 0x8c421bb0, 0xa5820006, 0x3c020800, 0x8c4223e0,
+	0x3c0d0800, 0x8dad23d4, 0x3c0a0800, 0x144000e5, 0x8d4a23d8, 0x3c020800,
+	0x94421bb4, 0x004a1821, 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d,
+	0x01435023, 0x3c020800, 0x944223c6, 0x30420009, 0x10400008, 0x00000000,
+	0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, 0x944223c6, 0x30420009,
+	0x01a26823, 0x3c020800, 0x8c4223e8, 0x1040004a, 0x01203821, 0x3c020800,
+	0x944223c2, 0x00004021, 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff,
 	0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001,
 	0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff,
 	0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a,
@@ -4044,131 +4061,127 @@
 	0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80,
 	0x00625824, 0x25670008, 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001,
 	0x10400005, 0x00061c02, 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02,
-	0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x0a000479, 0x30c6ffff,
-	0x24020002, 0x14c20081, 0x00000000, 0x3c020800, 0x8c42241c, 0x14400007,
-	0x00000000, 0x3c020800, 0x944223e2, 0x95230002, 0x01e21023, 0x10620077,
-	0x00000000, 0x3c020800, 0x944223e2, 0x01e21023, 0xa5220002, 0x3c020800,
-	0x8c42241c, 0x1040001a, 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421ba6,
+	0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x0a00047f, 0x30c6ffff,
+	0x24020002, 0x14c20081, 0x00000000, 0x3c020800, 0x8c4223fc, 0x14400007,
+	0x00000000, 0x3c020800, 0x944223c2, 0x95230002, 0x01e21023, 0x10620077,
+	0x00000000, 0x3c020800, 0x944223c2, 0x01e21023, 0xa5220002, 0x3c020800,
+	0x8c4223fc, 0x1040001a, 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b86,
 	0x00e04021, 0x00072c02, 0x00aa2021, 0x00431023, 0x00823823, 0x00072402,
 	0x30e2ffff, 0x00823821, 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800,
-	0x948423e4, 0x00453023, 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021,
-	0x00061c02, 0x30c2ffff, 0x0a000479, 0x00623021, 0x01203821, 0x00004021,
+	0x948423c4, 0x00453023, 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021,
+	0x00061c02, 0x30c2ffff, 0x0a00047f, 0x00623021, 0x01203821, 0x00004021,
 	0x3082ffff, 0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000,
 	0x25080001, 0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02,
 	0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027,
 	0xa522000a, 0x00003021, 0x2527000c, 0x00004021, 0x94e20000, 0x25080001,
 	0x00c23021, 0x2d020004, 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021,
 	0x91230009, 0x00442023, 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800,
-	0x948423e4, 0x00621821, 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021,
-	0x00061c02, 0x3c020800, 0x944223e0, 0x00c34821, 0x00441023, 0x00021fc2,
+	0x948423c4, 0x00621821, 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021,
+	0x00061c02, 0x3c020800, 0x944223c0, 0x00c34821, 0x00441023, 0x00021fc2,
 	0x00431021, 0x00021043, 0x18400010, 0x00003021, 0x00402021, 0x94e20000,
 	0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000,
 	0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3,
-	0x00000000, 0x3c020800, 0x944223fc, 0x00c23021, 0x3122ffff, 0x00c23021,
+	0x00000000, 0x3c020800, 0x944223dc, 0x00c23021, 0x3122ffff, 0x00c23021,
 	0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021,
-	0x00061027, 0xa5820010, 0xadc00014, 0x0a000499, 0xadc00000, 0x8dc70010,
+	0x00061027, 0xa5820010, 0xadc00014, 0x0a00049f, 0xadc00000, 0x8dc70010,
 	0x00e04021, 0x11400007, 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff,
 	0x00433021, 0x00061402, 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800,
-	0x946323e4, 0x3102ffff, 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02,
+	0x946323c4, 0x3102ffff, 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02,
 	0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027,
 	0xa5820010, 0x3102ffff, 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800,
-	0x8c422404, 0x10400002, 0x25e2fff2, 0xa5c20034, 0x3c020800, 0x8c4223f8,
-	0x3c040800, 0x8c8423f4, 0x24420001, 0x3c010800, 0xac2223f8, 0x3c020800,
-	0x8c421bd0, 0x3303ffff, 0x00832021, 0x3c010800, 0xac2423f4, 0x00431821,
-	0x0062102b, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223f4, 0x3c010800,
-	0xac231bd0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, 0x24a51ba8,
+	0x8c4223e4, 0x10400002, 0x25e2fff2, 0xa5c20034, 0x3c020800, 0x8c4223d8,
+	0x3c040800, 0x8c8423d4, 0x24420001, 0x3c010800, 0xac2223d8, 0x3c020800,
+	0x8c421bb0, 0x3303ffff, 0x00832021, 0x3c010800, 0xac2423d4, 0x00431821,
+	0x0062102b, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223d4, 0x3c010800,
+	0xac231bb0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, 0x24a51b86,
 	0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034, 0xafb40030,
-	0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x90a30000, 0x24020003,
-	0x146200d5, 0x00000000, 0x3c090800, 0x95291ba6, 0x3c020800, 0x944223e0,
-	0x3c030800, 0x8c631bc0, 0x3c040800, 0x8c841bbc, 0x01221023, 0x0064182a,
-	0xa7a9001e, 0x106000c8, 0xa7a20016, 0x24be0020, 0x97b6001e, 0x24b30018,
-	0x24b70014, 0x8fc20000, 0x14400008, 0x00000000, 0x8fc2fff8, 0x97a30016,
-	0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000ba, 0x00000000, 0x97d50818,
-	0x32a2ffff, 0x104000ad, 0x00009021, 0x0040a021, 0x00008821, 0x0e00062d,
-	0x00000000, 0x00403021, 0x14c00007, 0x00000000, 0x3c020800, 0x8c4223ec,
-	0x24420001, 0x3c010800, 0x0a00059e, 0xac2223ec, 0x3c100800, 0x02118021,
-	0x8e101bd8, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c,
-	0x2407188c, 0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040,
-	0x3042c000, 0x00623825, 0x31020080, 0x54400001, 0x34e70010, 0x3c020800,
-	0x00511021, 0x8c421be0, 0x3c030800, 0x00711821, 0x8c631be4, 0x00021500,
-	0x00031c00, 0x00431025, 0xacc20014, 0x96040008, 0x3242ffff, 0x00821021,
-	0x0282102a, 0x14400002, 0x02b22823, 0x00802821, 0x8e020000, 0x02459021,
-	0xacc20000, 0x8e020004, 0x00c02021, 0x26310010, 0xac820004, 0x30e2ffff,
-	0xac800008, 0xa485000e, 0xac820010, 0x24020305, 0x0e0005aa, 0xa482000c,
-	0x3242ffff, 0x0054102b, 0x1440ffc0, 0x3242ffff, 0x0a000596, 0x00000000,
-	0x8e620000, 0x8e63fffc, 0x0043102a, 0x1040006c, 0x00000000, 0x8e62fff0,
-	0x00028900, 0x3c100800, 0x02118021, 0x0e00062d, 0x8e101bd8, 0x00403021,
-	0x14c00005, 0x00000000, 0x8e62082c, 0x24420001, 0x0a00059e, 0xae62082c,
-	0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c, 0x2407188c,
-	0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000,
-	0x00623825, 0x3c020800, 0x00511021, 0x8c421be0, 0x3c030800, 0x00711821,
-	0x8c631be4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4,
-	0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a,
-	0x10400003, 0x00802821, 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff,
-	0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004,
-	0x8e63fff4, 0x00431021, 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821,
-	0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001,
-	0x0a000579, 0xae62fff0, 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003,
-	0x31020004, 0x10400006, 0x24020305, 0x31020080, 0x54400001, 0x34e70010,
-	0x34e70020, 0x24020905, 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007,
-	0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000590,
-	0x34427654, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa,
-	0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff96, 0x00000000, 0x8e620000,
-	0x8e63fffc, 0x0043102a, 0x1440ff3e, 0x00000000, 0x8fbf0044, 0x8fbe0040,
-	0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028,
-	0x8fb10024, 0x8fb00020, 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014,
-	0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005b9, 0x00808021, 0x8f626820,
-	0x30422000, 0x10400003, 0x00000000, 0x0e0001e3, 0x00002021, 0x8f624450,
-	0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14,
-	0x3063000f, 0x2c620002, 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800,
-	0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50, 0x2c620002,
-	0x1040fff7, 0x00000000, 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009,
-	0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001e3,
-	0x00002021, 0x0a0005cc, 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008,
-	0x27bd0018, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000,
+	0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000, 0x3c020800,
+	0x944223c0, 0x3c030800, 0x8c631ba0, 0x3c040800, 0x8c841b9c, 0x01221023,
+	0x0064182a, 0xa7a9001e, 0x106000bc, 0xa7a20016, 0x24be0022, 0x97b6001e,
+	0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000, 0x8fc2fff8,
+	0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000ae, 0x00000000,
+	0x97d50818, 0x32a2ffff, 0x104000a1, 0x00009021, 0x0040a021, 0x00008821,
+	0x0e000621, 0x00000000, 0x00403021, 0x14c00007, 0x00000000, 0x3c020800,
+	0x8c4223cc, 0x24420001, 0x3c010800, 0x0a000593, 0xac2223cc, 0x3c100800,
+	0x02118021, 0x8e101bb8, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c,
+	0x8e02000c, 0x2407188c, 0xacc20018, 0x31020080, 0x54400001, 0x34e70010,
+	0x3c020800, 0x00511021, 0x8c421bc0, 0x3c030800, 0x00711821, 0x8c631bc4,
+	0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x96040008, 0x3242ffff,
+	0x00821021, 0x0282102a, 0x14400002, 0x02b22823, 0x00802821, 0x8e020000,
+	0x02459021, 0xacc20000, 0x8e020004, 0x00c02021, 0x26310010, 0xac820004,
+	0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010, 0x24020305, 0x0e00059f,
+	0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc6, 0x3242ffff, 0x0a00058b,
+	0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a, 0x10400066, 0x00000000,
+	0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021, 0x0e000621, 0x8e101bb8,
+	0x00403021, 0x14c00005, 0x00000000, 0x8e62082c, 0x24420001, 0x0a000593,
+	0xae62082c, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c,
+	0x2407188c, 0xacc20018, 0x3c020800, 0x00511021, 0x8c421bc0, 0x3c030800,
+	0x00711821, 0x8c631bc4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014,
+	0x8e63fff4, 0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021,
+	0x02c2102a, 0x10400003, 0x00802821, 0x97a9001e, 0x01322823, 0x8e620000,
+	0x30a4ffff, 0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, 0xacc20000,
+	0x8e020004, 0x8e63fff4, 0x00431021, 0xacc20004, 0x8e63fff4, 0x96020008,
+	0x00641821, 0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, 0xae60fff4,
+	0x24420001, 0x0a00056e, 0xae62fff0, 0xae63fff4, 0xacc00008, 0x3242ffff,
+	0x10560003, 0x31020004, 0x10400006, 0x24020305, 0x31020080, 0x54400001,
+	0x34e70010, 0x34e70020, 0x24020905, 0xa4c2000c, 0x8ee30000, 0x8ee20004,
+	0x14620007, 0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, 0x3c024b65,
+	0x0a000585, 0x34427654, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010,
+	0x0e00059f, 0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff9c, 0x00000000,
+	0x8e620000, 0x8e63fffc, 0x0043102a, 0x1440ff4a, 0x00000000, 0x8fbf0044,
+	0x8fbe0040, 0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, 0x8fb3002c,
+	0x8fb20028, 0x8fb10024, 0x8fb00020, 0x03e00008, 0x27bd0048, 0x27bdffe8,
+	0xafbf0014, 0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005ae, 0x00808021,
+	0x8f626820, 0x30422000, 0x10400003, 0x00000000, 0x0e0001ef, 0x00002021,
+	0x8f624450, 0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, 0x00000000,
+	0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000b, 0x00000000, 0x8f630c14,
+	0x3c020800, 0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30,
+	0x2c620002, 0x1040fff7, 0x00000000, 0xaf705c18, 0x8f625c10, 0x30420002,
+	0x10400009, 0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, 0x00000000,
+	0x0e0001ef, 0x00002021, 0x0a0005c1, 0x00000000, 0x8fbf0014, 0x8fb00010,
+	0x03e00008, 0x27bd0018, 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000,
 	0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804,
-	0x8f634000, 0x24020b50, 0x3c010800, 0xac221b64, 0x24020b78, 0x3c010800,
-	0xac221b74, 0x34630002, 0xaf634000, 0x0e00060d, 0x00808021, 0x3c010800,
-	0xa0221b78, 0x304200ff, 0x24030002, 0x14430005, 0x00000000, 0x3c020800,
-	0x8c421b64, 0x0a000600, 0xac5000c0, 0x3c020800, 0x8c421b64, 0xac5000bc,
-	0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, 0xac221b6c, 0x3c010800,
-	0xac231b7c, 0x3c010800, 0xac241b68, 0x8fbf0014, 0x8fb00010, 0x03e00008,
+	0x8f634000, 0x24020b50, 0x3c010800, 0xac221b44, 0x24020b78, 0x3c010800,
+	0xac221b54, 0x34630002, 0xaf634000, 0x0e000601, 0x00808021, 0x3c010800,
+	0xa0221b58, 0x304200ff, 0x24030002, 0x14430005, 0x00000000, 0x3c020800,
+	0x8c421b44, 0x0a0005f4, 0xac5000c0, 0x3c020800, 0x8c421b44, 0xac5000bc,
+	0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, 0xac221b4c, 0x3c010800,
+	0xac231b5c, 0x3c010800, 0xac241b48, 0x8fbf0014, 0x8fb00010, 0x03e00008,
 	0x27bd0018, 0x3c040800, 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003,
 	0xac830000, 0x8cc20000, 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa,
 	0xac830000, 0x8cc20000, 0x50430001, 0x24050001, 0x3c020800, 0xac470000,
 	0x03e00008, 0x00a01021, 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c,
 	0x8f62680c, 0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9,
-	0x00000000, 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b6c,
-	0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b7c,
+	0x00000000, 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b4c,
+	0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b5c,
 	0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444,
 	0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008,
 	0x3042ffff, 0x3082ffff, 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000,
-	0x0a000650, 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
+	0x0a000644, 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
 	0x1440fffc, 0x00001021, 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800,
-	0x8c631b68, 0x0a000659, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b,
+	0x8c631b48, 0x0a00064d, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b,
 	0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821,
-	0x3c040800, 0x24841b10, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-	0x0e000684, 0xafa00014, 0x0a000668, 0x00000000, 0x8fbf0018, 0x03e00008,
+	0x3c040800, 0x24841ae0, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
+	0x0e000678, 0xafa00014, 0x0a00065c, 0x00000000, 0x8fbf0018, 0x03e00008,
 	0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x3c020800, 0x34423000,
-	0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b84,
-	0x24020040, 0x3c010800, 0xac221b88, 0x3c010800, 0xac201b80, 0xac600000,
+	0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b64,
+	0x24020040, 0x3c010800, 0xac221b68, 0x3c010800, 0xac201b60, 0xac600000,
 	0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
-	0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b80, 0x3c040800, 0x8c841b88,
-	0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac231b80, 0x14400003,
-	0x00004021, 0x3c010800, 0xac201b80, 0x3c020800, 0x8c421b80, 0x3c030800,
-	0x8c631b84, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
-	0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b80,
-	0x3c030800, 0x8c631b84, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
+	0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b60, 0x3c040800, 0x8c841b68,
+	0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac231b60, 0x14400003,
+	0x00004021, 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x3c030800,
+	0x8c631b64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
+	0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b60,
+	0x3c030800, 0x8c631b64, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
 	0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
 	0x00000000, 0x00000000,
 };
 
 u32 tg3TsoFwRodata[] = {
-	0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541,
-	0x00000000, 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64,
-	0x496e0000, 0x73746b6f, 0x66662a2a, 0x00000000, 0x53774576,
-	0x656e7430, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x66617461, 0x6c457272, 0x00000000, 0x00000000, 0x00000000
+	0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
+	0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f,
+	0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000,
+	0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000,
 };
 
 #if 0 /* All zeros, don't eat up space with it. */
@@ -4541,7 +4554,10 @@
 
 	tg3_chip_reset(tp);
 
-	tw32(GRC_MODE, tp->grc_mode);
+	val = tr32(GRC_MODE);
+	val &= GRC_MODE_HOST_STACKUP;
+	tw32(GRC_MODE, val | tp->grc_mode);
+
 	tg3_write_mem(tp,
 		      NIC_SRAM_FIRMWARE_MBOX,
 		      NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
@@ -4597,17 +4613,6 @@
 	 */
 	tg3_init_rings(tp);
 
-	/* Clear statistics/status block in chip, and status block in ram. */
-	if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
-		for (i = NIC_SRAM_STATS_BLK;
-	     	     i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
-	     	     i += sizeof(u32)) {
-			tg3_write_mem(tp, i, 0);
-			udelay(40);
-		}
-	}
-	memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
-
 	/* This value is determined during the probe time DMA
 	 * engine test, tg3_test_dma.
 	 */
@@ -4706,6 +4711,17 @@
 		return -ENODEV;
 	}
 
+	/* Clear statistics/status block in chip, and status block in ram. */
+	if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
+		for (i = NIC_SRAM_STATS_BLK;
+	     	     i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
+	     	     i += sizeof(u32)) {
+			tg3_write_mem(tp, i, 0);
+			udelay(40);
+		}
+	}
+	memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
+
 	/* Setup replenish threshold. */
 	tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8);
 
@@ -5760,14 +5776,20 @@
 
 	rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
 				  RX_MODE_KEEP_VLAN_TAG);
+
+	/* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
+	 * flag clear.
+	 */
 #if TG3_VLAN_TAG_USED
-	if (!tp->vlgrp)
+	if (!tp->vlgrp &&
+	    !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
 		rx_mode |= RX_MODE_KEEP_VLAN_TAG;
 #else
 	/* By definition, VLAN is disabled always in this
 	 * case.
 	 */
-	rx_mode |= RX_MODE_KEEP_VLAN_TAG;
+	if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
+		rx_mode |= RX_MODE_KEEP_VLAN_TAG;
 #endif
 
 	if (dev->flags & IFF_PROMISC) {
@@ -6402,25 +6424,22 @@
 
 static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
 	/* Broadcom boards. */
-	{ 0x14e4, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
-	{ 0x14e4, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
-	{ 0x14e4, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
-	{ 0x14e4, 0x0003, PHY_ID_SERDES  }, /* BCM95700A9 */
-	{ 0x14e4, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
-	{ 0x14e4, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
-	{ 0x14e4, 0x0007, PHY_ID_SERDES  }, /* BCM95701A7 */
-	{ 0x14e4, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
-	{ 0x14e4, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
-	{ 0x14e4, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
-	{ 0x14e4, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0003, PHY_ID_SERDES  }, /* BCM95700A9 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0007, PHY_ID_SERDES  }, /* BCM95701A7 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
 
 	/* 3com boards. */
 	{ PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
 	{ PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
-	/* { PCI_VENDOR_ID_3COM, 0x1002, PHY_ID_XXX },     3C996CT */
-	/* { PCI_VENDOR_ID_3COM, 0x1003, PHY_ID_XXX },     3C997T */
 	{ PCI_VENDOR_ID_3COM, 0x1004, PHY_ID_SERDES  }, /* 3C996SX */
-	/* { PCI_VENDOR_ID_3COM, 0x1005, PHY_ID_XXX },     3C997SZ */
 	{ PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
 	{ PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
 
@@ -6435,7 +6454,10 @@
 	{ PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
 	{ PCI_VENDOR_ID_COMPAQ, 0x007d, PHY_ID_SERDES  }, /* CHANGELING */
 	{ PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
-	{ PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }  /* NC7780_2 */
+	{ PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }, /* NC7780_2 */
+
+	/* IBM boards. */
+	{ PCI_VENDOR_ID_IBM, 0x0281, PHY_ID_SERDES } /* IBM??? */
 };
 
 static int __devinit tg3_phy_probe(struct tg3 *tp)
@@ -6716,6 +6738,7 @@
 	u32 misc_ctrl_reg;
 	u32 cacheline_sz_reg;
 	u32 pci_state_reg, grc_misc_cfg;
+	u32 val;
 	u16 pci_cmd;
 	int err;
 
@@ -6912,7 +6935,9 @@
 	udelay(40);
 
 	/* Initialize data/descriptor byte/word swapping. */
-	tw32(GRC_MODE, tp->grc_mode);
+	val = tr32(GRC_MODE);
+	val &= GRC_MODE_HOST_STACKUP;
+	tw32(GRC_MODE, val | tp->grc_mode);
 
 	tg3_switch_clocks(tp);
 
@@ -6975,7 +7000,8 @@
 	    (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
 	     tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
 	     (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 ||
-	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2)))
+	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 ||
+	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)))
 		tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
 
 	err = tg3_phy_probe(tp);
@@ -7526,13 +7552,16 @@
 	if (pm_cap == 0) {
 		printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
 		       "aborting.\n");
+		err = -EIO;
 		goto err_out_free_res;
 	}
 
 	/* Configure DMA attributes. */
-	if (!pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
+	err = pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
+	if (!err) {
 		pci_using_dac = 1;
-		if (pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL)) {
+		err = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL);
+		if (err < 0) {
 			printk(KERN_ERR PFX "Unable to obtain 64 bit DMA "
 			       "for consistent allocations\n");
 			goto err_out_free_res;
diff -Nru a/drivers/net/tokenring/Kconfig b/drivers/net/tokenring/Kconfig
--- a/drivers/net/tokenring/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/tokenring/Kconfig	Thu Jan  8 23:00:23 2004
@@ -107,7 +107,7 @@
 
 config TMSPCI
 	tristate "Generic TMS380 PCI support"
-	depends on TR && TMS380TR!=n && PCI
+	depends on TR && TMS380TR && PCI
 	---help---
 	  This tms380 module supports generic TMS380-based PCI cards.
 
@@ -122,7 +122,7 @@
 
 config SKISA
 	tristate "SysKonnect TR4/16 ISA support"
-	depends on TR && TMS380TR!=n && ISA
+	depends on TR && TMS380TR && ISA
 	help
 	  This tms380 module supports SysKonnect TR4/16 ISA cards.
 
@@ -134,7 +134,7 @@
 
 config PROTEON
 	tristate "Proteon ISA support"
-	depends on TR && TMS380TR!=n && ISA
+	depends on TR && TMS380TR && ISA
 	help
 	  This tms380 module supports Proteon ISA cards.
 
@@ -147,7 +147,7 @@
 
 config ABYSS
 	tristate "Madge Smart 16/4 PCI Mk2 support"
-	depends on TR && TMS380TR!=n && PCI
+	depends on TR && TMS380TR && PCI
 	help
 	  This tms380 module supports the Madge Smart 16/4 PCI Mk2
 	  cards (51-02).
@@ -157,7 +157,7 @@
 
 config MADGEMC
 	tristate "Madge Smart 16/4 Ringnode MicroChannel"
-	depends on TR && TMS380TR!=n && MCA
+	depends on TR && TMS380TR && MCA
 	help
 	  This tms380 module supports the Madge Smart 16/4 MC16 and MC32
 	  MicroChannel adapters.
diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c
--- a/drivers/net/typhoon.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/typhoon.c	Thu Jan  8 23:00:24 2004
@@ -85,8 +85,8 @@
 #define PKT_BUF_SZ		1536
 
 #define DRV_MODULE_NAME		"typhoon"
-#define DRV_MODULE_VERSION 	"1.5.1"
-#define DRV_MODULE_RELDATE	"03/06/26"
+#define DRV_MODULE_VERSION 	"1.5.2"
+#define DRV_MODULE_RELDATE	"03/11/25"
 #define PFX			DRV_MODULE_NAME ": "
 #define ERR_PFX			KERN_ERR PFX
 
@@ -127,7 +127,7 @@
 static char version[] __devinitdata =
     "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
-MODULE_AUTHOR("David Dillow <dillowd@y12.doe.gov>");
+MODULE_AUTHOR("David Dillow <dave@thedillows.org>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("3Com Typhoon Family (3C990, 3CR990, and variants)");
 MODULE_PARM(rx_copybreak, "i");
@@ -146,11 +146,12 @@
 	int capabilities;
 };
 
-#define TYPHOON_CRYPTO_NONE		0
-#define TYPHOON_CRYPTO_DES		1
-#define TYPHOON_CRYPTO_3DES		2
-#define	TYPHOON_CRYPTO_VARIABLE		4
-#define TYPHOON_FIBER			8
+#define TYPHOON_CRYPTO_NONE		0x00
+#define TYPHOON_CRYPTO_DES		0x01
+#define TYPHOON_CRYPTO_3DES		0x02
+#define	TYPHOON_CRYPTO_VARIABLE		0x04
+#define TYPHOON_FIBER			0x08
+#define TYPHOON_WAKEUP_NEEDS_RESET	0x10
 
 enum typhoon_cards {
 	TYPHOON_TX = 0, TYPHOON_TX95, TYPHOON_TX97, TYPHOON_SVR,
@@ -307,7 +308,8 @@
 /* We'll wait up to six seconds for a reset, and half a second normally.
  */
 #define TYPHOON_UDELAY			50
-#define TYPHOON_RESET_TIMEOUT		(6 * HZ)
+#define TYPHOON_RESET_TIMEOUT_SLEEP	(6 * HZ)
+#define TYPHOON_RESET_TIMEOUT_NOSLEEP	((6 * 1000000) / TYPHOON_UDELAY)
 #define TYPHOON_WAIT_TIMEOUT		((1000000 / 2) / TYPHOON_UDELAY)
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 28)
@@ -375,10 +377,12 @@
 typhoon_reset(unsigned long ioaddr, int wait_type)
 {
 	int i, err = 0;
-	int timeout = TYPHOON_RESET_TIMEOUT;
+	int timeout;
 
 	if(wait_type == WaitNoSleep)
-		timeout = (timeout * 1000000) / (HZ * TYPHOON_UDELAY);
+		timeout = TYPHOON_RESET_TIMEOUT_NOSLEEP;
+	else
+		timeout = TYPHOON_RESET_TIMEOUT_SLEEP;
 
 	writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK);
 	writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS);
@@ -1858,6 +1862,11 @@
 	if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_SLEEPING) < 0)
 		return -ETIMEDOUT;
 
+	/* Since we cannot monitor the status of the link while sleeping,
+	 * tell the world it went away.
+	 */
+	netif_carrier_off(tp->dev);
+
 	pci_enable_wake(tp->pdev, state, 1);
 	pci_disable_device(pdev);
 	return pci_set_power_state(pdev, state);
@@ -1872,8 +1881,13 @@
 	pci_set_power_state(pdev, 0);
 	pci_restore_state(pdev, tp->pci_state);
 
+	/* Post 2.x.x versions of the Sleep Image require a reset before
+	 * we can download the Runtime Image. But let's not make users of
+	 * the old firmware pay for the reset.
+	 */
 	writel(TYPHOON_BOOTCMD_WAKEUP, ioaddr + TYPHOON_REG_COMMAND);
-	if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_HOST) < 0)
+	if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_HOST) < 0 ||
+			(tp->capabilities & TYPHOON_WAKEUP_NEEDS_RESET))
 		return typhoon_reset(ioaddr, wait_type);
 
 	return 0;
@@ -2251,7 +2265,7 @@
 	void *shared;
 	dma_addr_t shared_dma;
 	struct cmd_desc xp_cmd;
-	struct resp_desc xp_resp;
+	struct resp_desc xp_resp[3];
 	int i;
 	int err = 0;
 
@@ -2380,15 +2394,15 @@
 	}
 
 	INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_MAC_ADDRESS);
-	if(typhoon_issue_command(tp, 1, &xp_cmd, 1, &xp_resp) < 0) {
+	if(typhoon_issue_command(tp, 1, &xp_cmd, 1, xp_resp) < 0) {
 		printk(ERR_PFX "%s: cannot read MAC address\n",
 		       pci_name(pdev));
 		err = -EIO;
 		goto error_out_reset;
 	}
 
-	*(u16 *)&dev->dev_addr[0] = htons(le16_to_cpu(xp_resp.parm1));
-	*(u32 *)&dev->dev_addr[2] = htonl(le32_to_cpu(xp_resp.parm2));
+	*(u16 *)&dev->dev_addr[0] = htons(le16_to_cpu(xp_resp[0].parm1));
+	*(u32 *)&dev->dev_addr[2] = htonl(le32_to_cpu(xp_resp[0].parm2));
 
 	if(!is_valid_ether_addr(dev->dev_addr)) {
 		printk(ERR_PFX "%s: Could not obtain valid ethernet address, "
@@ -2396,6 +2410,28 @@
 		goto error_out_reset;
 	}
 
+	/* Read the Sleep Image version last, so the response is valid
+	 * later when we print out the version reported.
+	 */
+	INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_VERSIONS);
+	if(typhoon_issue_command(tp, 1, &xp_cmd, 3, xp_resp) < 0) {
+		printk(ERR_PFX "%s: Could not get Sleep Image version\n",
+			pdev->slot_name);
+		goto error_out_reset;
+	}
+
+	tp->capabilities = typhoon_card_info[card_id].capabilities;
+	tp->xcvr_select = TYPHOON_XCVR_AUTONEG;
+
+	/* Typhoon 1.0 Sleep Images return one response descriptor to the
+	 * READ_VERSIONS command. Those versions are OK after waking up
+	 * from sleep without needing a reset. Typhoon 1.1+ Sleep Images
+	 * seem to need a little extra help to get started. Since we don't
+	 * know how to nudge it along, just kick it.
+	 */
+	if(xp_resp[0].numDesc != 0)
+		tp->capabilities |= TYPHOON_WAKEUP_NEEDS_RESET;
+
 	if(typhoon_sleep(tp, 3, 0) < 0) {
 		printk(ERR_PFX "%s: cannot put adapter to sleep\n",
 		       pci_name(pdev));
@@ -2403,9 +2439,6 @@
 		goto error_out_reset;
 	}
 
-	tp->capabilities = typhoon_card_info[card_id].capabilities;
-	tp->xcvr_select = TYPHOON_XCVR_AUTONEG;
-
 	/* The chip-specific entries in the device structure. */
 	dev->open		= typhoon_open;
 	dev->hard_start_xmit	= typhoon_start_tx;
@@ -2442,6 +2475,32 @@
 		printk("%2.2x:", dev->dev_addr[i]);
 	printk("%2.2x\n", dev->dev_addr[i]);
 
+	/* xp_resp still contains the response to the READ_VERSIONS command.
+	 * For debugging, let the user know what version he has.
+	 */
+	if(xp_resp[0].numDesc == 0) {
+		/* This is the Typhoon 1.0 type Sleep Image, last 16 bits
+		 * of version is Month/Day of build.
+		 */
+		u16 monthday = le32_to_cpu(xp_resp[0].parm2) & 0xffff;
+		printk(KERN_INFO "%s: Typhoon 1.0 Sleep Image built "
+			"%02u/%02u/2000\n", dev->name, monthday >> 8,
+			monthday & 0xff);
+	} else if(xp_resp[0].numDesc == 2) {
+		/* This is the Typhoon 1.1+ type Sleep Image
+		 */
+		u32 sleep_ver = le32_to_cpu(xp_resp[0].parm2);
+		u8 *ver_string = (u8 *) &xp_resp[1];
+		ver_string[25] = 0;
+		printk(KERN_INFO "%s: Typhoon 1.1+ Sleep Image version "
+			"%u.%u.%u.%u %s\n", dev->name, HIPQUAD(sleep_ver),
+			ver_string);
+	} else {
+		printk(KERN_WARNING "%s: Unknown Sleep Image version "
+			"(%u:%04x)\n", dev->name, xp_resp[0].numDesc,
+			le32_to_cpu(xp_resp[0].parm2));
+	}
+		
 	return 0;
 
 error_out_reset:
diff -Nru a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig
--- a/drivers/net/wan/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/wan/Kconfig	Thu Jan  8 23:00:23 2004
@@ -334,7 +334,7 @@
 
 	  If you want to compile the driver as a module ( = code which can be
 	  inserted in and removed from the running kernel whenever you want),
-	  say M here and read <file:Documentation/modules.txt>.  The module
+	  say M here and read <file:Documentation/kbuild/modules.txt>.  The module
 	  will be called wanxl.
 
 	  If unsure, say N here.
@@ -467,7 +467,7 @@
 	  Say Y here if you need a driver for the Sangoma S502A, S502E, and
 	  S508 Frame Relay Access Devices. These are multi-protocol cards, but
 	  only frame relay is supported by the driver at this time. Please
-	  read <file:Documentation/framerelay.txt>.
+	  read <file:Documentation/networking/framerelay.txt>.
 
 	  To compile this driver as a module, choose M here: the module will be
 	  called sdla.
diff -Nru a/drivers/net/wan/cycx_drv.c b/drivers/net/wan/cycx_drv.c
--- a/drivers/net/wan/cycx_drv.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/net/wan/cycx_drv.c	Thu Jan  8 23:00:24 2004
@@ -425,8 +425,8 @@
 	if (cksum != cfm->checksum) {
 		printk(KERN_ERR "%s:%s: firmware corrupted!\n",
 				modname, __FUNCTION__);
-		printk(KERN_ERR " cdsize = 0x%lx (expected 0x%lx)\n",
-				len - sizeof(struct cycx_firmware) - 1,
+		printk(KERN_ERR " cdsize = 0x%x (expected 0x%x)\n",
+				len - (int)sizeof(struct cycx_firmware) - 1,
 				cfm->info.codesize);
 		printk(KERN_ERR " chksum = 0x%x (expected 0x%x)\n",
 				cksum, cfm->checksum);
diff -Nru a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c
--- a/drivers/net/wireless/atmel.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/net/wireless/atmel.c	Thu Jan  8 23:00:23 2004
@@ -748,13 +748,13 @@
 	
 	if(priv->station_state != STATION_STATE_READY) {
 		priv->stats.tx_errors++;
-		return 0;
+		goto done;
 	}
 	
 	if (priv->card && priv->present_callback && 
 	    !(*priv->present_callback)(priv->card)) {
 		priv->stats.tx_errors++;
-		return 0;
+		goto done;
 	}
 	
 	/* first ensure the timer func cannot run */
@@ -804,6 +804,8 @@
 	
 	spin_unlock_irqrestore(&priv->irqlock, flags);
 	spin_unlock_bh(&priv->timerlock);
+
+done:
 	dev_kfree_skb(skb);
 	
 	return 0;	
diff -Nru a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig
--- a/drivers/parisc/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/parisc/Kconfig	Thu Jan  8 23:00:24 2004
@@ -109,7 +109,7 @@
 
 config SUPERIO
 	bool "SuperIO (SuckyIO) support"
-	depends on PCI
+	depends on PCI_LBA
 	default y
 	help
 	  Say Y here to support the SuperIO chip found in Bxxxx, C3xxx and
@@ -124,10 +124,23 @@
 	  Disk/Network activities LEDs on some PA-RISC machines,
 	  or support for the LCD that can be found on recent material.
 	
-	  This has nothing to do with LED State support for A, J and E class.
+	  This has nothing to do with LED State support for A and E class.
 	
 	  If unsure, say Y.
 
+config PDC_CHASSIS
+	bool "PDC chassis State Panel support"
+	default y
+	help
+	  Say Y here if you want to enable support for the LED State front
+	  panel as found on E class, and support for the GSP Virtual Front
+	  Panel (LED State and message logging)  as found on high end
+	  servers such as A, L and N-class.
+	  
+	  This has nothing to do with Chassis LCD and LED support.
+	  
+	  If unsure, say Y.
+ 
 config HOTPLUG
 	bool "Support for hot-pluggable devices"
 	---help---
diff -Nru a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
--- a/drivers/parisc/ccio-dma.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/parisc/ccio-dma.c	Thu Jan  8 23:00:23 2004
@@ -483,7 +483,7 @@
 */
 #define IOPDIR_VALID    0x01UL
 #define HINT_SAFE_DMA   0x02UL	/* used for pci_alloc_consistent() pages */
-#ifdef CONFIG_ISA	/* EISA support really */
+#ifdef CONFIG_EISA
 #define HINT_STOP_MOST  0x04UL	/* LSL support */
 #else
 #define HINT_STOP_MOST  0x00UL	/* only needed for "some EISA devices" */
@@ -617,7 +617,7 @@
 		WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_hpa->io_command);
 		iovp += chain_size;
 		byte_cnt -= chain_size;
-      }
+	}
 }
 
 /**
@@ -1312,8 +1312,8 @@
  * ccio_get_iommu - Find the iommu which controls this device
  * @dev: The parisc device.
  *
- * This function searches through the registerd IOMMU's and returns the
- * appropriate IOMMU for the device based upon the devices hardware path.
+ * This function searches through the registered IOMMU's and returns
+ * the appropriate IOMMU for the device based on its hardware path.
  */
 void * ccio_get_iommu(const struct parisc_device *dev)
 {
@@ -1509,12 +1509,13 @@
 {
 	int result;
 
+	res->parent = NULL;
 	res->flags = IORESOURCE_MEM;
 	res->start = (unsigned long)(signed) __raw_readl(ioaddr) << 16;
 	res->end = (unsigned long)(signed) (__raw_readl(ioaddr + 4) << 16) - 1;
+	res->name = name;
 	if (res->end + 1 == res->start)
 		return;
-	res->name = name;
 	result = request_resource(&iomem_resource, res);
 	if (result < 0) {
 		printk(KERN_ERR "%s: failed to claim CCIO bus address space (%08lx,%08lx)\n", 
@@ -1534,120 +1535,111 @@
 			(unsigned long)&ioc->ioc_hpa->io_io_low_hv);
 }
 
-static int expand_resource(struct resource *res, unsigned long size,
-			   unsigned long align)
+static int new_ioc_area(struct resource *res, unsigned long size,
+		unsigned long min, unsigned long max, unsigned long align)
 {
-	struct resource *temp_res;
-	unsigned long start = res->start;
-	unsigned long end ;
+	if (max <= min)
+		return -EBUSY;
 
-	/* see if we can expand above */
-	end = (res->end + size + align - 1) & ~(align - 1);;
-	
-	temp_res = __request_region(res->parent, res->end, end - res->end,
-				    "expansion");
-	if(!temp_res) {
-		/* now try below */
-		start = ((res->start - size + align) & ~(align - 1)) - align;
-		end = res->end;
-		temp_res = __request_region(res->parent, start, size,
-					    "expansion");	
-		if(!temp_res) {
-			return -ENOMEM;
-		}
-	} 
-	release_resource(temp_res);
-	temp_res = res->parent;
-	release_resource(res);
-	res->start = start;
-	res->end = end;
-
-	/* This could be caused by some sort of race.  Basically, if
-	 * this tripped something stole the region we just reserved
-	 * and then released to check for expansion */
-	BUG_ON(request_resource(temp_res, res) != 0);
-
-	return 0;
-}
-
-static void expand_ioc_area(struct resource *parent, struct ioc *ioc,
-			    unsigned long size,	unsigned long min,
-			    unsigned long max, unsigned long align)
+	res->start = (max - size + 1) &~ (align - 1);
+	res->end = res->start + size;
+	if (!request_resource(&iomem_resource, res))
+		return 0;
+
+	return new_ioc_area(res, size, min, max - size, align);
+}
+
+static int expand_ioc_area(struct resource *res, unsigned long size,
+		unsigned long min, unsigned long max, unsigned long align)
 {
-	if(ioc == NULL)
-		/* no IOC, so nothing to expand */
-		return;
+	unsigned long start, len;
 
-	if (expand_resource(parent, size, align) != 0) {
-		printk(KERN_ERR "Unable to expand %s window by 0x%lx\n",
-		       parent->name, size);
-		return;
+	if (!res->parent)
+		return new_ioc_area(res, size, min, max, align);
+
+	start = (res->start - size) &~ (align - 1);
+	len = res->end - start + 1;
+	if (start >= min) {
+		if (!adjust_resource(res, start, len))
+			return 0;
+	}
+
+	start = res->start;
+	len = ((size + res->end + align) &~ (align - 1)) - start;
+	if (start + len <= max) {
+		if (!adjust_resource(res, start, len))
+			return 0;
 	}
 
-	/* OK, we have the memory, now expand the window */
-	if (parent == &ioc->mmio_region[0]) {
+	return -EBUSY;
+}
+
+/*
+ * Dino calls this function.  Beware that we may get called on systems
+ * which have no IOC (725, B180, C160L, etc) but do have a Dino.
+ * So it's legal to find no parent IOC.
+ *
+ * Some other issues: one of the resources in the ioc may be unassigned.
+ */
+int ccio_allocate_resource(const struct parisc_device *dev,
+		struct resource *res, unsigned long size,
+		unsigned long min, unsigned long max, unsigned long align)
+{
+	struct resource *parent = &iomem_resource;
+	struct ioc *ioc = ccio_get_iommu(dev);
+	if (!ioc)
+		goto out;
+
+	parent = ioc->mmio_region;
+	if (parent->parent &&
+	    !allocate_resource(parent, res, size, min, max, align, NULL, NULL))
+		return 0;
+
+	if ((parent + 1)->parent &&
+	    !allocate_resource(parent + 1, res, size, min, max, align,
+				NULL, NULL))
+		return 0;
+
+	if (!expand_ioc_area(parent, size, min, max, align)) {
 		__raw_writel(((parent->start)>>16) | 0xffff0000,
 			     (unsigned long)&(ioc->ioc_hpa->io_io_low));
 		__raw_writel(((parent->end)>>16) | 0xffff0000,
 			     (unsigned long)&(ioc->ioc_hpa->io_io_high));
-	} else if (parent == &ioc->mmio_region[1]) {
+	} else if (!expand_ioc_area(parent + 1, size, min, max, align)) {
+		parent++;
 		__raw_writel(((parent->start)>>16) | 0xffff0000,
 			     (unsigned long)&(ioc->ioc_hpa->io_io_low_hv));
 		__raw_writel(((parent->end)>>16) | 0xffff0000,
 			     (unsigned long)&(ioc->ioc_hpa->io_io_high_hv));
 	} else {
-		/* This should be impossible.  It means
-		 * expand_ioc_area got called with a resource that
-		 * didn't belong to the ioc
-		 */
-		BUG();
+		return -EBUSY;
 	}
+
+ out:
+	return allocate_resource(parent, res, size, min, max, align, NULL,NULL);
 }
 
-static struct resource *ccio_get_resource(struct ioc* ioc,
-		const struct parisc_device *dev)
+int ccio_request_resource(const struct parisc_device *dev,
+		struct resource *res)
 {
+	struct resource *parent;
+	struct ioc *ioc = ccio_get_iommu(dev);
+
 	if (!ioc) {
-		return &iomem_resource;
+		parent = &iomem_resource;
 	} else if ((ioc->mmio_region->start <= dev->hpa) &&
 			(dev->hpa < ioc->mmio_region->end)) {
-		return ioc->mmio_region;
+		parent = ioc->mmio_region;
 	} else if (((ioc->mmio_region + 1)->start <= dev->hpa) &&
 			(dev->hpa < (ioc->mmio_region + 1)->end)) {
-		return ioc->mmio_region + 1;
+		parent = ioc->mmio_region + 1;
 	} else {
-		return NULL;
-	}
-}
-
-int ccio_allocate_resource(const struct parisc_device *dev,
-		struct resource *res, unsigned long size,
-		unsigned long min, unsigned long max, unsigned long align,
-		void (*alignf)(void *, struct resource *, unsigned long, unsigned long),
-		void *alignf_data)
-{
-	struct ioc *ioc = ccio_get_iommu(dev);
-	struct resource *parent = ccio_get_resource(ioc, dev);
-	if (!parent)
 		return -EBUSY;
-
-	if (!allocate_resource(parent, res, size, min, max, align, alignf,
-			alignf_data))
-		return 0;
-
-	expand_ioc_area(parent, ioc, size, min, max, align);
-	return allocate_resource(parent, res, size, min, max, align, alignf,
-			alignf_data);
-}
-
-int ccio_request_resource(const struct parisc_device *dev,
-		struct resource *res)
-{
-	struct ioc *ioc = ccio_get_iommu(dev);
-	struct resource *parent = ccio_get_resource(ioc, dev);
+	}
 
 	return request_resource(parent, res);
 }
+
 /**
  * ccio_probe - Determine if ccio should claim this device.
  * @dev: The device which has been found
diff -Nru a/drivers/parisc/dino.c b/drivers/parisc/dino.c
--- a/drivers/parisc/dino.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/parisc/dino.c	Thu Jan  8 23:00:23 2004
@@ -165,6 +165,13 @@
 
 #define DINO_CFG_TOK(bus,dfn,pos) ((u32) ((bus)<<16 | (dfn)<<8 | (pos)))
 
+/*
+ * keep the current highest bus count to assist in allocating busses.  This
+ * tries to keep a global bus count total so that when we discover an 
+ * entirely new bus, it can be given a unique bus number.
+ */
+static int dino_current_bus = 0;
+
 static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where,
 		int size, u32 *val)
 {
@@ -478,8 +485,7 @@
 
 	if (ccio_allocate_resource(dino_dev->hba.dev, res, _8MB,
 				F_EXTEND(0xf0000000UL) | _8MB,
-				F_EXTEND(0xffffffffUL) &~ _8MB, _8MB,
-				NULL, NULL) < 0) {
+				F_EXTEND(0xffffffffUL) &~ _8MB, _8MB) < 0) {
 		struct list_head *ln, *tmp_ln;
 
 		printk(KERN_ERR "Dino: cannot attach bus %s\n",
@@ -505,8 +511,6 @@
 	DBG("DINO GSC WRITE i=%d, start=%lx, dino addr = %lx\n",
 	    i, res->start, base_addr + DINO_IO_ADDR_EN);
 	gsc_writel(1 << i, base_addr + DINO_IO_ADDR_EN);
-
-	pci_bus_assign_resources(bus);
 }
 
 static void __init
@@ -547,6 +551,9 @@
 	dino_cfg_write(dev->bus, dev->devfn, PCI_INTERRUPT_LINE, 1, dev->irq); 
 }
 
+/* The alignment contraints for PCI bridges under dino */
+#define DINO_BRIDGE_ALIGN 0x100000
+
 
 static void __init
 dino_fixup_bus(struct pci_bus *bus)
@@ -560,13 +567,48 @@
 			__FUNCTION__, bus, bus->secondary, bus->dev->platform_data);
 
 	/* Firmware doesn't set up card-mode dino, so we have to */
-	if (is_card_dino(&dino_dev->hba.dev->id))
+	if (is_card_dino(&dino_dev->hba.dev->id)) {
 		dino_card_setup(bus, dino_dev->hba.base_addr);
+	} else if(bus->parent == NULL) {
+		/* must have a dino above it, reparent the resources
+		 * into the dino window */
+		bus->resource[0] = &(dino_dev->hba.io_space);
+		bus->resource[1] = &(dino_dev->hba.lmmio_space); 
+	} else if(bus->self) {
+		int i;
 
-	/* If this is a PCI-PCI Bridge, read the window registers etc */
-	if (bus->self)
 		pci_read_bridge_bases(bus);
 
+
+		for(i = 0; i < PCI_NUM_RESOURCES; i++) {
+			if((bus->self->resource[i].flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
+				continue;
+			
+			if(bus->self->resource[i].flags & IORESOURCE_MEM) {
+				/* There's a quirk to alignment of
+				 * bridge memory resources: the start
+				 * is the alignment and start-end is
+				 * the size.  However, firmware will
+				 * have assigned start and end, so we
+				 * need to take this into account */
+				bus->self->resource[i].end = bus->self->resource[i].end - bus->self->resource[i].start + DINO_BRIDGE_ALIGN;
+				bus->self->resource[i].start = DINO_BRIDGE_ALIGN;
+				
+			}
+					
+			DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n",
+			    bus->self->dev.bus_id, i,
+			    bus->self->resource[i].start,
+			    bus->self->resource[i].end);
+			pci_assign_resource(bus->self, i);
+			DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
+			    bus->self->dev.bus_id, i,
+			    bus->self->resource[i].start,
+			    bus->self->resource[i].end);
+		}
+	}
+
+
 	list_for_each(ln, &bus->devices) {
 		int i;
 
@@ -596,9 +638,39 @@
 			}
 #endif
 		}
+		/* null out the ROM resource if there is one (we don't
+		 * care about an expansion rom on parisc, since it
+		 * usually contains (x86) bios code) */
+		dev->resource[PCI_ROM_RESOURCE].flags = 0;
+		dev->resource[PCI_ROM_RESOURCE].start = 0;
+		dev->resource[PCI_ROM_RESOURCE].end = 0;
+				
+		if(dev->irq == 255) {
+
+#ifdef DINO_FIX_UNASSIGNED_INTERRUPTS
+
+			/* This code tries to assign an unassigned
+			 * interrupt.  Leave it disabled unless you
+			 * *really* know what you're doing since the
+			 * pin<->interrupt line mapping varies by bus
+			 * and machine */
+
+			u32 irq_pin;
+			
+			dino_cfg_read(dev->bus, dev->devfn, PCI_INTERRUPT_PIN, 1, &irq_pin);
+			dev->irq = (irq_pin + PCI_SLOT(dev->devfn) - 1) % 4 ;
+			dino_cfg_write(dev->bus, dev->devfn, PCI_INTERRUPT_LINE, 1, dev->irq);
+			dev->irq += dino_dev->dino_region->data.irqbase
+			printk(KERN_WARNING "Device %s has undefined IRQ, setting to %d\n", dev->slot_name, irq_pin);
+#else
+			dev->irq = 65535;
+			printk(KERN_WARNING "Device %s has unassigned IRQ\n", dev->slot_name);	
+#endif
+		} else {
 
-		/* Adjust INT_LINE for that busses region */
-		dev->irq = dino_dev->dino_region->data.irqbase + dev->irq;
+			/* Adjust INT_LINE for that busses region */
+			dev->irq += dino_dev->dino_region->data.irqbase;
+		}
 	}
 }
 
@@ -827,6 +899,7 @@
 	const int name_len = 32;
 	char *name;
 	int is_cujo = 0;
+	struct pci_bus *bus;
 
 	name = kmalloc(name_len, GFP_KERNEL);
 	if(name)
@@ -912,9 +985,20 @@
 	** It's not used to avoid chicken/egg problems
 	** with configuration accessor functions.
 	*/
-	dino_dev->hba.hba_bus = 
-		pci_scan_bus_parented(&dev->dev, dino_dev->hba.hba_num,
-				      &dino_cfg_ops, NULL);
+	bus = pci_scan_bus_parented(&dev->dev, dino_current_bus,
+				    &dino_cfg_ops, NULL);
+	if(bus) {
+		/* This code *depends* on scanning being single threaded
+		 * if it isn't, this global bus number count will fail
+		 */
+		dino_current_bus = bus->subordinate + 1;
+		pci_bus_assign_resources(bus);
+	} else {
+		printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus);
+		/* increment the bus number in case of duplicates */
+		dino_current_bus++;
+	}
+	dino_dev->hba.hba_bus = bus;
 	return 0;
 }
 
@@ -923,10 +1007,13 @@
  * the same sversion as Dino, so we have to check hversion as well.
  * Unfortunately, the J2240 PDC reports the wrong hversion for the first
  * Dino, so we have to test for Dino, Cujo and Dino-in-a-J2240.
+ * For card-mode Dino, most machines report an sversion of 9D.  But 715
+ * and 725 firmware misreport it as 0x08080 for no adequately explained
+ * reason.
  */
 static struct parisc_device_id dino_tbl[] = {
-	{ HPHW_A_DMA, HVERSION_REV_ANY_ID, 0x004, 0x0009D }, /* Card-mode Dino. */
-	{ HPHW_A_DMA, HVERSION_REV_ANY_ID, 0x444, 0x08080 }, /* Same card in a 715.  Bug? */
+	{ HPHW_A_DMA, HVERSION_REV_ANY_ID, 0x004, 0x0009D },/* Card-mode Dino */
+	{ HPHW_A_DMA, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x08080 }, /* XXX */
 	{ HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x680, 0xa }, /* Bridge-mode Dino */
 	{ HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x682, 0xa }, /* Bridge-mode Cujo */
 	{ HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x05d, 0xa }, /* Dino in a J2240 */
diff -Nru a/drivers/parisc/led.c b/drivers/parisc/led.c
--- a/drivers/parisc/led.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/parisc/led.c	Thu Jan  8 23:00:23 2004
@@ -441,7 +441,6 @@
 #if HZ==100
  #define NORMALIZED_COUNT(count) (count)
 #else
- #warning "Untested situation HZ != 100 !!"
  #define NORMALIZED_COUNT(count) (count/(HZ/100))
 #endif
 
diff -Nru a/drivers/parisc/superio.c b/drivers/parisc/superio.c
--- a/drivers/parisc/superio.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/parisc/superio.c	Thu Jan  8 23:00:24 2004
@@ -65,7 +65,9 @@
 #include <linux/ioport.h>
 #include <linux/parport.h>
 #include <linux/parport_pc.h>
-#include <linux/serial_reg.h>
+#include <linux/termios.h>
+#include <linux/tty.h>
+#include <linux/serial_core.h>
 #include <asm/io.h>
 #include <asm/hardware.h>
 #include <asm/irq.h>
@@ -387,11 +389,27 @@
 	return(sio_dev.irq_region->data.irqbase + local_irq);
 }
 
+static struct uart_port serial[] = {
+	{
+		.iotype		= UPIO_PORT,
+		.line		= 0,
+		.type		= PORT_16550A,
+		.uartclk	= 115200*16,
+		.fifosize	= 16,
+	},
+	{
+		.iotype		= UPIO_PORT,
+		.line		= 1,
+		.type		= PORT_16550A,
+		.uartclk	= 115200*16,
+		.fifosize	= 16,
+	}
+};
+
 void __devinit
 superio_serial_init(void)
 {
 #ifdef CONFIG_SERIAL_8250
-	struct serial_struct *serial;
 	int retval;
 	
 	if (!sio_dev.irq_region)
@@ -400,47 +418,15 @@
 	if (!sio_dev.iosapic_irq_enabled)
 		superio_init(&sio_dev);
 
-	serial = kmalloc(2 * sizeof (struct serial_struct), GFP_KERNEL);
-
-	if (!serial) {
-		printk(KERN_WARNING "SuperIO: Could not get memory for serial struct.\n");
-		return;
-	}
-
-	memset(serial, 0, 2 * sizeof (struct serial_struct));
-
-	serial->type = PORT_16550A;
-	serial->line = 0;
-	serial->port = sio_dev.sp1_base;
-	serial->port_high = 0;
-	serial->irq = sio_dev.irq_region->data.irqbase + SP1_IRQ;
-	serial->io_type = SERIAL_IO_PORT;
-	serial->flags = 0;
-	serial->xmit_fifo_size = 16;
-	serial->custom_divisor = 0;
-	serial->baud_base = 115200;
+	serial[0].iobase = sio_dev.sp1_base;
+	retval = early_serial_setup(&serial[0]);
 
-	retval = register_serial(serial);
-	if (retval < 0) {
+	if (retval < 0)
 		printk(KERN_WARNING "SuperIO: Register Serial #0 failed.\n");
-		kfree (serial);
-		return;
-	}
-
-	serial++;
 
-	serial->type = PORT_16550A;
-	serial->line = 1;
-	serial->port = sio_dev.sp2_base;
-	serial->port_high = 0;
-	serial->irq = sio_dev.irq_region->data.irqbase + SP2_IRQ;
-	serial->io_type = SERIAL_IO_PORT;
-	serial->flags = 0;
-	serial->xmit_fifo_size = 16;
-	serial->custom_divisor = 0;
-	serial->baud_base = 115200;
+	serial[1].iobase = sio_dev.sp2_base;
+	retval = early_serial_setup(&serial[1]);
 
-	retval = register_serial(serial);
 	if (retval < 0)
 		printk(KERN_WARNING "SuperIO: Register Serial #1 failed.\n");
 #endif /* CONFIG_SERIAL_8250 */
@@ -543,5 +529,5 @@
  *
  * FIXME: does this break the superio console?
  */
-late_initcall(superio_modinit);
+module_init(superio_modinit);
 module_exit(superio_exit);
diff -Nru a/drivers/parport/parport_sunbpp.c b/drivers/parport/parport_sunbpp.c
--- a/drivers/parport/parport_sunbpp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/parport/parport_sunbpp.c	Thu Jan  8 23:00:23 2004
@@ -397,3 +397,5 @@
 	}
 }
 #endif
+
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/pci/Makefile b/drivers/pci/Makefile
--- a/drivers/pci/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/pci/Makefile	Thu Jan  8 23:00:24 2004
@@ -27,6 +27,7 @@
 obj-$(CONFIG_SGI_IP27) += setup-irq.o
 obj-$(CONFIG_SGI_IP32) += setup-irq.o
 obj-$(CONFIG_X86_VISWS) += setup-irq.o
+obj-$(CONFIG_PCI_USE_VECTOR) += msi.o
 
 # Cardbus & CompactPCI use setup-bus
 obj-$(CONFIG_HOTPLUG) += setup-bus.o
diff -Nru a/drivers/pci/msi.c b/drivers/pci/msi.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/pci/msi.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,1068 @@
+/*
+ * linux/drivers/pci/msi.c
+ */
+
+#include <linux/mm.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/config.h>
+#include <linux/ioport.h>
+#include <linux/smp_lock.h>
+#include <linux/pci.h>
+#include <linux/proc_fs.h>
+
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/smp.h>
+#include <asm/desc.h>
+#include <asm/io_apic.h>
+#include <mach_apic.h>
+
+#include <linux/pci_msi.h>
+
+_DEFINE_DBG_BUFFER
+
+static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED;
+static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL };
+static kmem_cache_t* msi_cachep;
+
+static int pci_msi_enable = 1;
+static int nr_alloc_vectors = 0;
+static int nr_released_vectors = 0;
+static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS;
+static int nr_msix_devices = 0;
+
+#ifndef CONFIG_X86_IO_APIC
+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
+u8 irq_vector[NR_IRQS] = { FIRST_DEVICE_VECTOR , 0 };
+#endif
+
+static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
+{
+	memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
+}
+
+static int msi_cache_init(void)
+{
+	msi_cachep = kmem_cache_create("msi_cache",
+			NR_IRQS * sizeof(struct msi_desc),
+		       	0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
+	if (!msi_cachep)
+		return -ENOMEM;
+
+	return 0;
+}
+
+static void msi_set_mask_bit(unsigned int vector, int flag)
+{
+	struct msi_desc *entry;
+
+	entry = (struct msi_desc *)msi_desc[vector];
+	if (!entry || !entry->dev || !entry->mask_base)
+		return;
+	switch (entry->msi_attrib.type) {
+	case PCI_CAP_ID_MSI:
+	{
+		int		pos;
+		unsigned int	mask_bits;
+
+		pos = entry->mask_base;
+	        entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
+				pos, 4, &mask_bits);
+		mask_bits &= ~(1);
+		mask_bits |= flag;
+	        entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
+				pos, 4, mask_bits);
+		break;
+	}
+	case PCI_CAP_ID_MSIX:
+	{
+		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET;
+		writel(flag, entry->mask_base + offset);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+#ifdef CONFIG_SMP
+static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	unsigned int dest_id;
+
+	entry = (struct msi_desc *)msi_desc[vector];
+	if (!entry || !entry->dev)
+		return;
+
+	switch (entry->msi_attrib.type) {
+	case PCI_CAP_ID_MSI:
+	{
+		int pos;
+
+   		if (!(pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI)))
+			return;
+
+	        entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
+			msi_lower_address_reg(pos), 4,
+			&address.lo_address.value);
+		dest_id = (address.lo_address.u.dest_id &
+			MSI_ADDRESS_HEADER_MASK) |
+			(cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
+		address.lo_address.u.dest_id = dest_id;
+		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
+		entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
+			msi_lower_address_reg(pos), 4,
+			address.lo_address.value);
+		break;
+	}
+	case PCI_CAP_ID_MSIX:
+	{
+		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET;
+
+		address.lo_address.value = readl(entry->mask_base + offset);
+		dest_id = (address.lo_address.u.dest_id &
+			MSI_ADDRESS_HEADER_MASK) |
+			(cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
+		address.lo_address.u.dest_id = dest_id;
+		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
+		writel(address.lo_address.value, entry->mask_base + offset);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+static inline void move_msi(int vector)
+{
+	if (!cpus_empty(pending_irq_balance_cpumask[vector])) {
+		set_msi_affinity(vector, pending_irq_balance_cpumask[vector]);
+		cpus_clear(pending_irq_balance_cpumask[vector]);
+	}
+}
+#endif
+
+static void mask_MSI_irq(unsigned int vector)
+{
+	msi_set_mask_bit(vector, 1);
+}
+
+static void unmask_MSI_irq(unsigned int vector)
+{
+	msi_set_mask_bit(vector, 0);
+}
+
+static unsigned int startup_msi_irq_wo_maskbit(unsigned int vector)
+{
+	return 0;	/* never anything pending */
+}
+
+static void pci_disable_msi(unsigned int vector);
+static void shutdown_msi_irq(unsigned int vector)
+{
+	pci_disable_msi(vector);
+}
+
+#define shutdown_msi_irq_wo_maskbit	shutdown_msi_irq
+static void enable_msi_irq_wo_maskbit(unsigned int vector) {}
+static void disable_msi_irq_wo_maskbit(unsigned int vector) {}
+static void ack_msi_irq_wo_maskbit(unsigned int vector) {}
+static void end_msi_irq_wo_maskbit(unsigned int vector)
+{
+	move_msi(vector);
+	ack_APIC_irq();
+}
+
+static unsigned int startup_msi_irq_w_maskbit(unsigned int vector)
+{
+	unmask_MSI_irq(vector);
+	return 0;	/* never anything pending */
+}
+
+#define shutdown_msi_irq_w_maskbit	shutdown_msi_irq
+#define enable_msi_irq_w_maskbit	unmask_MSI_irq
+#define disable_msi_irq_w_maskbit	mask_MSI_irq
+#define ack_msi_irq_w_maskbit		mask_MSI_irq
+
+static void end_msi_irq_w_maskbit(unsigned int vector)
+{
+	move_msi(vector);
+	unmask_MSI_irq(vector);
+	ack_APIC_irq();
+}
+
+/*
+ * Interrupt Type for MSI-X PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI-X Capability Structure.
+ */
+static struct hw_interrupt_type msix_irq_type = {
+	.typename	= "PCI MSI-X",
+	.startup	= startup_msi_irq_w_maskbit,
+	.shutdown	= shutdown_msi_irq_w_maskbit,
+	.enable		= enable_msi_irq_w_maskbit,
+	.disable	= disable_msi_irq_w_maskbit,
+	.ack		= ack_msi_irq_w_maskbit,
+	.end		= end_msi_irq_w_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+/*
+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI Capability Structure with
+ * Mask-and-Pending Bits.
+ */
+static struct hw_interrupt_type msi_irq_w_maskbit_type = {
+	.typename	= "PCI MSI",
+	.startup	= startup_msi_irq_w_maskbit,
+	.shutdown	= shutdown_msi_irq_w_maskbit,
+	.enable		= enable_msi_irq_w_maskbit,
+	.disable	= disable_msi_irq_w_maskbit,
+	.ack		= ack_msi_irq_w_maskbit,
+	.end		= end_msi_irq_w_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+/*
+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
+ * which implement the MSI Capability Structure without
+ * Mask-and-Pending Bits.
+ */
+static struct hw_interrupt_type msi_irq_wo_maskbit_type = {
+	.typename	= "PCI MSI",
+	.startup	= startup_msi_irq_wo_maskbit,
+	.shutdown	= shutdown_msi_irq_wo_maskbit,
+	.enable		= enable_msi_irq_wo_maskbit,
+	.disable	= disable_msi_irq_wo_maskbit,
+	.ack		= ack_msi_irq_wo_maskbit,
+	.end		= end_msi_irq_wo_maskbit,
+	.set_affinity	= set_msi_irq_affinity
+};
+
+static void msi_data_init(struct msg_data *msi_data,
+			  unsigned int vector)
+{
+	memset(msi_data, 0, sizeof(struct msg_data));
+	msi_data->vector = (u8)vector;
+	msi_data->delivery_mode = MSI_DELIVERY_MODE;
+	msi_data->level = MSI_LEVEL_MODE;
+	msi_data->trigger = MSI_TRIGGER_MODE;
+}
+
+static void msi_address_init(struct msg_address *msi_address)
+{
+	unsigned int	dest_id;
+
+	memset(msi_address, 0, sizeof(struct msg_address));
+	msi_address->hi_address = (u32)0;
+	dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT) |
+		 (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT);
+	msi_address->lo_address.u.dest_mode = MSI_LOGICAL_MODE;
+	msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE;
+	msi_address->lo_address.u.dest_id = dest_id;
+}
+
+static int pci_vector_resources(void)
+{
+	static int res = -EINVAL;
+	int nr_free_vectors;
+
+	if (res == -EINVAL) {
+		int i, repeat;
+		for (i = NR_REPEATS; i > 0; i--) {
+			if ((FIRST_DEVICE_VECTOR + i * 8) > FIRST_SYSTEM_VECTOR)
+				continue;
+			break;
+		}
+		i++;
+		repeat = (FIRST_SYSTEM_VECTOR - FIRST_DEVICE_VECTOR)/i;
+		res = i * repeat - NR_RESERVED_VECTORS + 1;
+	}
+
+	nr_free_vectors = res + nr_released_vectors - nr_alloc_vectors;
+
+	return nr_free_vectors;
+}
+
+int assign_irq_vector(int irq)
+{
+	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
+
+	if (irq != MSI_AUTO && IO_APIC_VECTOR(irq) > 0)
+		return IO_APIC_VECTOR(irq);
+next:
+	current_vector += 8;
+	if (current_vector == SYSCALL_VECTOR)
+		goto next;
+
+	if (current_vector > FIRST_SYSTEM_VECTOR) {
+		offset++;
+		current_vector = FIRST_DEVICE_VECTOR + offset;
+	}
+
+	if (current_vector == FIRST_SYSTEM_VECTOR)
+		return -ENOSPC;
+
+	vector_irq[current_vector] = irq;
+	if (irq != MSI_AUTO)
+		IO_APIC_VECTOR(irq) = current_vector;
+
+	nr_alloc_vectors++;
+
+	return current_vector;
+}
+
+static int assign_msi_vector(void)
+{
+	static int new_vector_avail = 1;
+	int vector;
+	unsigned long flags;
+
+	/*
+	 * msi_lock is provided to ensure that successful allocation of MSI
+	 * vector is assigned unique among drivers.
+	 */
+	spin_lock_irqsave(&msi_lock, flags);
+	if (!(pci_vector_resources() > 0)) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EBUSY;
+	}
+
+	if (!new_vector_avail) {
+		/*
+	 	 * vector_irq[] = -1 indicates that this specific vector is:
+	 	 * - assigned for MSI (since MSI have no associated IRQ) or
+	 	 * - assigned for legacy if less than 16, or
+	 	 * - having no corresponding 1:1 vector-to-IOxAPIC IRQ mapping
+	 	 * vector_irq[] = 0 indicates that this vector, previously
+		 * assigned for MSI, is freed by hotplug removed operations.
+		 * This vector will be reused for any subsequent hotplug added
+		 * operations.
+	 	 * vector_irq[] > 0 indicates that this vector is assigned for
+		 * IOxAPIC IRQs. This vector and its value provides a 1-to-1
+		 * vector-to-IOxAPIC IRQ mapping.
+	 	 */
+		for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
+			if (vector_irq[vector] != 0)
+				continue;
+			vector_irq[vector] = -1;
+			nr_released_vectors--;
+			spin_unlock_irqrestore(&msi_lock, flags);
+			return vector;
+		}
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EBUSY;
+	}
+
+	vector = assign_irq_vector(MSI_AUTO);
+	if (vector  == (FIRST_SYSTEM_VECTOR - 8))
+		new_vector_avail = 0;
+
+	spin_unlock_irqrestore(&msi_lock, flags);
+	return vector;
+}
+
+static int get_new_vector(void)
+{
+	int vector;
+
+	if ((vector = assign_msi_vector()) > 0)
+		set_intr_gate(vector, interrupt[vector]);
+
+	return vector;
+}
+
+static int msi_init(void)
+{
+	static int status = -ENOMEM;
+
+	if (!status)
+		return status;
+
+	if ((status = msi_cache_init()) < 0) {
+		pci_msi_enable = 0;
+		printk(KERN_INFO "WARNING: MSI INIT FAILURE\n");
+		return status;
+	}
+	printk(KERN_INFO "MSI INIT SUCCESS\n");
+
+	return status;
+}
+
+static int get_msi_vector(struct pci_dev *dev)
+{
+	return get_new_vector();
+}
+
+static struct msi_desc* alloc_msi_entry(void)
+{
+	struct msi_desc *entry;
+
+	entry = (struct msi_desc*) kmem_cache_alloc(msi_cachep, SLAB_KERNEL);
+	if (!entry)
+		return NULL;
+
+	memset(entry, 0, sizeof(struct msi_desc));
+	entry->link.tail = entry->link.head = 0;	/* single message */
+	entry->dev = NULL;
+
+	return entry;
+}
+
+static void attach_msi_entry(struct msi_desc *entry, int vector)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	msi_desc[vector] = entry;
+	spin_unlock_irqrestore(&msi_lock, flags);
+}
+
+static void irq_handler_init(int cap_id, int pos, int mask)
+{
+	spin_lock(&irq_desc[pos].lock);
+	if (cap_id == PCI_CAP_ID_MSIX)
+		irq_desc[pos].handler = &msix_irq_type;
+	else {
+		if (!mask)
+			irq_desc[pos].handler = &msi_irq_wo_maskbit_type;
+		else
+			irq_desc[pos].handler = &msi_irq_w_maskbit_type;
+	}
+	spin_unlock(&irq_desc[pos].lock);
+}
+
+static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
+{
+	u32 control;
+
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msi_control_reg(pos), 2, &control);
+	if (type == PCI_CAP_ID_MSI) {
+		/* Set enabled bits to single MSI & enable MSI_enable bit */
+		msi_enable(control, 1);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	} else {
+		msix_enable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	}
+    	if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
+		/* PCI Express Endpoint device detected */
+		u32 cmd;
+	        dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
+		cmd |= PCI_COMMAND_INTX_DISABLE;
+	        dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
+	}
+}
+
+static void disable_msi_mode(struct pci_dev *dev, int pos, int type)
+{
+	u32 control;
+
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msi_control_reg(pos), 2, &control);
+	if (type == PCI_CAP_ID_MSI) {
+		/* Set enabled bits to single MSI & enable MSI_enable bit */
+		msi_disable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	} else {
+		msix_disable(control);
+	        dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_control_reg(pos), 2, control);
+	}
+    	if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
+		/* PCI Express Endpoint device detected */
+		u32 cmd;
+	        dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
+		cmd &= ~PCI_COMMAND_INTX_DISABLE;
+	        dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
+	}
+}
+
+static int msi_lookup_vector(struct pci_dev *dev)
+{
+	int vector;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
+		if (!msi_desc[vector] || msi_desc[vector]->dev != dev ||
+			msi_desc[vector]->msi_attrib.entry_nr ||
+			msi_desc[vector]->msi_attrib.default_vector != dev->irq)
+			continue;	/* not entry 0, skip */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		/* This pre-assigned entry-0 MSI vector for this device
+		   already exits. Override dev->irq with this vector */
+		dev->irq = vector;
+		return 0;
+	}
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	return -EACCES;
+}
+
+void pci_scan_msi_device(struct pci_dev *dev)
+{
+	if (!dev)
+		return;
+
+   	if (pci_find_capability(dev, PCI_CAP_ID_MSIX) > 0) {
+		nr_reserved_vectors++;
+		nr_msix_devices++;
+	} else if (pci_find_capability(dev, PCI_CAP_ID_MSI) > 0)
+		nr_reserved_vectors++;
+}
+
+/**
+ * msi_capability_init - configure device's MSI capability structure
+ * @dev: pointer to the pci_dev data structure of MSI device function
+ *
+ * Setup the MSI capability structure of device funtion with a single
+ * MSI vector, regardless of device function is capable of handling
+ * multiple messages. A return of zero indicates the successful setup
+ * of an entry zero with the new MSI vector or non-zero for otherwise.
+ **/
+static int msi_capability_init(struct pci_dev *dev)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int pos, vector;
+	u32 control;
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
+	if (!pos)
+		return -EINVAL;
+
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
+		2, &control);
+	if (control & PCI_MSI_FLAGS_ENABLE)
+		return 0;
+
+	if (!msi_lookup_vector(dev)) {
+		/* Lookup Sucess */
+		enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
+		return 0;
+	}
+	/* MSI Entry Initialization */
+	if (!(entry = alloc_msi_entry()))
+		return -ENOMEM;
+
+	if ((vector = get_msi_vector(dev)) < 0) {
+		kmem_cache_free(msi_cachep, entry);
+		return -EBUSY;
+	}
+	entry->msi_attrib.type = PCI_CAP_ID_MSI;
+	entry->msi_attrib.entry_nr = 0;
+	entry->msi_attrib.maskbit = is_mask_bit_support(control);
+	entry->msi_attrib.default_vector = dev->irq;
+	dev->irq = vector;	/* save default pre-assigned ioapic vector */
+	entry->dev = dev;
+	if (is_mask_bit_support(control)) {
+		entry->mask_base = msi_mask_bits_reg(pos,
+				is_64bit_address(control));
+	}
+	/* Replace with MSI handler */
+	irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit);
+	/* Configure MSI capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	dev->bus->ops->write(dev->bus, dev->devfn, msi_lower_address_reg(pos),
+				4, address.lo_address.value);
+	if (is_64bit_address(control)) {
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_upper_address_reg(pos), 4, address.hi_address);
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_data_reg(pos, 1), 2, *((u32*)&data));
+	} else
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_data_reg(pos, 0), 2, *((u32*)&data));
+	if (entry->msi_attrib.maskbit) {
+		unsigned int maskbits, temp;
+		/* All MSIs are unmasked by default, Mask them all */
+	        dev->bus->ops->read(dev->bus, dev->devfn,
+			msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
+			&maskbits);
+		temp = (1 << multi_msi_capable(control));
+		temp = ((temp - 1) & ~temp);
+		maskbits |= temp;
+		dev->bus->ops->write(dev->bus, dev->devfn,
+			msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
+			maskbits);
+	}
+	attach_msi_entry(entry, vector);
+	/* Set MSI enabled bits	 */
+	enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
+
+	return 0;
+}
+
+/**
+ * msix_capability_init - configure device's MSI-X capability
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ *
+ * Setup the MSI-X capability structure of device funtion with a
+ * single MSI-X vector. A return of zero indicates the successful setup
+ * of an entry zero with the new MSI-X vector or non-zero for otherwise.
+ * To request for additional MSI-X vectors, the device drivers are
+ * required to utilize the following supported APIs:
+ * 1) msi_alloc_vectors(...) for requesting one or more MSI-X vectors
+ * 2) msi_free_vectors(...) for releasing one or more MSI-X vectors
+ *    back to PCI subsystem before calling free_irq(...)
+ **/
+static int msix_capability_init(struct pci_dev	*dev)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int vector = 0, pos, dev_msi_cap;
+	u32 phys_addr, table_offset;
+	u32 control;
+	u8 bir;
+	void *base;
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+	if (!pos)
+		return -EINVAL;
+
+	/* Request & Map MSI-X table region */
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 2,
+		&control);
+	if (control & PCI_MSIX_FLAGS_ENABLE)
+		return 0;
+
+	if (!msi_lookup_vector(dev)) {
+		/* Lookup Sucess */
+		enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
+		return 0;
+	}
+
+	dev_msi_cap = multi_msix_capable(control);
+	dev->bus->ops->read(dev->bus, dev->devfn,
+		msix_table_offset_reg(pos), 4, &table_offset);
+	bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
+	phys_addr = pci_resource_start (dev, bir);
+	phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
+	if (!request_mem_region(phys_addr,
+		dev_msi_cap * PCI_MSIX_ENTRY_SIZE,
+		"MSI-X iomap Failure"))
+		return -ENOMEM;
+	base = ioremap_nocache(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+	if (base == NULL)
+		goto free_region;
+	/* MSI Entry Initialization */
+	entry = alloc_msi_entry();
+	if (!entry)
+		goto free_iomap;
+	if ((vector = get_msi_vector(dev)) < 0)
+		goto free_entry;
+
+	entry->msi_attrib.type = PCI_CAP_ID_MSIX;
+	entry->msi_attrib.entry_nr = 0;
+	entry->msi_attrib.maskbit = 1;
+	entry->msi_attrib.default_vector = dev->irq;
+	dev->irq = vector;	/* save default pre-assigned ioapic vector */
+	entry->dev = dev;
+	entry->mask_base = (unsigned long)base;
+	/* Replace with MSI handler */
+	irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
+	/* Configure MSI-X capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	writel(address.lo_address.value, base + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	writel(address.hi_address, base + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+	writel(*(u32*)&data, base + PCI_MSIX_ENTRY_DATA_OFFSET);
+	/* Initialize all entries from 1 up to 0 */
+	for (pos = 1; pos < dev_msi_cap; pos++) {
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+		writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
+			PCI_MSIX_ENTRY_DATA_OFFSET);
+	}
+	attach_msi_entry(entry, vector);
+	/* Set MSI enabled bits	 */
+	enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
+
+	return 0;
+
+free_entry:
+	kmem_cache_free(msi_cachep, entry);
+free_iomap:
+	iounmap(base);
+free_region:
+	release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+
+	return ((vector < 0) ? -EBUSY : -ENOMEM);
+}
+
+/**
+ * pci_enable_msi - configure device's MSI(X) capability structure
+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
+ *
+ * Setup the MSI/MSI-X capability structure of device function with
+ * a single MSI(X) vector upon its software driver call to request for
+ * MSI(X) mode enabled on its hardware device function. A return of zero
+ * indicates the successful setup of an entry zero with the new MSI(X)
+ * vector or non-zero for otherwise.
+ **/
+int pci_enable_msi(struct pci_dev* dev)
+{
+	int status = -EINVAL;
+
+	if (!pci_msi_enable || !dev)
+ 		return status;
+
+	if (msi_init() < 0)
+		return -ENOMEM;
+
+	if ((status = msix_capability_init(dev)) == -EINVAL)
+		status = msi_capability_init(dev);
+	if (!status)
+		nr_reserved_vectors--;
+
+	return status;
+}
+
+static int msi_free_vector(struct pci_dev* dev, int vector);
+static void pci_disable_msi(unsigned int vector)
+{
+	int head, tail, type, default_vector;
+	struct msi_desc *entry;
+	struct pci_dev *dev;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[vector];
+	if (!entry || !entry->dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return;
+	}
+	dev = entry->dev;
+	type = entry->msi_attrib.type;
+	head = entry->link.head;
+	tail = entry->link.tail;
+	default_vector = entry->msi_attrib.default_vector;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	disable_msi_mode(dev, pci_find_capability(dev, type), type);
+	/* Restore dev->irq to its default pin-assertion vector */
+	dev->irq = default_vector;
+	if (type == PCI_CAP_ID_MSIX && head != tail) {
+		/* Bad driver, which do not call msi_free_vectors before exit.
+		   We must do a cleanup here */
+		while (1) {
+			spin_lock_irqsave(&msi_lock, flags);
+			entry = msi_desc[vector];
+			head = entry->link.head;
+			tail = entry->link.tail;
+			spin_unlock_irqrestore(&msi_lock, flags);
+			if (tail == head)
+				break;
+			if (msi_free_vector(dev, entry->link.tail))
+				break;
+		}
+	}
+}
+
+static int msi_alloc_vector(struct pci_dev* dev, int head)
+{
+	struct msi_desc *entry;
+	struct msg_address address;
+	struct msg_data data;
+	int i, offset, pos, dev_msi_cap, vector;
+	u32 low_address, control;
+	unsigned long base = 0L;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	base = entry->mask_base;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+   	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
+		2, &control);
+	dev_msi_cap = multi_msix_capable(control);
+	for (i = 1; i < dev_msi_cap; i++) {
+		if (!(low_address = readl(base + i * PCI_MSIX_ENTRY_SIZE)))
+			 break;
+	}
+	if (i >= dev_msi_cap)
+		return -EINVAL;
+
+	/* MSI Entry Initialization */
+	if (!(entry = alloc_msi_entry()))
+		return -ENOMEM;
+
+	if ((vector = get_new_vector()) < 0) {
+		kmem_cache_free(msi_cachep, entry);
+		return vector;
+	}
+	entry->msi_attrib.type = PCI_CAP_ID_MSIX;
+	entry->msi_attrib.entry_nr = i;
+	entry->msi_attrib.maskbit = 1;
+	entry->dev = dev;
+	entry->link.head = head;
+	entry->mask_base = base;
+	irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
+	/* Configure MSI-X capability structure */
+	msi_address_init(&address);
+	msi_data_init(&data, vector);
+	entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
+				MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
+	offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
+	writel(address.lo_address.value, base + offset +
+		PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	writel(address.hi_address, base + offset +
+		PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
+	writel(*(u32*)&data, base + offset + PCI_MSIX_ENTRY_DATA_OFFSET);
+	writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+	attach_msi_entry(entry, vector);
+
+	return vector;
+}
+
+static int msi_free_vector(struct pci_dev* dev, int vector)
+{
+	struct msi_desc *entry;
+	int entry_nr, type;
+	unsigned long base = 0L;
+	unsigned long flags;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[vector];
+	if (!entry || entry->dev != dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	type = entry->msi_attrib.type;
+	entry_nr = entry->msi_attrib.entry_nr;
+	base = entry->mask_base;
+	if (entry->link.tail != entry->link.head) {
+		msi_desc[entry->link.head]->link.tail = entry->link.tail;
+		if (entry->link.tail)
+			msi_desc[entry->link.tail]->link.head = entry->link.head;
+	}
+	entry->dev = NULL;
+	vector_irq[vector] = 0;
+	nr_released_vectors++;
+	msi_desc[vector] = NULL;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	kmem_cache_free(msi_cachep, entry);
+	if (type == PCI_CAP_ID_MSIX) {
+		int offset;
+
+		offset = entry_nr * PCI_MSIX_ENTRY_SIZE;
+		writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+		writel(0, base + offset + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
+	}
+
+	return 0;
+}
+
+/**
+ * msi_alloc_vectors - allocate additional MSI-X vectors
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ * @vector: pointer to an array of new allocated MSI-X vectors
+ * @nvec: number of MSI-X vectors requested for allocation by device driver
+ *
+ * Allocate additional MSI-X vectors requested by device driver. A
+ * return of zero indicates the successful setup of MSI-X capability
+ * structure with new allocated MSI-X vectors or non-zero for otherwise.
+ **/
+int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec)
+{
+	struct msi_desc *entry;
+	int i, head, pos, vec, free_vectors, alloc_vectors;
+	int *vectors = (int *)vector;
+	u32 control;
+	unsigned long flags;
+
+	if (!pci_msi_enable || !dev)
+ 		return -EINVAL;
+
+   	if (!(pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)))
+ 		return -EINVAL;
+
+	dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 			2, &control);
+	if (nvec > multi_msix_capable(control))
+		return -EINVAL;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev ||		/* legal call */
+	   entry->msi_attrib.type != PCI_CAP_ID_MSIX || /* must be MSI-X */
+	   entry->link.head != entry->link.tail) {	/* already multi */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	/*
+	 * msi_lock is provided to ensure that enough vectors resources are
+	 * available before granting.
+	 */
+	free_vectors = pci_vector_resources();
+	/* Ensure that each MSI/MSI-X device has one vector reserved by
+	   default to avoid any MSI-X driver to take all available
+ 	   resources */
+	free_vectors -= nr_reserved_vectors;
+	/* Find the average of free vectors among MSI-X devices */
+	if (nr_msix_devices > 0)
+		free_vectors /= nr_msix_devices;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	if (nvec > free_vectors)
+		return -EBUSY;
+
+	alloc_vectors = 0;
+	head = dev->irq;
+	for (i = 0; i < nvec; i++) {
+		if ((vec = msi_alloc_vector(dev, head)) < 0)
+			break;
+		*(vectors + i) = vec;
+		head = vec;
+		alloc_vectors++;
+	}
+	if (alloc_vectors != nvec) {
+		for (i = 0; i < alloc_vectors; i++) {
+			vec = *(vectors + i);
+			msi_free_vector(dev, vec);
+		}
+		spin_lock_irqsave(&msi_lock, flags);
+		msi_desc[dev->irq]->link.tail = msi_desc[dev->irq]->link.head;
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EBUSY;
+	}
+	if (nr_msix_devices > 0)
+		nr_msix_devices--;
+
+	return 0;
+}
+
+/**
+ * msi_free_vectors - reclaim MSI-X vectors to unused state
+ * @dev: pointer to the pci_dev data structure of MSI-X device function
+ * @vector: pointer to an array of released MSI-X vectors
+ * @nvec: number of MSI-X vectors requested for release by device driver
+ *
+ * Reclaim MSI-X vectors released by device driver to unused state,
+ * which may be used later on. A return of zero indicates the
+ * success or non-zero for otherwise. Device driver should call this
+ * before calling function free_irq.
+ **/
+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
+{
+	struct msi_desc *entry;
+	int i;
+	unsigned long flags;
+
+	if (!pci_msi_enable)
+ 		return -EINVAL;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev ||
+	   	entry->msi_attrib.type != PCI_CAP_ID_MSIX ||
+		entry->link.head == entry->link.tail) {	/* Nothing to free */
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return -EINVAL;
+	}
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	for (i = 0; i < nvec; i++) {
+		if (*(vector + i) == dev->irq)
+			continue;/* Don't free entry 0 if mistaken by driver */
+		msi_free_vector(dev, *(vector + i));
+	}
+
+	return 0;
+}
+
+/**
+ * msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
+ *
+ * Being called during hotplug remove, from which the device funciton
+ * is hot-removed. All previous assigned MSI/MSI-X vectors, if
+ * allocated for this device function, are reclaimed to unused state,
+ * which may be used later on.
+ **/
+void msi_remove_pci_irq_vectors(struct pci_dev* dev)
+{
+	struct msi_desc *entry;
+	int type, temp;
+	unsigned long flags;
+
+	if (!pci_msi_enable || !dev)
+ 		return;
+
+   	if (!pci_find_capability(dev, PCI_CAP_ID_MSI)) {
+   		if (!pci_find_capability(dev, PCI_CAP_ID_MSIX))
+			return;
+	}
+	temp = dev->irq;
+	if (msi_lookup_vector(dev))
+		return;
+
+	spin_lock_irqsave(&msi_lock, flags);
+	entry = msi_desc[dev->irq];
+	if (!entry || entry->dev != dev) {
+		spin_unlock_irqrestore(&msi_lock, flags);
+		return;
+	}
+	type = entry->msi_attrib.type;
+	spin_unlock_irqrestore(&msi_lock, flags);
+
+	msi_free_vector(dev, dev->irq);
+	if (type == PCI_CAP_ID_MSIX) {
+		int i, pos, dev_msi_cap;
+		u32 phys_addr, table_offset;
+		u32 control;
+		u8 bir;
+
+   		pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
+		dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 			2, &control);
+		dev_msi_cap = multi_msix_capable(control);
+		dev->bus->ops->read(dev->bus, dev->devfn,
+			msix_table_offset_reg(pos), 4, &table_offset);
+		bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
+		phys_addr = pci_resource_start (dev, bir);
+		phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
+		for (i = FIRST_DEVICE_VECTOR; i < NR_IRQS; i++) {
+			spin_lock_irqsave(&msi_lock, flags);
+			if (!msi_desc[i] || msi_desc[i]->dev != dev) {
+				spin_unlock_irqrestore(&msi_lock, flags);
+				continue;
+			}
+			spin_unlock_irqrestore(&msi_lock, flags);
+			msi_free_vector(dev, i);
+		}
+		writel(1, entry->mask_base + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+		iounmap((void*)entry->mask_base);
+		release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
+	}
+	dev->irq = temp;
+	nr_reserved_vectors++;
+}
+
+EXPORT_SYMBOL(pci_enable_msi);
+EXPORT_SYMBOL(msi_alloc_vectors);
+EXPORT_SYMBOL(msi_free_vectors);
diff -Nru a/drivers/pci/pci.ids b/drivers/pci/pci.ids
--- a/drivers/pci/pci.ids	Thu Jan  8 23:00:24 2004
+++ b/drivers/pci/pci.ids	Thu Jan  8 23:00:24 2004
@@ -5312,11 +5312,13 @@
 		10b7 2000  3C998-T Dual Port 10/100/1000 PCI-X
 		10b7 3000  3C999-T Quad Port 10/100/1000 PCI-X
 		1166 1648  NetXtreme CIOB-E 1000Base-T
+	1649  NetXtreme BCM5704S Gigabit Ethernet
 	164d  NetXtreme BCM5702FE Gigabit Ethernet
 	1653  NetXtreme BCM5705 Gigabit Ethernet
 	1654  NetXtreme BCM5705 Gigabit Ethernet
 	165d  NetXtreme BCM5705M Gigabit Ethernet
 	165e  NetXtreme BCM5705M Gigabit Ethernet
+	166e  NetXtreme BCM5705F Gigabit Ethernet
 	1696  NetXtreme BCM5782 Gigabit Ethernet
 		14e4 000d  NetXtreme BCM5782 1000Base-T
 	169c  NetXtreme BCM5788 Gigabit Ethernet
diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c
--- a/drivers/pci/probe.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pci/probe.c	Thu Jan  8 23:00:24 2004
@@ -552,6 +552,7 @@
 		struct pci_dev *dev;
 
 		dev = pci_scan_device(bus, devfn);
+		pci_scan_msi_device(dev);
 		if (func == 0) {
 			if (!dev)
 				break;
diff -Nru a/drivers/pci/proc.c b/drivers/pci/proc.c
--- a/drivers/pci/proc.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pci/proc.c	Thu Jan  8 23:00:24 2004
@@ -25,7 +25,7 @@
 {
 	loff_t new = -1;
 
-	lock_kernel();
+	down(&file->f_dentry->d_inode->i_sem);
 	switch (whence) {
 	case 0:
 		new = off;
@@ -37,10 +37,12 @@
 		new = PCI_CFG_SPACE_SIZE + off;
 		break;
 	}
-	unlock_kernel();
 	if (new < 0 || new > PCI_CFG_SPACE_SIZE)
-		return -EINVAL;
-	return (file->f_pos = new);
+		new = -EINVAL;
+	else
+		file->f_pos = new;
+	up(&file->f_dentry->d_inode->i_sem);
+	return new;
 }
 
 static ssize_t
diff -Nru a/drivers/pci/remove.c b/drivers/pci/remove.c
--- a/drivers/pci/remove.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/pci/remove.c	Thu Jan  8 23:00:23 2004
@@ -14,6 +14,8 @@
 {
 	int i;
 
+ 	msi_remove_pci_irq_vectors(dev);
+
 	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 		struct resource *res = dev->resource + i;
 		if (res->parent)
diff -Nru a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
--- a/drivers/pci/setup-res.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pci/setup-res.c	Thu Jan  8 23:00:24 2004
@@ -84,6 +84,10 @@
 			       pci_name(dev), resno, new, check);
 		}
 	}
+	res->flags &= ~IORESOURCE_UNSET;
+	DBGC((KERN_INFO "PCI: moved device %s resource %d (%lx) to %x\n",
+		dev->slot_name, resno, res->flags,
+		new & ~PCI_REGION_FLAG_MASK));
 }
 
 int __init
diff -Nru a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c
--- a/drivers/pcmcia/cistpl.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/pcmcia/cistpl.c	Thu Jan  8 23:00:23 2004
@@ -341,8 +341,11 @@
 int verify_cis_cache(struct pcmcia_socket *s)
 {
 	struct cis_cache_entry *cis;
-	char buf[256];
+	char *buf;
 
+	buf = kmalloc(256, GFP_KERNEL);
+	if (buf == NULL)
+		return -1;
 	list_for_each_entry(cis, &s->cis_cache, node) {
 		int len = cis->len;
 
@@ -355,9 +358,12 @@
 #endif
 			read_cis_mem(s, cis->attr, cis->addr, len, buf);
 
-		if (memcmp(buf, cis->cache, len) != 0)
+		if (memcmp(buf, cis->cache, len) != 0) {
+			kfree(buf);
 			return -1;
+		}
 	}
+	kfree(buf);
 	return 0;
 }
 
@@ -1404,19 +1410,24 @@
 int read_tuple(client_handle_t handle, cisdata_t code, void *parse)
 {
     tuple_t tuple;
-    cisdata_t buf[255];
+    cisdata_t *buf;
     int ret;
-    
+
+    buf = kmalloc(256, GFP_KERNEL);
+    if (buf == NULL)
+	return CS_OUT_OF_RESOURCE;
     tuple.DesiredTuple = code;
     tuple.Attributes = TUPLE_RETURN_COMMON;
     ret = pcmcia_get_first_tuple(handle, &tuple);
-    if (ret != CS_SUCCESS) return ret;
+    if (ret != CS_SUCCESS) goto done;
     tuple.TupleData = buf;
     tuple.TupleOffset = 0;
-    tuple.TupleDataMax = sizeof(buf);
+    tuple.TupleDataMax = 255;
     ret = pcmcia_get_tuple_data(handle, &tuple);
-    if (ret != CS_SUCCESS) return ret;
+    if (ret != CS_SUCCESS) goto done;
     ret = pcmcia_parse_tuple(handle, &tuple, parse);
+done:
+    kfree(buf);
     return ret;
 }
 
@@ -1432,50 +1443,61 @@
 
 int pcmcia_validate_cis(client_handle_t handle, cisinfo_t *info)
 {
-    tuple_t tuple;
-    cisparse_t p;
+    tuple_t *tuple;
+    cisparse_t *p;
     int ret, reserved, dev_ok = 0, ident_ok = 0;
 
     if (CHECK_HANDLE(handle))
 	return CS_BAD_HANDLE;
+    tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
+    if (tuple == NULL)
+	return CS_OUT_OF_RESOURCE;
+    p = kmalloc(sizeof(*p), GFP_KERNEL);
+    if (p == NULL) {
+	kfree(tuple);
+	return CS_OUT_OF_RESOURCE;
+    }
 
     info->Chains = reserved = 0;
-    tuple.DesiredTuple = RETURN_FIRST_TUPLE;
-    tuple.Attributes = TUPLE_RETURN_COMMON;
-    ret = pcmcia_get_first_tuple(handle, &tuple);
+    tuple->DesiredTuple = RETURN_FIRST_TUPLE;
+    tuple->Attributes = TUPLE_RETURN_COMMON;
+    ret = pcmcia_get_first_tuple(handle, tuple);
     if (ret != CS_SUCCESS)
-	return CS_SUCCESS;
+	goto done;
 
     /* First tuple should be DEVICE; we should really have either that
        or a CFTABLE_ENTRY of some sort */
-    if ((tuple.TupleCode == CISTPL_DEVICE) ||
-	(read_tuple(handle, CISTPL_CFTABLE_ENTRY, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, &p) == CS_SUCCESS))
+    if ((tuple->TupleCode == CISTPL_DEVICE) ||
+	(read_tuple(handle, CISTPL_CFTABLE_ENTRY, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, p) == CS_SUCCESS))
 	dev_ok++;
 
     /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2
        tuple, for card identification.  Certain old D-Link and Linksys
        cards have only a broken VERS_2 tuple; hence the bogus test. */
-    if ((read_tuple(handle, CISTPL_MANFID, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_VERS_1, &p) == CS_SUCCESS) ||
-	(read_tuple(handle, CISTPL_VERS_2, &p) != CS_NO_MORE_ITEMS))
+    if ((read_tuple(handle, CISTPL_MANFID, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_VERS_1, p) == CS_SUCCESS) ||
+	(read_tuple(handle, CISTPL_VERS_2, p) != CS_NO_MORE_ITEMS))
 	ident_ok++;
 
     if (!dev_ok && !ident_ok)
-	return CS_SUCCESS;
+	goto done;
 
     for (info->Chains = 1; info->Chains < MAX_TUPLES; info->Chains++) {
-	ret = pcmcia_get_next_tuple(handle, &tuple);
+	ret = pcmcia_get_next_tuple(handle, tuple);
 	if (ret != CS_SUCCESS) break;
-	if (((tuple.TupleCode > 0x23) && (tuple.TupleCode < 0x40)) ||
-	    ((tuple.TupleCode > 0x47) && (tuple.TupleCode < 0x80)) ||
-	    ((tuple.TupleCode > 0x90) && (tuple.TupleCode < 0xff)))
+	if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) ||
+	    ((tuple->TupleCode > 0x47) && (tuple->TupleCode < 0x80)) ||
+	    ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
 	    reserved++;
     }
     if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
 	((!dev_ok || !ident_ok) && (info->Chains > 10)))
 	info->Chains = 0;
 
+done:
+    kfree(tuple);
+    kfree(p);
     return CS_SUCCESS;
 }
 
diff -Nru a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
--- a/drivers/pcmcia/cs.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/pcmcia/cs.c	Thu Jan  8 23:00:23 2004
@@ -1916,7 +1916,7 @@
 {
     struct pcmcia_socket *s;
     config_t *c;
-    int ret = 0, irq = 0;
+    int ret = CS_IN_USE, irq = 0;
     
     if (CHECK_HANDLE(handle))
 	return CS_BAD_HANDLE;
@@ -1928,13 +1928,9 @@
 	return CS_CONFIGURATION_LOCKED;
     if (c->state & CONFIG_IRQ_REQ)
 	return CS_IN_USE;
-    
-    /* Short cut: if there are no ISA interrupts, then it is PCI */
-    if (!s->irq_mask) {
-	irq = s->pci_irq;
-	ret = (irq) ? 0 : CS_IN_USE;
+
 #ifdef CONFIG_PCMCIA_PROBE
-    } else if (s->irq.AssignedIRQ != 0) {
+    if (s->irq.AssignedIRQ != 0) {
 	/* If the interrupt is already assigned, it must match */
 	irq = s->irq.AssignedIRQ;
 	if (req->IRQInfo1 & IRQ_INFO2_VALID) {
@@ -1943,7 +1939,6 @@
 	} else
 	    ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
     } else {
-	ret = CS_IN_USE;
 	if (req->IRQInfo1 & IRQ_INFO2_VALID) {
 	    u_int try, mask = req->IRQInfo2 & s->irq_mask;
 	    for (try = 0; try < 2; try++) {
@@ -1958,12 +1953,13 @@
 	    irq = req->IRQInfo1 & IRQ_MASK;
 	    ret = try_irq(req->Attributes, irq, 1);
 	}
-#else
-    } else {
-	ret = CS_UNSUPPORTED_MODE;
+    }
 #endif
+    if (ret != 0) {
+	if (!s->pci_irq)
+	    return ret;
+	irq = s->pci_irq;
     }
-    if (ret != 0) return ret;
 
     if (req->Attributes & IRQ_HANDLE_PRESENT) {
 	if (request_irq(irq, req->Handler,
diff -Nru a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
--- a/drivers/pcmcia/i82365.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pcmcia/i82365.c	Thu Jan  8 23:00:24 2004
@@ -42,7 +42,6 @@
 #include <linux/timer.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
-#include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/workqueue.h>
@@ -188,10 +187,6 @@
 
 /*====================================================================*/
 
-/* Default settings for PCI command configuration register */
-#define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \
-		  PCI_COMMAND_MASTER|PCI_COMMAND_WAIT)
-
 /* These definitions must match the pcic table! */
 typedef enum pcic_id {
     IS_I82365A, IS_I82365B, IS_I82365DF,
@@ -202,15 +197,10 @@
 /* Flags for classifying groups of controllers */
 #define IS_VADEM	0x0001
 #define IS_CIRRUS	0x0002
-#define IS_TI		0x0004
-#define IS_O2MICRO	0x0008
 #define IS_VIA		0x0010
-#define IS_TOPIC	0x0020
-#define IS_RICOH	0x0040
 #define IS_UNKNOWN	0x0400
 #define IS_VG_PWR	0x0800
 #define IS_DF_PWR	0x1000
-#define IS_PCI		0x2000
 #define IS_ALIVE	0x8000
 
 typedef struct pcic_t {
@@ -351,26 +341,24 @@
     if (has_ring == -1) has_ring = 1;
     flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
     flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
+    flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
     if (p->misc2 & PD67_MC2_IRQ15_RI)
 	strcat(buf, " [ring]");
     if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
 	strcat(buf, " [dyn mode]");
+    if (p->misc2 & PD67_MC2_FREQ_BYPASS)
+	strcat(buf, " [freq bypass]");
     if (p->misc1 & PD67_MC1_INPACK_ENA)
 	strcat(buf, " [inpack]");
-    if (!(t->flags & IS_PCI)) {
-	if (p->misc2 & PD67_MC2_IRQ15_RI)
-	    mask &= ~0x8000;
-	if (has_led > 0) {
-	    strcat(buf, " [led]");
-	    mask &= ~0x1000;
-	}
-	if (has_dma > 0) {
-	    strcat(buf, " [dma]");
-	    mask &= ~0x0600;
-	flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
-	if (p->misc2 & PD67_MC2_FREQ_BYPASS)
-	    strcat(buf, " [freq bypass]");
-	}
+    if (p->misc2 & PD67_MC2_IRQ15_RI)
+	mask &= ~0x8000;
+    if (has_led > 0) {
+	strcat(buf, " [led]");
+	mask &= ~0x1000;
+    }
+    if (has_dma > 0) {
+	strcat(buf, " [dma]");
+	mask &= ~0x0600;
     }
     if (!(t->flags & IS_VIA)) {
 	if (setup_time >= 0)
@@ -540,7 +528,6 @@
     return (irq_hits != 1);
 }
 
-
 static u_int __init isa_scan(u_short sock, u_int mask0)
 {
     u_int mask1 = 0;
@@ -585,7 +572,6 @@
     return mask1;
 }
 
-
 /*====================================================================*/
 
 /* Time conversion functions */
@@ -597,7 +583,6 @@
 
 /*====================================================================*/
 
-
 static int __init identify(u_short port, u_short sock)
 {
     u_char val;
@@ -700,7 +685,7 @@
 static void __init add_pcic(int ns, int type)
 {
     u_int mask = 0, i, base;
-    int use_pci = 0, isa_irq = 0;
+    int isa_irq = 0;
     struct i82365_socket *t = &socket[sockets-ns];
 
     base = sockets-ns;
@@ -721,17 +706,16 @@
     mask &= I365_MASK & set_bridge_opts(base, ns);
     /* Scan for ISA interrupts */
     mask = isa_scan(base, mask);
-    printk(KERN_INFO "    PCI card interrupts,");
         
     /* Poll if only two interrupts available */
-    if (!use_pci && !poll_interval) {
+    if (!poll_interval) {
 	u_int tmp = (mask & 0xff20);
 	tmp = tmp & (tmp-1);
 	if ((tmp & (tmp-1)) == 0)
 	    poll_interval = HZ;
     }
     /* Only try an ISA cs_irq if this is the first controller */
-    if (!use_pci && !grab_irq && (cs_irq || !poll_interval)) {
+    if (!grab_irq && (cs_irq || !poll_interval)) {
 	/* Avoid irq 12 unless it is explicitly requested */
 	u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
 	for (cs_irq = 15; cs_irq > 0; cs_irq--)
@@ -745,7 +729,7 @@
 	}
     }
     
-    if (!use_pci && !isa_irq) {
+    if (!isa_irq) {
 	if (poll_interval == 0)
 	    poll_interval = HZ;
 	printk(" polling interval = %d ms\n",
@@ -763,10 +747,8 @@
 
 } /* add_pcic */
 
-
 /*====================================================================*/
 
-
 #ifdef CONFIG_PNP
 static struct isapnp_device_id id_table[] __initdata = {
 	{ 	ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
@@ -832,7 +814,9 @@
 	    }
 	}
     } else {
-	for (i = 0; i < (extra_sockets ? 8 : 4); i += 2) {
+	for (i = 0; i < 8; i += 2) {
+	    if (sockets && !extra_sockets && (i == 4))
+		break;
 	    port = i365_base + 2*(i>>2);
 	    sock = (i & 3);
 	    id = identify(port, sock);
@@ -856,7 +840,6 @@
     }
 }
 
-
 /*====================================================================*/
 
 static irqreturn_t pcic_interrupt(int irq, void *dev,
@@ -872,8 +855,7 @@
     for (j = 0; j < 20; j++) {
 	active = 0;
 	for (i = 0; i < sockets; i++) {
-	    if ((socket[i].cs_irq != irq) &&
-		(socket[i].socket.pci_irq != irq))
+	    if (socket[i].cs_irq != irq)
 		continue;
 	    handled = 1;
 	    ISA_LOCK(i, flags);
@@ -911,7 +893,6 @@
 static void pcic_interrupt_wrapper(u_long data)
 {
     pcic_interrupt(0, NULL, NULL);
-    init_timer(&poll_timer);
     poll_timer.expires = jiffies + poll_interval;
     add_timer(&poll_timer);
 }
@@ -1039,7 +1020,7 @@
     
     /* IO card, RESET flag, IO interrupt */
     reg = t->intr;
-    if (state->io_irq != t->socket.pci_irq) reg |= state->io_irq;
+    reg |= state->io_irq;
     reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
     reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
     i365_set(sock, I365_INTCTL, reg);
@@ -1177,8 +1158,7 @@
     if ((map > 4) || (mem->card_start > 0x3ffffff) ||
 	(mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
 	return -EINVAL;
-    if (!(socket[sock].flags & IS_PCI) &&
-	((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)))
+    if ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))
 	return -EINVAL;
 	
     /* Turn off the window before changing anything */
@@ -1211,6 +1191,7 @@
     return 0;
 } /* i365_set_mem_map */
 
+#if 0 /* driver model ordering issue */
 /*======================================================================
 
     Routines for accessing socket information and register dumps via
@@ -1250,6 +1231,7 @@
 
 static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
 static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
+#endif
 
 /*====================================================================*/
 
@@ -1385,7 +1367,7 @@
     if (driver_register(&i82365_driver))
 	return -1;
 
-    printk(KERN_INFO "Intel PCIC probe: ");
+    printk(KERN_INFO "Intel ISA PCIC probe: ");
     sockets = 0;
 
     isa_probe();
@@ -1414,10 +1396,12 @@
 			    pcmcia_unregister_socket(&socket[i].socket);
 		    break;
 	    }
+#if 0 /* driver model ordering issue */
 	   class_device_create_file(&socket[i].socket.dev,
 			   	    &class_device_attr_info);
 	   class_device_create_file(&socket[i].socket.dev,
 			   	    &class_device_attr_exca);
+#endif
     }
 
     /* Finally, schedule a polling interrupt */
diff -Nru a/drivers/pcmcia/sa1100_stork.c b/drivers/pcmcia/sa1100_stork.c
--- a/drivers/pcmcia/sa1100_stork.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pcmcia/sa1100_stork.c	Thu Jan  8 23:00:24 2004
@@ -23,7 +23,6 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/device.h>
-#include <linux/i2c.h>
 
 #include <asm/hardware.h>
 #include <asm/mach-types.h>
diff -Nru a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
--- a/drivers/pcmcia/yenta_socket.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pcmcia/yenta_socket.c	Thu Jan  8 23:00:24 2004
@@ -30,7 +30,7 @@
 
 
 #if 0
-#define DEBUG(x,args...)	printk("%s: " x, __FUNCTION__, ##args)
+#define DEBUG(x,args...)	printk(KERN_DEBUG "%s: " x, __FUNCTION__, ##args)
 #else
 #define DEBUG(x,args...)
 #endif
@@ -779,7 +779,7 @@
 	socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
 	socket->socket.cb_dev = socket->dev;
 
-	printk(KERN_INFO "Yenta: ISA IRQ list %04x, PCI irq%d\n",
+	printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
 	       socket->socket.irq_mask, socket->cb_irq);
 }
 
@@ -860,7 +860,7 @@
 		goto disable;
 
 	if (!pci_resource_start(dev, 0)) {
-		printk("No cardbus resource!\n");
+		printk(KERN_ERR "No cardbus resource!\n");
 		ret = -ENODEV;
 		goto release;
 	}
@@ -916,7 +916,7 @@
 
 	/* Figure out what the dang thing can do for the PCMCIA layer... */
 	yenta_get_socket_capabilities(socket, isa_interrupts);
-	printk("Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
+	printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
 
 	/* Register it with the pcmcia layer.. */
 	ret = pcmcia_register_socket(&socket->socket);
diff -Nru a/drivers/pnp/pnpbios/bioscalls.c b/drivers/pnp/pnpbios/bioscalls.c
--- a/drivers/pnp/pnpbios/bioscalls.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/pnp/pnpbios/bioscalls.c	Thu Jan  8 23:00:24 2004
@@ -493,7 +493,7 @@
 	if (!pnp_bios_present())
 		return ESCD_FUNCTION_NOT_SUPPORTED;
 	status = call_pnp_bios(PNP_READ_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
-			       data, 65536, (void *)nvram_base, 65536);
+			       data, 65536, __va(nvram_base), 65536);
 	return status;
 }
 
@@ -516,7 +516,7 @@
 	if (!pnp_bios_present())
 		return ESCD_FUNCTION_NOT_SUPPORTED;
 	status = call_pnp_bios(PNP_WRITE_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
-			       data, 65536, nvram_base, 65536);
+			       data, 65536, __va(nvram_base), 65536);
 	return status;
 }
 #endif
diff -Nru a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c
--- a/drivers/sbus/char/bpp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/sbus/char/bpp.c	Thu Jan  8 23:00:23 2004
@@ -1074,3 +1074,6 @@
 
 module_init(bpp_init);
 module_exit(bpp_cleanup);
+
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/sbus/char/vfc_dev.c b/drivers/sbus/char/vfc_dev.c
--- a/drivers/sbus/char/vfc_dev.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/sbus/char/vfc_dev.c	Thu Jan  8 23:00:24 2004
@@ -737,4 +737,5 @@
 }
 #endif
 
+MODULE_LICENSE("GPL");
 
diff -Nru a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
--- a/drivers/scsi/BusLogic.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/BusLogic.c	Thu Jan  8 23:00:24 2004
@@ -3462,6 +3462,18 @@
   return false;
 }
 
+/* Error Handling (EH) support */
+
+static int BusLogic_host_reset(Scsi_Cmnd *SCpnt)
+{
+	BusLogic_HostAdapter_T *HostAdapter =
+		(BusLogic_HostAdapter_T *) SCpnt->device->host->hostdata;
+
+	/* printk("BusLogic_host_reset\n"); */
+	HostAdapter->HostAdapterExternalReset = 1;
+	BusLogic_ResetHostAdapter(HostAdapter, NULL, 0);
+	return SUCCESS;
+}
 
 /*
   BusLogic_QueueCommand creates a CCB for Command and places it into an
@@ -3538,8 +3550,8 @@
       CCB->DataLength = Count * sizeof(BusLogic_ScatterGatherSegment_T);
       if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
 	CCB->DataPointer = (unsigned int)CCB->DMA_Handle +
-			    ((unsigned int)&CCB->ScatterGatherList - 
-			     (unsigned int)CCB);
+			    ((unsigned long)&CCB->ScatterGatherList - 
+			     (unsigned long)CCB);
       else CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList);
       for (Segment = 0; Segment < Count; Segment++)
 	{
@@ -4589,220 +4601,8 @@
   adapters whereas the remaining options apply individually only to the
   selected host adapter.
 
-  The BusLogic Driver Probing Options comprise the following:
-
-  IO:<integer>
-
-    The "IO:" option specifies an ISA I/O Address to be probed for a non-PCI
-    MultiMaster Host Adapter.  If neither "IO:" nor "NoProbeISA" options are
-    specified, then the standard list of BusLogic MultiMaster ISA I/O Addresses
-    will be probed (0x330, 0x334, 0x230, 0x234, 0x130, and 0x134).  Multiple
-    "IO:" options may be specified to precisely determine the I/O Addresses to
-    be probed, but the probe order will always follow the standard list.
-
-  NoProbe
-
-    The "NoProbe" option disables all probing and therefore no BusLogic Host
-    Adapters will be detected.
-
-  NoProbeISA
-
-    The "NoProbeISA" option disables probing of the standard BusLogic ISA I/O
-    Addresses and therefore only PCI MultiMaster and FlashPoint Host Adapters
-    will be detected.
-
-  NoProbePCI
-
-    The "NoProbePCI" options disables the interrogation of PCI Configuration
-    Space and therefore only ISA Multimaster Host Adapters will be detected, as
-    well as PCI Multimaster Host Adapters that have their ISA Compatible I/O
-    Port set to "Primary" or "Alternate".
-
-  NoSortPCI
-
-    The "NoSortPCI" option forces PCI MultiMaster Host Adapters to be
-    enumerated in the order provided by the PCI BIOS, ignoring any setting of
-    the AutoSCSI "Use Bus And Device # For PCI Scanning Seq." option.
-
-  MultiMasterFirst
-
-    The "MultiMasterFirst" option forces MultiMaster Host Adapters to be probed
-    before FlashPoint Host Adapters.  By default, if both FlashPoint and PCI
-    MultiMaster Host Adapters are present, this driver will probe for
-    FlashPoint Host Adapters first unless the BIOS primary disk is controlled
-    by the first PCI MultiMaster Host Adapter, in which case MultiMaster Host
-    Adapters will be probed first.
-
-  FlashPointFirst
-
-    The "FlashPointFirst" option forces FlashPoint Host Adapters to be probed
-    before MultiMaster Host Adapters.
-
-  The BusLogic Driver Tagged Queuing Options allow for explicitly specifying
-  the Queue Depth and whether Tagged Queuing is permitted for each Target
-  Device (assuming that the Target Device supports Tagged Queuing).  The Queue
-  Depth is the number of SCSI Commands that are allowed to be concurrently
-  presented for execution (either to the Host Adapter or Target Device).  Note
-  that explicitly enabling Tagged Queuing may lead to problems; the option to
-  enable or disable Tagged Queuing is provided primarily to allow disabling
-  Tagged Queuing on Target Devices that do not implement it correctly.  The
-  following options are available:
-
-  QueueDepth:<integer>
-
-    The "QueueDepth:" or QD:" option specifies the Queue Depth to use for all
-    Target Devices that support Tagged Queuing, as well as the maximum Queue
-    Depth for devices that do not support Tagged Queuing.  If no Queue Depth
-    option is provided, the Queue Depth will be determined automatically based
-    on the Host Adapter's Total Queue Depth and the number, type, speed, and
-    capabilities of the detected Target Devices.  For Host Adapters that
-    require ISA Bounce Buffers, the Queue Depth is automatically set by default
-    to BusLogic_TaggedQueueDepthBB or BusLogic_UntaggedQueueDepthBB to avoid
-    excessive preallocation of DMA Bounce Buffer memory.  Target Devices that
-    do not support Tagged Queuing always have their Queue Depth set to
-    BusLogic_UntaggedQueueDepth or BusLogic_UntaggedQueueDepthBB, unless a
-    lower Queue Depth option is provided.  A Queue Depth of 1 automatically
-    disables Tagged Queuing.
-
-  QueueDepth:[<integer>,<integer>...]
-
-    The "QueueDepth:[...]" or "QD:[...]" option specifies the Queue Depth
-    individually for each Target Device.  If an <integer> is omitted, the
-    associated Target Device will have its Queue Depth selected automatically.
-
-  TaggedQueuing:Default
-
-    The "TaggedQueuing:Default" or "TQ:Default" option permits Tagged Queuing
-    based on the firmware version of the BusLogic Host Adapter and based on
-    whether the Queue Depth allows queuing multiple commands.
-
-  TaggedQueuing:Enable
-
-    The "TaggedQueuing:Enable" or "TQ:Enable" option enables Tagged Queuing for
-    all Target Devices on this Host Adapter, overriding any limitation that
-    would otherwise be imposed based on the Host Adapter firmware version.
-
-  TaggedQueuing:Disable
-
-    The "TaggedQueuing:Disable" or "TQ:Disable" option disables Tagged Queuing
-    for all Target Devices on this Host Adapter.
-
-  TaggedQueuing:<Target-Spec>
-
-    The "TaggedQueuing:<Target-Spec>" or "TQ:<Target-Spec>" option controls
-    Tagged Queuing individually for each Target Device.  <Target-Spec> is a
-    sequence of "Y", "N", and "X" characters.  "Y" enables Tagged Queuing, "N"
-    disables Tagged Queuing, and "X" accepts the default based on the firmware
-    version.  The first character refers to Target Device 0, the second to
-    Target Device 1, and so on; if the sequence of "Y", "N", and "X" characters
-    does not cover all the Target Devices, unspecified characters are assumed
-    to be "X".
-
-  The BusLogic Driver Error Recovery Option allows for explicitly specifying
-  the Error Recovery action to be performed when BusLogic_ResetCommand is
-  called due to a SCSI Command failing to complete successfully.  The following
-  options are available:
-
-  ErrorRecovery:Default
-
-    The "ErrorRecovery:Default" or "ER:Default" option selects between the Hard
-    Reset and Bus Device Reset options based on the recommendation of the SCSI
-    Subsystem.
-
-  ErrorRecovery:HardReset
-
-    The "ErrorRecovery:HardReset" or "ER:HardReset" option will initiate a Host
-    Adapter Hard Reset which also causes a SCSI Bus Reset.
-
-  ErrorRecovery:BusDeviceReset
-
-    The "ErrorRecovery:BusDeviceReset" or "ER:BusDeviceReset" option will send
-    a Bus Device Reset message to the individual Target Device causing the
-    error.  If Error Recovery is again initiated for this Target Device and no
-    SCSI Command to this Target Device has completed successfully since the Bus
-    Device Reset message was sent, then a Hard Reset will be attempted.
-
-  ErrorRecovery:None
-
-    The "ErrorRecovery:None" or "ER:None" option suppresses Error Recovery.
-    This option should only be selected if a SCSI Bus Reset or Bus Device Reset
-    will cause the Target Device or a critical operation to suffer a complete
-    and unrecoverable failure.
-
-  ErrorRecovery:<Target-Spec>
-
-    The "ErrorRecovery:<Target-Spec>" or "ER:<Target-Spec>" option controls
-    Error Recovery individually for each Target Device.  <Target-Spec> is a
-    sequence of "D", "H", "B", and "N" characters.  "D" selects Default, "H"
-    selects Hard Reset, "B" selects Bus Device Reset, and "N" selects None.
-    The first character refers to Target Device 0, the second to Target Device
-    1, and so on; if the sequence of "D", "H", "B", and "N" characters does not
-    cover all the possible Target Devices, unspecified characters are assumed
-    to be "D".
-
-  The BusLogic Driver Miscellaneous Options comprise the following:
-
-  BusSettleTime:<seconds>
-
-    The "BusSettleTime:" or "BST:" option specifies the Bus Settle Time in
-    seconds.  The Bus Settle Time is the amount of time to wait between a Host
-    Adapter Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI
-    Commands.  If unspecified, it defaults to BusLogic_DefaultBusSettleTime.
-
-  InhibitTargetInquiry
-
-    The "InhibitTargetInquiry" option inhibits the execution of an Inquire
-    Target Devices or Inquire Installed Devices command on MultiMaster Host
-    Adapters.  This may be necessary with some older Target Devices that do not
-    respond correctly when Logical Units above 0 are addressed.
-
-  The BusLogic Driver Debugging Options comprise the following:
-
-  TraceProbe
-
-    The "TraceProbe" option enables tracing of Host Adapter Probing.
-
-  TraceHardwareReset
-
-    The "TraceHardwareReset" option enables tracing of Host Adapter Hardware
-    Reset.
-
-  TraceConfiguration
-
-    The "TraceConfiguration" option enables tracing of Host Adapter
-    Configuration.
-
-  TraceErrors
-
-    The "TraceErrors" option enables tracing of SCSI Commands that return an
-    error from the Target Device.  The CDB and Sense Data will be printed for
-    each SCSI Command that fails.
-
-  Debug
-
-    The "Debug" option enables all debugging options.
-
-  The following examples demonstrate setting the Queue Depth for Target Devices
-  1 and 2 on the first host adapter to 7 and 15, the Queue Depth for all Target
-  Devices on the second host adapter to 31, and the Bus Settle Time on the
-  second host adapter to 30 seconds.
-
-  Linux Kernel Command Line:
-
-    linux BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30
-
-  LILO Linux Boot Loader (in /etc/lilo.conf):
-
-    append = "BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"
-
-  INSMOD Loadable Kernel Module Installation Facility:
-
-    insmod BusLogic.o \
-	'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
-
-  NOTE: Module Utilities 2.1.71 or later is required for correct parsing
-	of driver options containing commas.
-
+  The BusLogic Driver Probing Options are described in
+  <file:Documentation/scsi/BusLogic.txt>.
 */
 
 static int __init BusLogic_ParseDriverOptions(char *OptionsString)
@@ -5126,6 +4926,7 @@
 	.queuecommand		= BusLogic_QueueCommand,
 	.slave_configure	= BusLogic_SlaveConfigure,
 	.bios_param		= BusLogic_BIOSDiskParameters,
+	.eh_host_reset_handler	= BusLogic_host_reset,
 	.unchecked_isa_dma	= 1,
 	.max_sectors		= 128,
 	.use_clustering		= ENABLE_CLUSTERING,
diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
--- a/drivers/scsi/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/Kconfig	Thu Jan  8 23:00:24 2004
@@ -253,7 +253,7 @@
 
 config SCSI_AHA152X
 	tristate "Adaptec AHA152X/2825 support"
-	depends on ISA && SCSI
+	depends on ISA && SCSI && !64BIT
 	---help---
 	  This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
 	  SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
@@ -911,37 +911,34 @@
 	depends on SCSI_SYM53C8XX_2
 	default "1"
 	---help---
-	  This option only applies to PCI-SCSI chip that are PCI DAC capable 
-	  (875A, 895A, 896, 1010-33, 1010-66, 1000).
+	  This option only applies to PCI-SCSI chips that are PCI DAC
+	  capable (875A, 895A, 896, 1010-33, 1010-66, 1000).
 
-	  When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
-	  When set to 1, 40 bit DMA addressing (with upper 24 bits of address 
-	  set to zero) is supported. The addressable range is here 1 TB.
-	  When set to 2, full 64 bits of address for DMA are supported, but only
-	  16 segments of 4 GB can be addressed. The addressable range is so 
-	  limited to 64 GB.
-
-	  The safest value is 0 (32 bit DMA addressing) that is guessed to still 
-	  fit most of real machines.
-
-	  The preferred value 1 (40 bit DMA addressing) should make happy 
-	  properly engineered PCI DAC capable host bridges. You may configure
-	  this option for Intel platforms with more than 4 GB of memory.
-
-	  The still experimental value 2 (64 bit DMA addressing with 16 x 4GB 
-	  segments limitation) can be used on systems that require PCI address 
-	  bits past bit 39 to be set for the addressing of memory using PCI 
-	  DAC cycles.
+	  When set to 0, the driver will program the chip to only perform
+	  32-bit DMA.  When set to 1, the chip will be able to perform DMA
+	  to addresses up to 1TB.  When set to 2, the driver supports the
+	  full 64-bit DMA address range, but can only address 16 segments
+	  of 4 GB each.  This limits the total addressable range to 64 GB.
+
+	  Most machines with less than 4GB of memory should use a setting
+	  of 0 for best performance.  If your machine has 4GB of memory
+	  or more, you should set this option to 1 (the default).
+
+	  The still experimental value 2 (64 bit DMA addressing with 16
+	  x 4GB segments limitation) can be used on systems that require
+	  PCI address bits past bit 39 to be set for the addressing of
+	  memory using PCI DAC cycles.
 
 config SCSI_SYM53C8XX_DEFAULT_TAGS
 	int "default tagged command queue depth"
 	depends on SCSI_SYM53C8XX_2
 	default "16"
 	help
-	  This is the default value of the command queue depth the driver will 
-	  announce to the generic SCSI layer for devices that support tagged 
-	  command queueing. This value can be changed from the boot command line.
-	  This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
+	  This is the default value of the command queue depth the
+	  driver will announce to the generic SCSI layer for devices
+	  that support tagged command queueing. This value can be changed
+	  from the boot command line.  This is a soft limit that cannot
+	  exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
 
 config SCSI_SYM53C8XX_MAX_TAGS
 	int "maximum number of queued commands"
@@ -954,11 +951,12 @@
 	  This value is used as a compiled-in hard limit.
 
 config SCSI_SYM53C8XX_IOMAPPED
-	bool "use normal IO"
+	bool "use port IO"
 	depends on SCSI_SYM53C8XX_2
 	help
-	  If you say Y here, the driver will preferently use normal IO rather than 
-	  memory mapped IO.
+	  If you say Y here, the driver will use port IO to access
+	  the card.  This is significantly slower then using memory
+	  mapped IO.  Most people should answer N.
 
 config SCSI_ZALON
 	tristate "Zalon SCSI support"
@@ -1274,7 +1272,7 @@
 
 config SCSI_DC390T
 	tristate "Tekram DC390(T) and Am53/79C974 SCSI support"
-	depends on PCI && SCSI && BROKEN
+	depends on PCI && SCSI
 	---help---
 	  This driver supports PCI SCSI host adapters based on the Am53C974A
 	  chip, e.g. Tekram DC390(T), DawiControl 2974 and some onboard
diff -Nru a/drivers/scsi/aacraid/README b/drivers/scsi/aacraid/README
--- a/drivers/scsi/aacraid/README	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aacraid/README	Thu Jan  8 23:00:23 2004
@@ -28,7 +28,8 @@
 People
 -------------------------
 Alan Cox <alan@redhat.com>
-Christoph Hellwig <hch@infradead.org>	(small cleanups/fixes)
+Christoph Hellwig <hch@infradead.org>	(updates for new-style PCI probing and SCSI host registration,
+					 small cleanups/fixes)
 Matt Domsch <matt_domsch@dell.com>	(revision ioctl, adapter messages)
 Deanna Bonds <deanna_bonds@adaptec.com> (non-DASD support, PAE fibs and 64 bit, added new adaptec controllers
 					 added new ioctls, changed scsi interface to use new error handler,
diff -Nru a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
--- a/drivers/scsi/aacraid/aachba.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aacraid/aachba.c	Thu Jan  8 23:00:24 2004
@@ -4,6 +4,7 @@
  *
  * based on the old aacraid driver that is..
  * Adaptec aacraid device driver for Linux.
+ *
  * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,7 +23,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -31,11 +31,14 @@
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/completion.h>
+#include <linux/blkdev.h>
 #include <asm/semaphore.h>
 #include <asm/uaccess.h>
-#include <linux/blkdev.h>
-#include "scsi.h"
-#include "hosts.h"
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
 
 #include "aacraid.h"
 
@@ -194,9 +197,9 @@
  
 static struct fsa_scsi_hba *fsa_dev[MAXIMUM_NUM_ADAPTERS];	/*  SCSI Device Instance Pointers */
 static struct sense_data sense_data[MAXIMUM_NUM_CONTAINERS];
-static unsigned long aac_build_sg(Scsi_Cmnd* scsicmd, struct sgmap* sgmap);
-static unsigned long aac_build_sg64(Scsi_Cmnd* scsicmd, struct sgmap64* psg);
-static int aac_send_srb_fib(Scsi_Cmnd* scsicmd);
+static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
+static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
+static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 #ifdef AAC_DETAILED_STATUS_INFO
 static char *aac_get_status_string(u32 status);
 #endif
@@ -444,7 +447,7 @@
 	}
 }
 
-static void aac_io_done(Scsi_Cmnd * scsicmd)
+static void aac_io_done(struct scsi_cmnd * scsicmd)
 {
 	unsigned long cpu_flags;
 	struct Scsi_Host *host = scsicmd->device->host;
@@ -453,7 +456,7 @@
 	spin_unlock_irqrestore(host->host_lock, cpu_flags);
 }
 
-static void __aac_io_done(Scsi_Cmnd * scsicmd)
+static void __aac_io_done(struct scsi_cmnd * scsicmd)
 {
 	scsicmd->scsi_done(scsicmd);
 }
@@ -538,11 +541,11 @@
 {
 	struct aac_dev *dev;
 	struct aac_read_reply *readreply;
-	Scsi_Cmnd *scsicmd;
+	struct scsi_cmnd *scsicmd;
 	u32 lba;
 	u32 cid;
 
-	scsicmd = (Scsi_Cmnd *) context;
+	scsicmd = (struct scsi_cmnd *) context;
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 	cid =TARGET_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun);
@@ -557,11 +560,11 @@
 		pci_unmap_sg(dev->pdev, 
 			(struct scatterlist *)scsicmd->buffer,
 			scsicmd->use_sg,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 	else if(scsicmd->request_bufflen)
 		pci_unmap_single(dev->pdev, (dma_addr_t)(ulong)scsicmd->SCp.ptr,
 				 scsicmd->request_bufflen,
-				 scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+				 scsicmd->sc_data_direction);
 	readreply = (struct aac_read_reply *)fib_data(fibptr);
 	if (le32_to_cpu(readreply->status) == ST_OK)
 		scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
@@ -584,11 +587,11 @@
 {
 	struct aac_dev *dev;
 	struct aac_write_reply *writereply;
-	Scsi_Cmnd *scsicmd;
+	struct scsi_cmnd *scsicmd;
 	u32 lba;
 	u32 cid;
 
-	scsicmd = (Scsi_Cmnd *) context;
+	scsicmd = (struct scsi_cmnd *) context;
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 	cid = TARGET_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun);
 
@@ -601,11 +604,11 @@
 		pci_unmap_sg(dev->pdev, 
 			(struct scatterlist *)scsicmd->buffer,
 			scsicmd->use_sg,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 	else if(scsicmd->request_bufflen)
 		pci_unmap_single(dev->pdev, (dma_addr_t)(ulong)scsicmd->SCp.ptr,
 				 scsicmd->request_bufflen,
-				 scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+				 scsicmd->sc_data_direction);
 
 	writereply = (struct aac_write_reply *) fib_data(fibptr);
 	if (le32_to_cpu(writereply->status) == ST_OK)
@@ -625,7 +628,7 @@
 	aac_io_done(scsicmd);
 }
 
-int aac_read(Scsi_Cmnd * scsicmd, int cid)
+int aac_read(struct scsi_cmnd * scsicmd, int cid)
 {
 	u32 lba;
 	u32 count;
@@ -736,7 +739,7 @@
 	return -1;
 }
 
-static int aac_write(Scsi_Cmnd * scsicmd, int cid)
+static int aac_write(struct scsi_cmnd * scsicmd, int cid)
 {
 	u32 lba;
 	u32 count;
@@ -853,7 +856,7 @@
  *	aacraid firmware.
  */
  
-int aac_scsi_cmd(Scsi_Cmnd * scsicmd)
+int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
 {
 	u32 cid = 0;
 	struct fsa_scsi_hba *fsa_dev_ptr;
@@ -1215,9 +1218,9 @@
 {
 	struct aac_dev *dev;
 	struct aac_srb_reply *srbreply;
-	Scsi_Cmnd *scsicmd;
+	struct scsi_cmnd *scsicmd;
 
-	scsicmd = (Scsi_Cmnd *) context;
+	scsicmd = (struct scsi_cmnd *) context;
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
 	if (fibptr == NULL)
@@ -1233,10 +1236,10 @@
 		pci_unmap_sg(dev->pdev, 
 			(struct scatterlist *)scsicmd->buffer,
 			scsicmd->use_sg,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 	else if(scsicmd->request_bufflen)
 		pci_unmap_single(dev->pdev, (ulong)scsicmd->SCp.ptr, scsicmd->request_bufflen,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 
 	/*
 	 * First check the fib status
@@ -1396,7 +1399,7 @@
  * scsicmd passed in.
  */
 
-static int aac_send_srb_fib(Scsi_Cmnd* scsicmd)
+static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 {
 	struct fib* cmd_fibcontext;
 	struct aac_dev* dev;
@@ -1414,17 +1417,16 @@
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 	switch(scsicmd->sc_data_direction){
-	case SCSI_DATA_WRITE:
+	case DMA_TO_DEVICE:
 		flag = SRB_DataOut;
 		break;
-	case SCSI_DATA_UNKNOWN:  
+	case DMA_BIDIRECTIONAL:
 		flag = SRB_DataIn | SRB_DataOut;
 		break;
-	case SCSI_DATA_READ:
+	case DMA_FROM_DEVICE:
 		flag = SRB_DataIn;
 		break;
-	case SCSI_DATA_NONE: 
-	default:
+	case DMA_NONE:
 		flag = SRB_NoDataXfer;
 		break;
 	}
@@ -1507,7 +1509,7 @@
 	return -1;
 }
 
-static unsigned long aac_build_sg(Scsi_Cmnd* scsicmd, struct sgmap* psg)
+static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -1524,7 +1526,7 @@
 		sg = (struct scatterlist *) scsicmd->request_buffer;
 
 		sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 		psg->count = cpu_to_le32(sg_count);
 
 		byte_count = 0;
@@ -1551,7 +1553,7 @@
 		addr = pci_map_single(dev->pdev,
 				scsicmd->request_buffer,
 				scsicmd->request_bufflen,
-				scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+				scsicmd->sc_data_direction);
 		psg->count = cpu_to_le32(1);
 		psg->sg[0].addr = cpu_to_le32(addr);
 		psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen);  
@@ -1562,7 +1564,7 @@
 }
 
 
-static unsigned long aac_build_sg64(Scsi_Cmnd* scsicmd, struct sgmap64* psg)
+static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -1581,7 +1583,7 @@
 		sg = (struct scatterlist *) scsicmd->request_buffer;
 
 		sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg,
-			scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+			scsicmd->sc_data_direction);
 		psg->count = cpu_to_le32(sg_count);
 
 		byte_count = 0;
@@ -1610,7 +1612,7 @@
 		addr = pci_map_single(dev->pdev,
 				scsicmd->request_buffer,
 				scsicmd->request_bufflen,
-				scsi_to_pci_dma_dir(scsicmd->sc_data_direction));
+				scsicmd->sc_data_direction);
 		psg->count = cpu_to_le32(1);
 		le_addr = cpu_to_le64(addr);
 		psg->sg[0].addr[1] = (u32)(le_addr>>32);
diff -Nru a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
--- a/drivers/scsi/aacraid/aacraid.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aacraid/aacraid.h	Thu Jan  8 23:00:23 2004
@@ -520,10 +520,6 @@
 
 struct aac_driver_ident
 {
-	u16	vendor;
-	u16	device;
-	u16	subsystem_vendor;
-	u16	subsystem_device;
 	int 	(*init)(struct aac_dev *dev, unsigned long num);
 	char *	name;
 	char *	vname;
@@ -1466,6 +1462,8 @@
 	return (u32)capacity;
 }
 
+struct scsi_cmnd;
+
 const char *aac_driverinfo(struct Scsi_Host *);
 struct fib *fib_alloc(struct aac_dev *dev);
 int fib_setup(struct aac_dev *dev);
@@ -1480,10 +1478,9 @@
 void aac_consumer_free(struct aac_dev * dev, struct aac_queue * q, u32 qnum);
 int fib_complete(struct fib * context);
 #define fib_data(fibctx) ((void *)(fibctx)->hw_fib->data)
-int aac_detach(struct aac_dev *dev);
 struct aac_dev *aac_init_adapter(struct aac_dev *dev);
 int aac_get_containers(struct aac_dev *dev);
-int aac_scsi_cmd(Scsi_Cmnd *scsi_cmnd_ptr);
+int aac_scsi_cmd(struct scsi_cmnd *cmd);
 int aac_dev_ioctl(struct aac_dev *dev, int cmd, void *arg);
 int aac_do_ioctl(struct aac_dev * dev, int cmd, void *arg);
 int aac_rx_init(struct aac_dev *dev, unsigned long devNumber);
@@ -1495,3 +1492,4 @@
 int fib_adapter_complete(struct fib * fibptr, unsigned short size);
 struct aac_driver_ident* aac_get_driver_ident(int devtype);
 int aac_get_adapter_info(struct aac_dev* dev);
+int aac_send_shutdown(struct aac_dev *dev);
diff -Nru a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
--- a/drivers/scsi/aacraid/commctrl.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aacraid/commctrl.c	Thu Jan  8 23:00:23 2004
@@ -28,7 +28,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -37,11 +36,10 @@
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/completion.h>
+#include <linux/dma-mapping.h>
 #include <linux/blkdev.h>
 #include <asm/semaphore.h>
 #include <asm/uaccess.h>
-#include "scsi.h"
-#include "hosts.h"
 
 #include "aacraid.h"
 
@@ -439,16 +437,16 @@
 	
 	switch(srbcmd->flags){
 	case SRB_DataOut:
-		data_dir = SCSI_DATA_WRITE;
+		data_dir = DMA_TO_DEVICE;
 		break;
 	case (SRB_DataIn | SRB_DataOut):
-		data_dir = SCSI_DATA_UNKNOWN;  
+		data_dir = DMA_BIDIRECTIONAL;
 		break;
 	case SRB_DataIn:
-		data_dir = SCSI_DATA_READ;
+		data_dir = DMA_FROM_DEVICE;
 		break;
 	default:
-		data_dir = SCSI_DATA_NONE;
+		data_dir = DMA_NONE;
 	}
 	if( dev->pae_support ==1 ) {
 		struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
@@ -484,7 +482,7 @@
 					goto cleanup;
 				}
 			}
-			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, scsi_to_pci_dma_dir(data_dir));
+			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
 
 			le_addr = cpu_to_le64(addr);
 			psg->sg[i].addr[1] = (u32)(le_addr>>32);
@@ -526,7 +524,7 @@
 					goto cleanup;
 				}
 			}
-			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, scsi_to_pci_dma_dir(data_dir));
+			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
 
 			psg->sg[i].addr = cpu_to_le32(addr);
 			psg->sg[i].count = cpu_to_le32(psg->sg[i].count);  
diff -Nru a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
--- a/drivers/scsi/aacraid/comminit.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aacraid/comminit.c	Thu Jan  8 23:00:23 2004
@@ -29,7 +29,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -41,15 +40,11 @@
 #include <linux/completion.h>
 #include <linux/mm.h>
 #include <asm/semaphore.h>
-#include "scsi.h"
-#include "hosts.h"
 
 #include "aacraid.h"
 
 struct aac_common aac_config;
 
-static struct aac_dev *devices;
-
 static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned long commalign)
 {
 	unsigned char *base;
@@ -163,7 +158,7 @@
  *	This routine will send a VM_CloseAll (shutdown) request to the adapter.
  */
 
-static int aac_send_shutdown(struct aac_dev * dev)
+int aac_send_shutdown(struct aac_dev * dev)
 {
 	struct fib * fibctx;
 	struct aac_close *cmd;
@@ -191,35 +186,6 @@
 }
 
 /**
- *	aac_detach	-	detach adapter
- *	@detach: adapter to disconnect
- *
- *	Disconnect and shutdown an AAC based adapter, freeing resources
- *	as we go.
- */
-
-int aac_detach(struct aac_dev *detach)
-{
-	struct aac_dev **dev = &devices;
-	
-	while(*dev)
-	{
-		if(*dev == detach)
-		{
-			*dev = detach->next;
-			aac_send_shutdown(detach);
-			fib_map_free(detach);
-			pci_free_consistent(detach->pdev, detach->comm_size, detach->comm_addr, detach->comm_phys);
-			kfree(detach->queues);
-			return 1;
-		}
-		dev=&((*dev)->next);
-	}
-	BUG();
-	return 0;
-}
-
-/**
  *	aac_comm_init	-	Initialise FSA data structures
  *	@dev:	Adapter to initialise
  *
@@ -344,11 +310,7 @@
 		
 	INIT_LIST_HEAD(&dev->fib_list);
 	init_completion(&dev->aif_completion);
-	/*
-	 *	Add this adapter in to our dev List.
-	 */
-	dev->next = devices;
-	devices = dev;
+
 	return dev;
 }
 
diff -Nru a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
--- a/drivers/scsi/aacraid/commsup.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aacraid/commsup.c	Thu Jan  8 23:00:24 2004
@@ -3,7 +3,6 @@
  *	(c) Copyright 2001 Red Hat Inc.	<alan@redhat.com>
  *
  * based on the old aacraid driver that is..
-
  * Adaptec aacraid device driver for Linux.
  *
  * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
@@ -28,10 +27,8 @@
  * Abstract: Contain all routines that are required for FSA host/adapter
  *    commuication.
  *
- *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -40,10 +37,8 @@
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/completion.h>
-#include <asm/semaphore.h>
 #include <linux/blkdev.h>
-#include "scsi.h"
-#include "hosts.h"
+#include <asm/semaphore.h>
 
 #include "aacraid.h"
 
diff -Nru a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c
--- a/drivers/scsi/aacraid/dpcsup.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aacraid/dpcsup.c	Thu Jan  8 23:00:24 2004
@@ -29,7 +29,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -40,8 +39,6 @@
 #include <linux/completion.h>
 #include <linux/blkdev.h>
 #include <asm/semaphore.h>
-#include "scsi.h"
-#include "hosts.h"
 
 #include "aacraid.h"
 
diff -Nru a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
--- a/drivers/scsi/aacraid/linit.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aacraid/linit.c	Thu Jan  8 23:00:23 2004
@@ -25,354 +25,158 @@
  *   linit.c
  *
  * Abstract: Linux Driver entry module for Adaptec RAID Array Controller
- *				
- *	Provides the following driver entry points:
- *		aac_detect()
- *		aac_release()
- *		aac_queuecommand()
- *		aac_resetcommand()
- *		aac_biosparm()
- *	
  */
 
-#define AAC_DRIVER_VERSION		"1.1.2"
+#define AAC_DRIVER_VERSION		"1.1.2-lk1"
 #define AAC_DRIVER_BUILD_DATE		__DATE__
+#define AAC_DRIVERNAME			"aacraid"
 
-#include <linux/module.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
+#include <linux/blkdev.h>
+#include <linux/completion.h>
 #include <linux/init.h>
-#include <linux/types.h>
-#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/pci.h>
-#include <linux/spinlock.h>
 #include <linux/slab.h>
-#include <linux/completion.h>
-#include <linux/interrupt.h>
+#include <linux/spinlock.h>
 #include <asm/semaphore.h>
-#include <linux/blkdev.h>
-#include "scsi.h"
-#include "hosts.h"
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_tcq.h>
 #include <scsi/scsicam.h>
 
 #include "aacraid.h"
 
 
-#define AAC_DRIVERNAME	"aacraid"
-
 MODULE_AUTHOR("Red Hat Inc and Adaptec");
-MODULE_DESCRIPTION("Supports Dell PERC2, 2/Si, 3/Si, 3/Di, Adaptec Advanced Raid Products, and HP NetRAID-4M devices. http://domsch.com/linux/ or http://linux.adaptec.com");
+MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, "
+		   "Adaptec Advanced Raid Products, "
+		   "and HP NetRAID-4M SCSI driver");
 MODULE_LICENSE("GPL");
-MODULE_PARM(nondasd, "i");
+
+
+int nondasd = -1;
+module_param(nondasd, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on");
-MODULE_PARM(paemode, "i");
-MODULE_PARM_DESC(paemode, "Control whether dma addressing is using PAE. 0=off, 1=on");
 
-int nondasd=-1;
-int paemode=-1;
+int paemode = -1;
+module_param(paemode, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(paemode, "Control whether dma addressing is using PAE. 0=off, 1=on");
 
 struct aac_dev *aac_devices[MAXIMUM_NUM_ADAPTERS];
-
-static unsigned aac_count = 0;
+static unsigned aac_count;
 static int aac_cfg_major = -1;
 
 /*
  * Because of the way Linux names scsi devices, the order in this table has
  * become important.  Check for on-board Raid first, add-in cards second.
+ *
+ * Note: The last field is used to index into aac_drivers below.
  */
+static struct pci_device_id aac_pci_tbl[] = {
+	{ 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si */
+	{ 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di */
+	{ 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si */
+	{ 0x1028, 0x0004, 0x1028, 0x00d0, 0, 0, 3 }, /* PERC 3/Si */
+	{ 0x1028, 0x0002, 0x1028, 0x00d1, 0, 0, 4 }, /* PERC 3/Di */
+	{ 0x1028, 0x0002, 0x1028, 0x00d9, 0, 0, 5 }, /* PERC 3/Di */
+	{ 0x1028, 0x000a, 0x1028, 0x0106, 0, 0, 6 }, /* PERC 3/Di */
+	{ 0x1028, 0x000a, 0x1028, 0x011b, 0, 0, 7 }, /* PERC 3/Di */
+	{ 0x1028, 0x000a, 0x1028, 0x0121, 0, 0, 8 }, /* PERC 3/Di */
+	{ 0x9005, 0x0283, 0x9005, 0x0283, 0, 0, 9 }, /* catapult*/
+	{ 0x9005, 0x0284, 0x9005, 0x0284, 0, 0, 10 }, /* tomcat*/
+	{ 0x9005, 0x0285, 0x9005, 0x0286, 0, 0, 11 }, /* Adaptec 2120S (Crusader)*/
+	{ 0x9005, 0x0285, 0x9005, 0x0285, 0, 0, 12 }, /* Adaptec 2200S (Vulcan)*/
+	{ 0x9005, 0x0285, 0x9005, 0x0287, 0, 0, 13 }, /* Adaptec 2200S (Vulcan-2m)*/
+	{ 0x9005, 0x0285, 0x17aa, 0x0286, 0, 0, 14 }, /* Legend S220*/
+	{ 0x9005, 0x0285, 0x17aa, 0x0287, 0, 0, 15 }, /* Legend S230*/
+
+	{ 0x9005, 0x0285, 0x9005, 0x0288, 0, 0, 16 }, /* Adaptec 3230S (Harrier)*/
+	{ 0x9005, 0x0285, 0x9005, 0x0289, 0, 0, 17 }, /* Adaptec 3240S (Tornado)*/
+	{ 0x9005, 0x0285, 0x9005, 0x028a, 0, 0, 18 }, /* ASR-2020S PCI-X ZCR (Skyhawk)*/
+	{ 0x9005, 0x0285, 0x9005, 0x028b, 0, 0, 19 }, /* ASR-2020S SO-DIMM PCI-X ZCR(Terminator)*/
+	{ 0x9005, 0x0285, 0x9005, 0x0290, 0, 0, 20 }, /* AAR-2410SA PCI SATA 4ch (Jaguar II)*/
+	{ 0x9005, 0x0250, 0x1014, 0x0279, 0, 0, 21 }, /* (Marco)*/
+	{ 0x9005, 0x0250, 0x1014, 0x028c, 0, 0, 22 }, /* (Sebring)*/
+
+	{ 0x9005, 0x0285, 0x1028, 0x0287, 0, 0, 23 }, /* Perc 320/DC*/
+	{ 0x1011, 0x0046, 0x9005, 0x0365, 0, 0, 24 }, /* Adaptec 5400S (Mustang)*/
+	{ 0x1011, 0x0046, 0x9005, 0x0364, 0, 0, 25 }, /* Adaptec 5400S (Mustang)*/
+	{ 0x1011, 0x0046, 0x9005, 0x1364, 0, 0, 26 }, /* Dell PERC2 "Quad Channel" */
+	{ 0x1011, 0x0046, 0x103c, 0x10c2, 0, 0, 27 }, /* HP NetRAID-4M */
+	{ 0,}
+};
+MODULE_DEVICE_TABLE(pci, aac_pci_tbl);
+
 /*
  * dmb - For now we add the number of channels to this structure.  
  * In the future we should add a fib that reports the number of channels
  * for the card.  At that time we can remove the channels from here
  */
 static struct aac_driver_ident aac_drivers[] = {
-	{ 0x1028, 0x0001, 0x1028, 0x0001, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 2/Si */
-	{ 0x1028, 0x0002, 0x1028, 0x0002, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x1028, 0x0003, 0x1028, 0x0003, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
-	{ 0x1028, 0x0004, 0x1028, 0x00d0, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
-	{ 0x1028, 0x0002, 0x1028, 0x00d1, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x1028, 0x0002, 0x1028, 0x00d9, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x1028, 0x000a, 0x1028, 0x0106, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x1028, 0x000a, 0x1028, 0x011b, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x1028, 0x000a, 0x1028, 0x0121, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
-	{ 0x9005, 0x0283, 0x9005, 0x0283, aac_rx_init, "aacraid",  "ADAPTEC ", "catapult        ", 2 }, /* catapult*/
-	{ 0x9005, 0x0284, 0x9005, 0x0284, aac_rx_init, "aacraid",  "ADAPTEC ", "tomcat          ", 2 }, /* tomcat*/
-	{ 0x9005, 0x0285, 0x9005, 0x0286, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1 }, /* Adaptec 2120S (Crusader)*/
-	{ 0x9005, 0x0285, 0x9005, 0x0285, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan)*/
-	{ 0x9005, 0x0285, 0x9005, 0x0287, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan-2m)*/
-	{ 0x9005, 0x0285, 0x17aa, 0x0286, aac_rx_init, "aacraid",  "Legend  ", "Legend S220     ", 1 }, /* Legend S220*/
-	{ 0x9005, 0x0285, 0x17aa, 0x0287, aac_rx_init, "aacraid",  "Legend  ", "Legend S230     ", 2 }, /* Legend S230*/
-
-	{ 0x9005, 0x0285, 0x9005, 0x0288, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3230S   ", 2 }, /* Adaptec 3230S (Harrier)*/
-	{ 0x9005, 0x0285, 0x9005, 0x0289, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3240S   ", 2 }, /* Adaptec 3240S (Tornado)*/
-	{ 0x9005, 0x0285, 0x9005, 0x028a, aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020S PCI-X ", 2 }, /* ASR-2020S PCI-X ZCR (Skyhawk)*/
-	{ 0x9005, 0x0285, 0x9005, 0x028b, aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020S PCI-X ", 2 }, /* ASR-2020S SO-DIMM PCI-X ZCR(Terminator)*/
-	{ 0x9005, 0x0285, 0x9005, 0x0290, aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-2410SA SATA ", 2 }, /* AAR-2410SA PCI SATA 4ch (Jaguar II)*/
-	{ 0x9005, 0x0250, 0x1014, 0x0279, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec         ", 2 }, /* (Marco)*/
-	{ 0x9005, 0x0250, 0x1014, 0x028c, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec         ", 2 }, /* (Sebring)*/
-
-	{ 0x9005, 0x0285, 0x1028, 0x0287, aac_rx_init, "percraid", "DELL    ", "PERC 320/DC     ", 2 }, /* Perc 320/DC*/
-	{ 0x1011, 0x0046, 0x9005, 0x0365, aac_sa_init, "aacraid",  "ADAPTEC ", "Adaptec 5400S   ", 4 }, /* Adaptec 5400S (Mustang)*/
-	{ 0x1011, 0x0046, 0x9005, 0x0364, aac_sa_init, "aacraid",  "ADAPTEC ", "AAC-364         ", 4 }, /* Adaptec 5400S (Mustang)*/
-	{ 0x1011, 0x0046, 0x9005, 0x1364, aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4 }, /* Dell PERC2 "Quad Channel" */
-	{ 0x1011, 0x0046, 0x103c, 0x10c2, aac_sa_init, "hpnraid",  "HP      ", "NetRAID         ", 4 }  /* HP NetRAID-4M */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 2/Si */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "catapult        ", 2 }, /* catapult*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "tomcat          ", 2 }, /* tomcat*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1 }, /* Adaptec 2120S (Crusader)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan-2m)*/
+	{ aac_rx_init, "aacraid",  "Legend  ", "Legend S220     ", 1 }, /* Legend S220*/
+	{ aac_rx_init, "aacraid",  "Legend  ", "Legend S230     ", 2 }, /* Legend S230*/
+
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3230S   ", 2 }, /* Adaptec 3230S (Harrier)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3240S   ", 2 }, /* Adaptec 3240S (Tornado)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020S PCI-X ", 2 }, /* ASR-2020S PCI-X ZCR (Skyhawk)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020S PCI-X ", 2 }, /* ASR-2020S SO-DIMM PCI-X ZCR(Terminator)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-2410SA SATA ", 2 }, /* AAR-2410SA PCI SATA 4ch (Jaguar II)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec         ", 2 }, /* (Marco)*/
+	{ aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec         ", 2 }, /* (Sebring)*/
+
+	{ aac_rx_init, "percraid", "DELL    ", "PERC 320/DC     ", 2 }, /* Perc 320/DC*/
+	{ aac_sa_init, "aacraid",  "ADAPTEC ", "Adaptec 5400S   ", 4 }, /* Adaptec 5400S (Mustang)*/
+	{ aac_sa_init, "aacraid",  "ADAPTEC ", "AAC-364         ", 4 }, /* Adaptec 5400S (Mustang)*/
+	{ aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4 }, /* Dell PERC2 "Quad Channel" */
+	{ aac_sa_init, "hpnraid",  "HP      ", "NetRAID         ", 4 }  /* HP NetRAID-4M */
 };
 
-#define NUM_AACTYPES	(sizeof(aac_drivers) / sizeof(struct aac_driver_ident))
-static int num_aacdrivers = NUM_AACTYPES;
-
-static int aac_cfg_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
-static int aac_cfg_open(struct inode * inode, struct file * file);
-static int aac_cfg_release(struct inode * inode,struct file * file);
-
-static struct file_operations aac_cfg_fops = {
-	.owner		= THIS_MODULE,
-	.ioctl		= aac_cfg_ioctl,
-	.open		= aac_cfg_open,
-	.release	= aac_cfg_release
-};
-
-static int aac_detect(Scsi_Host_Template *);
-static int aac_release(struct Scsi_Host *);
-static int aac_queuecommand(Scsi_Cmnd *, void (*CompletionRoutine)(Scsi_Cmnd *));
-static int aac_biosparm(struct scsi_device *, struct block_device *,
-			sector_t, int *);
-static int aac_ioctl(Scsi_Device *, int, void *);
-static int aac_eh_abort(Scsi_Cmnd * cmd);
-static int aac_eh_device_reset(Scsi_Cmnd* cmd);
-static int aac_eh_bus_reset(Scsi_Cmnd* cmd);
-static int aac_eh_reset(Scsi_Cmnd* cmd);
-
-static int aac_slave_configure(struct scsi_device *);
-
-/**
- *	aac_detect	-	Probe for aacraid cards
- *	@template: SCSI driver template
- *
- *	Probe for AAC Host Adapters initialize, register, and report the 
- *	configuration of each AAC Host Adapter found.
- *	Returns the number of adapters successfully initialized and 
- *	registered.
- *	Initializes all data necessary for this particular SCSI driver.
- *	Notes:
- *	The detect routine must not call any of the mid level functions 
- *	to queue commands because things are not guaranteed to be set 
- *	up yet. The detect routine can send commands to the host adapter 
- *	as long as the program control will not be passed to scsi.c in 
- *	the processing of the command. Note especially that 
- *	scsi_malloc/scsi_free must not be called.
- *
- */
- 
-static int aac_detect(Scsi_Host_Template *template)
-{
-	int index;
-	int container;
-	u16 vendor_id, device_id;
-	struct Scsi_Host *host_ptr;
-	struct pci_dev *dev = NULL;
-	struct aac_dev *aac;
-	struct fsa_scsi_hba *fsa_dev_ptr;
-	char *name = NULL;
-	
-	printk(KERN_INFO "Red Hat/Adaptec aacraid driver (%s %s)\n", AAC_DRIVER_VERSION, AAC_DRIVER_BUILD_DATE);
-
-	/* setting up the proc directory structure */
-	template->proc_name = "aacraid";
-
-	for( index = 0; index != num_aacdrivers; index++ ) {
-		device_id = aac_drivers[index].device;
-		vendor_id = aac_drivers[index].vendor;
-		name = aac_drivers[index].name;
-		dprintk((KERN_DEBUG "Checking %s %x/%x/%x/%x.\n", 
-			name, vendor_id, device_id,
-			aac_drivers[index].subsystem_vendor,
-			aac_drivers[index].subsystem_device));
-
-		dev = NULL;
-		while((dev = pci_find_device(vendor_id, device_id, dev))) {
-			if (pci_enable_device(dev))
-				continue;
-			pci_set_master(dev);
-			pci_set_dma_mask(dev, 0xFFFFFFFFULL);
-
-			if((dev->subsystem_vendor != aac_drivers[index].subsystem_vendor) || 
-			   (dev->subsystem_device != aac_drivers[index].subsystem_device))
-					continue;
-
-			dprintk((KERN_DEBUG "%s device detected.\n", name));
-			dprintk((KERN_DEBUG "%x/%x/%x/%x.\n", vendor_id, device_id, 
-				aac_drivers[index].subsystem_vendor, aac_drivers[index].subsystem_device));
-			/* Increment the host adapter count */
-			aac_count++;
-			/*
-			 * scsi_register() allocates memory for a Scsi_Hosts structure and
-			 * links it into the linked list of host adapters. This linked list
-			 * contains the data for all possible <supported> scsi hosts.
-			 * This is similar to the Scsi_Host_Template, except that we have
-			 * one entry for each actual physical host adapter on the system,
-			 * stored as a linked list. If there are two AAC boards, then we
-			 * will need to make two Scsi_Host entries, but there will be only
-			 * one Scsi_Host_Template entry. The second argument to scsi_register()
-			 * specifies the size of the extra memory we want to hold any device 
-			 * specific information.
-			 */
-			host_ptr = scsi_register( template, sizeof(struct aac_dev) );
-			/* 
-			 * These three parameters can be used to allow for wide SCSI 
-			 * and for host adapters that support multiple buses.
-			 */
-			host_ptr->irq = dev->irq;		/* Adapter IRQ number */
-			/* host_ptr->base = ( char * )(dev->resource[0].start & ~0xff); */
-			host_ptr->base = dev->resource[0].start;
-			scsi_set_device(host_ptr, &dev->dev);
-			dprintk((KERN_DEBUG "Device base address = 0x%lx [0x%lx].\n", host_ptr->base, dev->resource[0].start));
-			dprintk((KERN_DEBUG "Device irq = 0x%x.\n", dev->irq));
-			/*
-			 * The unique_id field is a unique identifier that must
-			 * be assigned so that we have some way of identifying
-			 * each host adapter properly and uniquely. For hosts 
-			 * that do not support more than one card in the
-			 * system, this does not need to be set. It is
-			 * initialized to zero in scsi_register(). This is the 
-			 * value returned as aac->id.
-			 */
-			host_ptr->unique_id = aac_count - 1;
-			aac = (struct aac_dev *)host_ptr->hostdata;
-			/* attach a pointer back to Scsi_Host */
-			aac->scsi_host_ptr = host_ptr;	
-			aac->pdev = dev;
-			aac->name = aac->scsi_host_ptr->hostt->name;
-			aac->id = aac->scsi_host_ptr->unique_id;
-			aac->cardtype =  index;
-
-			aac->fibs = (struct fib*) kmalloc(sizeof(struct fib)*AAC_NUM_FIB, GFP_KERNEL);
-			spin_lock_init(&aac->fib_lock);
-
-			/* Initialize the ordinal number of the device to -1 */
-			fsa_dev_ptr = &(aac->fsa_dev);
-			for( container = 0; container < MAXIMUM_NUM_CONTAINERS; container++ )
-				fsa_dev_ptr->devname[container][0] = '\0';
-
-			dprintk((KERN_DEBUG "Initializing Hardware...\n"));
-			if((*aac_drivers[index].init)(aac , host_ptr->unique_id) != 0)
-			{
-				/* device initialization failed */
-				printk(KERN_WARNING "aacraid: device initialization failed.\n");
-				scsi_unregister(host_ptr);
-				aac_count--;
-				continue;
-			} 
-			dprintk((KERN_DEBUG "%s:%d device initialization successful.\n", name, host_ptr->unique_id));
-			aac_get_adapter_info(aac);
-			if(aac->nondasd_support == 1){
-			/*
-			 * max channel will be the physical channels plus 1 virtual channel 
-			 * all containers are on the virtual channel 0
-			 * physical channels are address by their actual physical number+1
-			 */
-				host_ptr->max_channel = aac_drivers[index].channels+1;
-			} else {
-				host_ptr->max_channel = 1;
-			}
-			dprintk((KERN_DEBUG "Device has %d logical channels\n",host_ptr->max_channel));
-			aac_get_containers(aac);
-			aac_devices[aac_count-1] = aac;
-//			spin_unlock_irqrestore(&aac->fib_lock, flags);
-
-			/*
-			 * dmb - we may need to move the setting of these parms somewhere else once
-			 * we get a fib that can report the actual numbers
-			 */
-			host_ptr->max_id = AAC_MAX_TARGET;
-			host_ptr->max_lun = AAC_MAX_LUN;
-
-		}
-	}
-
-	if( aac_count ){
-		if((aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops))<0)
-			printk(KERN_WARNING "aacraid: unable to register \"aac\" device.\n");
-	}
-
-	return aac_count;
-}
-
-/**
- *	aac_release	-	release SCSI host resources
- *	@host_ptr: SCSI host to clean up
- *
- *	Release all resources previously acquired to support a specific Host 
- *	Adapter and unregister the AAC Host Adapter.
- *
- *	BUGS: Does not wait for the thread it kills to die.
- */
-
-static int aac_release(struct Scsi_Host *host_ptr)
-{
-	struct aac_dev *dev;
-	dprintk((KERN_DEBUG "aac_release.\n"));
-	dev = (struct aac_dev *)host_ptr->hostdata;
-	/*
-	 *	kill any threads we started
-	 */
-	kill_proc(dev->thread_pid, SIGKILL, 0);
-	wait_for_completion(&dev->aif_completion);
-	/*
-	 *	Call the comm layer to detach from this adapter
-	 */
-	aac_detach(dev);
-	/* Check free orderings... */
-	/* remove interrupt binding */
-	free_irq(host_ptr->irq, dev);
-	iounmap((void * )dev->regs.sa);
-	/* unregister adapter */
-	scsi_unregister(host_ptr);
-	/*
-	 *	FIXME: This assumes no hot plugging is going on...
-	 */
-	if( aac_cfg_major >= 0 )
-	{
-		unregister_chrdev(aac_cfg_major, "aac");
-		aac_cfg_major = -1;
-	}
-	return 0;
-}
-
 /**
  *	aac_queuecommand	-	queue a SCSI command
- *	@scsi_cmnd_ptr:	SCSI command to queue
- *	@CompletionRoutine: Function to call on command completion
+ *	@cmd:		SCSI command to queue
+ *	@done:		Function to call on command completion
  *
  *	Queues a command for execution by the associated Host Adapter.
+ *
+ *	TODO: unify with aac_scsi_cmd().
  */ 
 
-static int aac_queuecommand(Scsi_Cmnd *scsi_cmnd_ptr, void (*CompletionRoutine)(Scsi_Cmnd *))
+static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
-	int ret;
-
-	scsi_cmnd_ptr->scsi_done = CompletionRoutine;
-	/*
-	 *	aac_scsi_cmd() handles command processing, setting the 
-	 *	result code and calling completion routine. 
-	 */
-	if((ret = aac_scsi_cmd(scsi_cmnd_ptr)) != 0){
-		dprintk((KERN_DEBUG "aac_scsi_cmd failed.\n"));
-		return FAILED;
-	}
-	return ret;
+	cmd->scsi_done = done;
+	return (aac_scsi_cmd(cmd) ? FAILED : 0);
 } 
 
 /**
- *	aac_driverinfo		-	Returns the host adapter name
- *	@host_ptr:	Scsi host to report on
+ *	aac_info		-	Returns the host adapter name
+ *	@shost:		Scsi host to report on
  *
  *	Returns a static string describing the device in question
  */
 
-const char *aac_driverinfo(struct Scsi_Host *host_ptr)
+const char *aac_info(struct Scsi_Host *shost)
 {
-	struct aac_dev *dev = (struct aac_dev *)host_ptr->hostdata;
+	struct aac_dev *dev = (struct aac_dev *)shost->hostdata;
 	return aac_drivers[dev->cardtype].name;
 }
 
@@ -382,9 +186,10 @@
  *
  * 	Returns a pointer to the entry in the driver lookup table.
  */
+
 struct aac_driver_ident* aac_get_driver_ident(int devtype)
 {
-	return  &aac_drivers[devtype];
+	return &aac_drivers[devtype];
 }
 
 /**
@@ -420,66 +225,48 @@
 	/*
 	 *	Assuming extended translation is enabled - #REVISIT#
 	 */
-	if( capacity >= 2 * 1024 * 1024 ) /* 1 GB in 512 byte sectors */
-	{
-		if( capacity >= 4 * 1024 * 1024 ) /* 2 GB in 512 byte sectors */
-		{
+	if (capacity >= 2 * 1024 * 1024) { /* 1 GB in 512 byte sectors */
+		if(capacity >= 4 * 1024 * 1024) { /* 2 GB in 512 byte sectors */
 			param->heads = 255;
 			param->sectors = 63;
-		}
-		else
-		{
+		} else {
 			param->heads = 128;
 			param->sectors = 32;
 		}
-	}
-	else
-	{
+	} else {
 		param->heads = 64;
 		param->sectors = 32;
 	}
 
 	param->cylinders = cap_to_cyls(capacity, param->heads * param->sectors);
 
-	/*
-	 *	Read the first 1024 bytes from the disk device
-	 */
-
-	buf = scsi_bios_ptable(bdev);
-
 	/* 
-	 *	If the boot sector partition table is valid, search for a partition 
-	 *	table entry whose end_head matches one of the standard geometry 
+	 *	Read the first 1024 bytes from the disk device, if the boot
+	 *	sector partition table is valid, search for a partition table
+	 *	entry whose end_head matches one of the standard geometry 
 	 *	translations ( 64/32, 128/32, 255/63 ).
 	 */
-	 
-	if(*(unsigned short *)(buf + 0x40) == cpu_to_le16(0xaa55))
-	{
+	buf = scsi_bios_ptable(bdev);
+	if(*(unsigned short *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
 		struct partition *first = (struct partition * )buf;
 		struct partition *entry = first;
 		int saved_cylinders = param->cylinders;
 		int num;
 		unsigned char end_head, end_sec;
 
-		for(num = 0; num < 4; num++)
-		{
+		for(num = 0; num < 4; num++) {
 			end_head = entry->end_head;
 			end_sec = entry->end_sector & 0x3f;
 
-			if(end_head == 63)
-			{
+			if(end_head == 63) {
 				param->heads = 64;
 				param->sectors = 32;
 				break;
-			}
-			else if(end_head == 127)
-			{
+			} else if(end_head == 127) {
 				param->heads = 128;
 				param->sectors = 32;
 				break;
-			}
-			else if(end_head == 254) 
-			{
+			} else if(end_head == 254) {
 				param->heads = 255;
 				param->sectors = 63;
 				break;
@@ -487,22 +274,17 @@
 			entry++;
 		}
 
-		if(num == 4)
-		{
+		if (num == 4) {
 			end_head = first->end_head;
 			end_sec = first->end_sector & 0x3f;
 		}
 
 		param->cylinders = cap_to_cyls(capacity, param->heads * param->sectors);
-
-		if(num < 4 && end_sec == param->sectors)
-		{
-			if(param->cylinders != saved_cylinders)
+		if (num < 4 && end_sec == param->sectors) {
+			if (param->cylinders != saved_cylinders)
 				dprintk((KERN_DEBUG "Adopting geometry: heads=%d, sectors=%d from partition table %d.\n",
 					param->heads, param->sectors, num));
-		}
-		else if(end_head > 0 || end_sec > 0)
-		{
+		} else if (end_head > 0 || end_sec > 0) {
 			dprintk((KERN_DEBUG "Strange geometry: heads=%d, sectors=%d in partition table %d.\n",
 				end_head + 1, end_sec, num));
 			dprintk((KERN_DEBUG "Using geometry: heads=%d, sectors=%d.\n",
@@ -515,42 +297,36 @@
 
 /**
  *	aac_queuedepth		-	compute queue depths
- *	@host:	SCSI host in question
- *	@dev:	SCSI device we are considering
+ *	@sdev:	SCSI device we are considering
  *
  *	Selects queue depths for each target device based on the host adapter's
  *	total capacity and the queue depth supported by the target device.
  *	A queue depth of one automatically disables tagged queueing.
  */
 
-static int aac_slave_configure(struct scsi_device * dev )
+static int aac_slave_configure(struct scsi_device *sdev)
 {
-	if(dev->tagged_supported)
-		scsi_adjust_queue_depth(dev, MSG_ORDERED_TAG, 128);
+	if (sdev->tagged_supported)
+		scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128);
 	else
-		scsi_adjust_queue_depth(dev, 0, 1);
-
-	dprintk((KERN_DEBUG "(scsi%d:%d:%d:%d) Tagged Queue depth %2d, "
-				"%s\n", dev->host->host_no, dev->channel,
-				dev->id, dev->lun, dev->queue_depth,
-				dev->online ? "OnLine" : "OffLine"));
+		scsi_adjust_queue_depth(sdev, 0, 1);
 	return 0;
 }
 
-/*------------------------------------------------------------------------------
-	aac_ioctl()
-
-		Handle SCSI ioctls
- *----------------------------------------------------------------------------*/
-static int aac_ioctl(Scsi_Device * scsi_dev_ptr, int cmd, void * arg)
-/*----------------------------------------------------------------------------*/
-{
-	struct aac_dev *dev;
-	dprintk((KERN_DEBUG "aac_ioctl.\n"));
-	dev = (struct aac_dev *)scsi_dev_ptr->host->hostdata;
+static int aac_ioctl(struct scsi_device *sdev, int cmd, void * arg)
+{
+	struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
 	return aac_do_ioctl(dev, cmd, arg);
 }
 
+/*
+ * XXX: does aac really need no error handling??
+ */
+static int aac_eh_abort(struct scsi_cmnd *cmd)
+{
+	return FAILED;
+}
+
 /**
  *	aac_cfg_open		-	open a configuration file
  *	@inode: inode being opened
@@ -563,25 +339,13 @@
  *	so we can support hot plugging, and to ref count adapters.
  */
 
-static int aac_cfg_open(struct inode * inode, struct file * file )
+static int aac_cfg_open(struct inode *inode, struct file *file)
 {
-	unsigned minor_number = iminor(inode);
-	if(minor_number >= aac_count)
-		return -ENODEV;
-	return 0;
-}
+	unsigned minor = iminor(inode);
 
-/**
- *	aac_cfg_release		-	close down an AAC config device
- *	@inode: inode of configuration file
- *	@file: file handle of configuration file
- *	
- *	Called when the last close of the configuration file handle
- *	is performed.
- */
- 
-static int aac_cfg_release(struct inode * inode, struct file * file )
-{
+	if (minor >= aac_count)
+		return -ENODEV;
+	file->private_data = aac_devices[minor];
 	return 0;
 }
 
@@ -599,83 +363,205 @@
  *	Bugs: Needs to handle hot plugging
  */
  
-static int aac_cfg_ioctl(struct inode * inode,  struct file * file, unsigned int cmd, unsigned long arg )
+static int aac_cfg_ioctl(struct inode *inode,  struct file *file,
+		unsigned int cmd, unsigned long arg)
 {
-	struct aac_dev *dev = aac_devices[iminor(inode)];
-	return aac_do_ioctl(dev, cmd, (void *)arg);
+	return aac_do_ioctl(file->private_data, cmd, (void *)arg);
 }
 
-/*
- *	To use the low level SCSI driver support using the linux kernel loadable 
- *	module interface we should initialize the global variable driver_interface  
- *	(datatype Scsi_Host_Template) and then include the file scsi_module.c.
- */
- 
-static Scsi_Host_Template driver_template = {
+static struct file_operations aac_cfg_fops = {
+	.owner		= THIS_MODULE,
+	.ioctl		= aac_cfg_ioctl,
+	.open		= aac_cfg_open,
+};
+
+static struct scsi_host_template aac_driver_template = {
 	.module				= THIS_MODULE,
 	.name           		= "AAC",
-	.detect         		= aac_detect,
-	.release        		= aac_release,
-	.info           		= aac_driverinfo,
+	.proc_name			= "aacraid",
+	.info           		= aac_info,
 	.ioctl          		= aac_ioctl,
 	.queuecommand   		= aac_queuecommand,
 	.bios_param     		= aac_biosparm,	
 	.slave_configure		= aac_slave_configure,
+	.eh_abort_handler		= aac_eh_abort,
 	.can_queue      		= AAC_NUM_IO_FIB,	
 	.this_id        		= 16,
 	.sg_tablesize   		= 16,
 	.max_sectors    		= 128,
 	.cmd_per_lun    		= AAC_NUM_IO_FIB, 
-	.eh_abort_handler		= aac_eh_abort,
-	.eh_device_reset_handler	= aac_eh_device_reset,
-	.eh_bus_reset_handler		= aac_eh_bus_reset,
-	.eh_host_reset_handler		= aac_eh_reset,
 	.use_clustering			= ENABLE_CLUSTERING,
 };
 
-/*===========================================================================
- * Error Handling routines
- *===========================================================================
- */
-
 
-/*
- *
- * We don't support abortting commands.
- */
-static int aac_eh_abort(Scsi_Cmnd * scsicmd)
+static int __devinit aac_probe_one(struct pci_dev *pdev,
+		const struct pci_device_id *id)
 {
-	printk("aacraid: abort failed\n");
-	return FAILED;
-}
+	unsigned index = id->driver_data;
+	struct Scsi_Host *shost;
+	struct fsa_scsi_hba *fsa_dev_ptr;
+	struct aac_dev *aac;
+	int container;
+	int error = -ENODEV;
 
-/*
- * We don't support device resets.
- */
-static int aac_eh_device_reset(Scsi_Cmnd* cmd)
-{
-	printk("aacraid: device reset failed\n");
-	return FAILED;
-}
+	if (pci_enable_device(pdev))
+		goto out;
 
+	if (pci_set_dma_mask(pdev, 0xFFFFFFFFULL))
+		goto out;
+	
+	pci_set_master(pdev);
 
-static int aac_eh_bus_reset(Scsi_Cmnd* cmd)
-{
-	printk("aacraid: bus reset failed\n");
-	return FAILED;
+	/* Increment the host adapter count */
+	aac_count++;
+
+	shost = scsi_host_alloc(&aac_driver_template, sizeof(struct aac_dev));
+	if (!shost)
+		goto out_disable_pdev;
+
+	shost->irq = pdev->irq;
+	shost->base = pci_resource_start(pdev, 0);
+	shost->unique_id = aac_count - 1;
+
+	aac = (struct aac_dev *)shost->hostdata;
+	aac->scsi_host_ptr = shost;	
+	aac->pdev = pdev;
+	aac->name = aac_driver_template.name;
+	aac->id = shost->unique_id;
+	aac->cardtype =  index;
+
+	aac->fibs = kmalloc(sizeof(struct fib) * AAC_NUM_FIB, GFP_KERNEL);
+	if (!aac->fibs)
+		goto out_free_host;
+	spin_lock_init(&aac->fib_lock);
+
+	/* Initialize the ordinal number of the device to -1 */
+	fsa_dev_ptr = &aac->fsa_dev;
+	for (container = 0; container < MAXIMUM_NUM_CONTAINERS; container++)
+		fsa_dev_ptr->devname[container][0] = '\0';
+
+	if ((*aac_drivers[index].init)(aac , shost->unique_id))
+		goto out_free_fibs;
+
+	aac_get_adapter_info(aac);
+
+	/*
+	 * max channel will be the physical channels plus 1 virtual channel
+	 * all containers are on the virtual channel 0
+	 * physical channels are address by their actual physical number+1
+	 */
+	if (aac->nondasd_support == 1)
+		shost->max_channel = aac_drivers[index].channels+1;
+	else
+		shost->max_channel = 1;
+
+	aac_get_containers(aac);
+	aac_devices[aac_count-1] = aac;
+
+	/*
+	 * dmb - we may need to move the setting of these parms somewhere else once
+	 * we get a fib that can report the actual numbers
+	 */
+	shost->max_id = AAC_MAX_TARGET;
+	shost->max_lun = AAC_MAX_LUN;
+
+	error = scsi_add_host(shost, &pdev->dev);
+	if (error)
+		goto out_deinit;
+
+	pci_set_drvdata(pdev, shost);
+	scsi_scan_host(shost);
+
+	return 0;
+
+ out_deinit:
+	kill_proc(aac->thread_pid, SIGKILL, 0);
+	wait_for_completion(&aac->aif_completion);
+
+	aac_send_shutdown(aac);
+	fib_map_free(aac);
+	pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
+	kfree(aac->queues);
+	free_irq(pdev->irq, aac);
+	iounmap((void * )aac->regs.sa);
+ out_free_fibs:
+	kfree(aac->fibs);
+ out_free_host:
+	scsi_host_put(shost);
+ out_disable_pdev:
+	pci_disable_device(pdev);
+	aac_count--;
+ out:
+	return error;
+}
+
+static void __devexit aac_remove_one(struct pci_dev *pdev)
+{
+	struct Scsi_Host *shost = pci_get_drvdata(pdev);
+	struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
+
+	scsi_remove_host(shost);
+
+	kill_proc(aac->thread_pid, SIGKILL, 0);
+	wait_for_completion(&aac->aif_completion);
+
+	aac_send_shutdown(aac);
+	fib_map_free(aac);
+	pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
+			aac->comm_phys);
+	kfree(aac->queues);
+
+	free_irq(pdev->irq, aac);
+	iounmap((void * )aac->regs.sa);
+	
+	kfree(aac->fibs);
+	
+	scsi_host_put(shost);
+	pci_disable_device(pdev);
+
+	/*
+	 * We don't decrement aac_count here because adapters can be unplugged
+	 * in a different order than they were detected.  If we're ever going
+	 * to overflow MAXIMUM_NUM_ADAPTERS we'll have to consider using a
+	 * bintmap of free aac_devices slots.
+	 */
+#if 0
+	aac_count--;
+#endif
 }
 
-static int aac_eh_reset(Scsi_Cmnd* cmd)
+static struct pci_driver aac_pci_driver = {
+	.name		= AAC_DRIVERNAME,
+	.id_table	= aac_pci_tbl,
+	.probe		= aac_probe_one,
+	.remove		= __devexit_p(aac_remove_one),
+};
+
+static int __init aac_init(void)
 {
-	printk("aacraid: hba reset failed\n");
-	return FAILED;
-}
+	int error;
+	
+	printk(KERN_INFO "Red Hat/Adaptec aacraid driver (%s %s)\n",
+			AAC_DRIVER_VERSION, AAC_DRIVER_BUILD_DATE);
 
+	error = pci_module_init(&aac_pci_driver);
+	if (error)
+		return error;
+
+	aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops);
+	if (aac_cfg_major < 0) {
+		printk(KERN_WARNING
+		       "aacraid: unable to register \"aac\" device.\n");
+	}
 
-/*===========================================================================
- * 
- *===========================================================================
- */
+	return 0;
+}
 
+static void __exit aac_exit(void)
+{
+	unregister_chrdev(aac_cfg_major, "aac");
+	pci_unregister_driver(&aac_pci_driver);
+}
 
-#include "scsi_module.c"
+module_init(aac_init);
+module_exit(aac_exit);
diff -Nru a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
--- a/drivers/scsi/aacraid/rx.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aacraid/rx.c	Thu Jan  8 23:00:24 2004
@@ -28,7 +28,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -41,8 +40,8 @@
 #include <linux/completion.h>
 #include <linux/interrupt.h>
 #include <asm/semaphore.h>
-#include "scsi.h"
-#include "hosts.h"
+
+#include <scsi/scsi_host.h>
 
 #include "aacraid.h"
 
diff -Nru a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
--- a/drivers/scsi/aacraid/sa.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aacraid/sa.c	Thu Jan  8 23:00:24 2004
@@ -28,7 +28,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -41,8 +40,8 @@
 #include <linux/completion.h>
 #include <linux/interrupt.h>
 #include <asm/semaphore.h>
-#include "scsi.h"
-#include "hosts.h"
+
+#include <scsi/scsi_host.h>
 
 #include "aacraid.h"
 
diff -Nru a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
--- a/drivers/scsi/aha152x.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aha152x.c	Thu Jan  8 23:00:23 2004
@@ -13,9 +13,16 @@
  * General Public License for more details.
  *
  *
- * $Id: aha152x.c,v 2.5 2002/04/14 11:24:53 fischer Exp $
+ * $Id: aha152x.c,v 2.6 2003/10/30 20:52:47 fischer Exp $
  *
  * $Log: aha152x.c,v $
+ * Revision 2.6  2003/10/30 20:52:47  fischer
+ * - interfaces changes for kernel 2.6
+ * - aha152x_probe_one introduced for pcmcia stub
+ * - fixed pnpdev handling
+ * - instead of allocation a new one, reuse command for request sense after check condition and reset
+ * - fixes race in is_complete
+ *
  * Revision 2.5  2002/04/14 11:24:53  fischer
  * - isapnp support
  * - abort fixed
@@ -330,6 +337,7 @@
 	syncneg		= 0x0100,	/* synchronous negotiation in progress */
 	aborting	= 0x0200,	/* ABORT is pending */
 	resetting	= 0x0400,	/* BUS DEVICE RESET is pending */
+	check_condition = 0x0800,	/* requesting sense after CHECK CONDITION */
 };
 
 MODULE_AUTHOR("Jürgen Fischer");
@@ -450,7 +458,8 @@
 		/* host lock */
 
 #if defined(AHA152X_DEBUG)
-	char *locker;	/* which function has the lock */
+	const char *locker;
+		/* which function has the lock */
 	int lockerl;	/* where did it get it */
 
 	int debug;	/* current debugging setting */
@@ -516,6 +525,10 @@
 
 	unsigned long io_port0;
 	unsigned long io_port1;
+
+#ifdef __ISAPNP__
+	struct pnp_dev *pnpdev;
+#endif
 };
 
 
@@ -525,7 +538,6 @@
  */
 struct aha152x_scdata {
 	Scsi_Cmnd *next;	/* next sc in queue */
-	Scsi_Cmnd *done;	/* done command */
 	struct semaphore *sem;	/* semaphore to block on */
 };
 
@@ -578,7 +590,6 @@
 
 #define SCDATA(SCpnt)		((struct aha152x_scdata *) (SCpnt)->host_scribble)
 #define SCNEXT(SCpnt)		SCDATA(SCpnt)->next
-#define SCDONE(SCpnt)		SCDATA(SCpnt)->done
 #define SCSEM(SCpnt)		SCDATA(SCpnt)->sem
 
 #define SG_ADDRESS(buffer)	((char *) (page_address((buffer)->page)+(buffer)->offset))
@@ -949,55 +960,47 @@
 	return IRQ_HANDLED;
 }
 
-#ifdef __ISAPNP__
-static struct pnp_dev *pnpdev[2];
-static int num_pnpdevs;
-#endif
 
 struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
 {
-	struct Scsi_Host *shost, *shpnt;
-	struct aha152x_hostdata *aha;
+	struct Scsi_Host *shpnt;
 
-	/* XXX: shpnt is needed for some broken macros */
-	shost = shpnt = scsi_register(&aha152x_driver_template,
-					sizeof(struct aha152x_hostdata));
-	if (!shost) {
+	shpnt = scsi_register(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
+	if (!shpnt) {
 		printk(KERN_ERR "aha152x: scsi_register failed\n");
 		return NULL;
 	}
 
-	aha = (struct aha152x_hostdata *)&shost->hostdata;
-	memset(aha, 0, sizeof(*aha));
+	memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
 
-	shost->io_port   = setup->io_port;
-	shost->n_io_port = IO_RANGE;
-	shost->irq       = setup->irq;
+	shpnt->io_port   = setup->io_port;
+	shpnt->n_io_port = IO_RANGE;
+	shpnt->irq       = setup->irq;
 
 	if (!setup->tc1550) {
-		aha->io_port0 = setup->io_port;
-		aha->io_port1 = setup->io_port;
+		HOSTIOPORT0 = setup->io_port;
+		HOSTIOPORT1 = setup->io_port;
 	} else {
-		aha->io_port0 = setup->io_port+0x10;
-		aha->io_port1 = setup->io_port-0x10;
+		HOSTIOPORT0 = setup->io_port+0x10;
+		HOSTIOPORT1 = setup->io_port-0x10;
 	}
 
-	spin_lock_init(&aha->lock);
-	aha->reconnect = setup->reconnect;
-	aha->synchronous = setup->synchronous;
-	aha->parity = setup->parity;
-	aha->delay = setup->delay;
-	aha->ext_trans = setup->ext_trans;
+	spin_lock_init(&QLOCK);
+	RECONNECT   = setup->reconnect;
+	SYNCHRONOUS = setup->synchronous;
+	PARITY      = setup->parity;
+	DELAY       = setup->delay;
+	EXT_TRANS   = setup->ext_trans;
 
 #if defined(AHA152X_DEBUG)
-	aha->debug = setup->debug;
+	HOSTDATA(shpnt)->debug = setup->debug;
 #endif
 
 	SETPORT(SCSIID, setup->scsiid << 4);
-	shost->this_id = setup->scsiid;
+	shpnt->this_id = setup->scsiid;
 
 	if (setup->reconnect)
-		shost->can_queue = AHA152X_MAXQUEUE;
+		shpnt->can_queue = AHA152X_MAXQUEUE;
 
 	/* RESET OUT */
 	printk("aha152x: resetting bus...\n");
@@ -1006,7 +1009,7 @@
 	SETPORT(SCSISEQ, 0);
 	mdelay(DELAY);
 
-	reset_ports(shost);
+	reset_ports(shpnt);
 
 	printk(KERN_INFO
 	       "aha152x%d%s: "
@@ -1019,43 +1022,41 @@
 	       "synchronous=%s, "
 	       "delay=%d, "
 	       "extended translation=%s\n",
-	       shost->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
+	       shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
 	       GETPORT(REV) & 0x7,
-	       shost->io_port, aha->io_port0, aha->io_port1,
-	       shost->irq,
-	       shost->this_id,
-	       aha->reconnect ? "enabled" : "disabled",
-	       aha->parity ? "enabled" : "disabled",
-	       aha->synchronous ? "enabled" : "disabled",
-	       aha->delay,
-	       aha->ext_trans ? "enabled" : "disabled");
+	       shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1,
+	       shpnt->irq,
+	       shpnt->this_id,
+	       RECONNECT ? "enabled" : "disabled",
+	       PARITY ? "enabled" : "disabled",
+	       SYNCHRONOUS ? "enabled" : "disabled",
+	       DELAY,
+	       EXT_TRANS ? "enabled" : "disabled");
 
-	if (!request_region(shost->io_port, IO_RANGE, "aha152x"))
+	if (!request_region(shpnt->io_port, IO_RANGE, "aha152x"))
 		goto out_unregister;
 
 	/* not expecting any interrupts */
 	SETPORT(SIMODE0, 0);
 	SETPORT(SIMODE1, 0);
 
-	if (request_irq(shost->irq, swintr, SA_INTERRUPT|SA_SHIRQ,
-			"aha152x", shost) < 0) {
-		printk(KERN_ERR "aha152x%d: driver needs an IRQ.\n", shost->host_no);
+	if (request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
+		printk(KERN_ERR "aha152x%d: driver needs an IRQ.\n", shpnt->host_no);
 		goto out_release_region;
 	}
 
-	aha->swint = 0;
+	HOSTDATA(shpnt)->swint = 0;
 
-	printk(KERN_INFO "aha152x%d: trying software interrupt, ",
-			 shost->host_no);
+	printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
 
 	/* need to have host registered before triggering any interrupt */
-	aha152x_host[registered_count] = shost;
+	aha152x_host[registered_count] = shpnt;
 	mb();
 	SETPORT(DMACNTRL0, SWINT|INTEN);
 	mdelay(1000);
-	free_irq(shost->irq, shost);
+	free_irq(shpnt->irq, shpnt);
 
-	if (!aha->swint) {
+	if (!HOSTDATA(shpnt)->swint) {
 		if (TESTHI(DMASTAT, INTSTAT)) {
 			printk("lost.\n");
 		} else {
@@ -1065,7 +1066,7 @@
 		SETPORT(DMACNTRL0, INTEN);
 
 		printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong.  "
-				"Please verify.\n", shost->host_no, shost->irq);
+				"Please verify.\n", shpnt->host_no, shpnt->irq);
 		goto out_unregister_host;
 	}
 	printk("ok.\n");
@@ -1075,20 +1076,18 @@
 	SETPORT(SSTAT0, 0x7f);
 	SETPORT(SSTAT1, 0xef);
 
-	if (request_irq(shost->irq, intr, SA_INTERRUPT|SA_SHIRQ,
-				"aha152x", shost) < 0) {
-		printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n",
-				shost->host_no);
+	if (request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
+		printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n", shpnt->host_no);
 		goto out_unregister_host;
 	}
-	return shost;	/* the pcmcia stub needs the return value; */
+	return shpnt;	/* the pcmcia stub needs the return value; */
 
 out_unregister_host:
 	aha152x_host[registered_count] = NULL;
 out_release_region:
-	release_region(shost->io_port, IO_RANGE);
+	release_region(shpnt->io_port, IO_RANGE);
 out_unregister:
-	scsi_unregister(shost);
+	scsi_unregister(shpnt);
 	return NULL;
 }
 
@@ -1097,9 +1096,9 @@
 	int i, j, ok;
 #if defined(AUTOCONF)
 	aha152x_config conf;
-#ifdef __ISAPNP__
-	struct pnp_dev *dev = NULL;
 #endif
+#ifdef __ISAPNP__
+	struct pnp_dev *dev=0, *pnpdev[2] = {0, 0};
 #endif
 
 	if (setup_count) {
@@ -1269,7 +1268,7 @@
 #if defined(AHA152X_DEBUG)
 		setup[setup_count].debug       = DEBUG_DEFAULT;
 #endif
-		pnpdev[num_pnpdevs++] = dev;
+		pnpdev[setup_count]            = dev;
 		printk (KERN_INFO
 			"aha152x: found ISAPnP AVA-1505A at io=0x%03x, irq=%d\n",
 			setup[setup_count].io_port, setup[setup_count].irq);
@@ -1277,7 +1276,6 @@
 	}
 #endif
 
-
 #if defined(AUTOCONF)
 	if (setup_count<ARRAY_SIZE(setup)) {
 #if !defined(SKIP_BIOSTEST)
@@ -1350,8 +1348,13 @@
 
 	for (i=0; i<setup_count; i++) {
 		aha152x_probe_one(&setup[i]);
-		if (aha152x_host[registered_count])
+		if (aha152x_host[registered_count]) {
+#ifdef __ISAPNP__
+			if(pnpdev[i])
+				HOSTDATA(aha152x_host[registered_count])->pnpdev=pnpdev[i];
+#endif
 			registered_count++;
+		}
 	}
 
 	return registered_count>0;
@@ -1367,9 +1370,10 @@
 		release_region(shpnt->io_port, IO_RANGE);
 
 #ifdef __ISAPNP__
-	while (num_pnpdevs--)
-		pnp_device_detach(pnpdev[num_pnpdevs]);
+	if (HOSTDATA(shpnt)->pnpdev)
+		pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
 #endif
+
 	scsi_unregister(shpnt);
 
 	return 0;
@@ -1418,7 +1422,7 @@
 /* 
  *  Queue a command and setup interrupts for a free bus.
  */
-static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int phase, Scsi_Cmnd *done_SC, void (*done)(Scsi_Cmnd *))
+static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int phase, void (*done)(Scsi_Cmnd *))
 {
 	struct Scsi_Host *shpnt = SCpnt->device->host;
 	unsigned long flags;
@@ -1438,14 +1442,21 @@
 	SCpnt->SCp.Message	= 0;
 	SCpnt->SCp.have_data_in	= 0;
 	SCpnt->SCp.sent_command	= 0;
-	SCpnt->host_scribble    = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
-	if(!SCpnt->host_scribble) {
-		printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
-		return FAILED;
+
+	if(SCpnt->SCp.phase & (resetting|check_condition)) {
+		if(SCpnt->host_scribble==0 || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
+			printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt));
+			return FAILED;
+		}
+	} else {
+		SCpnt->host_scribble    = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
+		if(SCpnt->host_scribble==0) {
+			printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
+			return FAILED;
+		}
 	}
 
 	SCNEXT(SCpnt)		= 0;
-	SCDONE(SCpnt)		= done_SC;
 	SCSEM(SCpnt)		= sem;
 
 	/* setup scratch area
@@ -1487,6 +1498,10 @@
 	return 0;
 }
 
+/*
+ *  queue a command
+ *
+ */
 static int aha152x_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
 {
 #if 0
@@ -1498,23 +1513,25 @@
 	}
 #endif
 
-	return aha152x_internal_queue(SCpnt, 0, 0, 0, done);
+	return aha152x_internal_queue(SCpnt, 0, 0, done);
 }
 
 
 /*
- *  run a command
+ *  
  *
  */
-static void internal_done(Scsi_Cmnd *SCpnt)
+static void reset_done(Scsi_Cmnd *SCpnt)
 {
 #if 0
 	struct Scsi_Host *shpnt = SCpnt->host;
-
-	DPRINTK(debug_eh, INFO_LEAD "internal_done called\n", CMDINFO(SCpnt));
+	DPRINTK(debug_eh, INFO_LEAD "reset_done called\n", CMDINFO(SCpnt));
 #endif
-	if(SCSEM(SCpnt))
+	if(SCSEM(SCpnt)) {
 		up(SCSEM(SCpnt));
+	} else {
+		printk(KERN_ERR "aha152x: reset_done w/o semaphore\n");
+	}
 }
 
 /*
@@ -1600,7 +1617,6 @@
 	struct Scsi_Host *shpnt = SCpnt->device->host;
 	DECLARE_MUTEX_LOCKED(sem);
 	struct timer_list timer;
-	Scsi_Cmnd *cmd;
 	int ret;
 
 #if defined(AHA152X_DEBUG)
@@ -1615,40 +1631,32 @@
 		return FAILED;
 	}
 
-	spin_unlock_irq(shpnt->host_lock);
-	cmd = scsi_get_command(SCpnt->device, GFP_ATOMIC);
-	if (!cmd) {
-		spin_lock_irq(shpnt->host_lock);
-		return FAILED;
-	}
-
-	cmd->cmd_len         = 0;
-	cmd->device->host    = SCpnt->device->host;
-	cmd->device->id      = SCpnt->device->id;
-	cmd->device->lun     = SCpnt->device->lun;
-	cmd->use_sg          = 0;
-	cmd->request_buffer  = 0;
-	cmd->request_bufflen = 0;
+	SCpnt->cmd_len         = 0;
+	SCpnt->use_sg          = 0;
+	SCpnt->request_buffer  = 0;
+	SCpnt->request_bufflen = 0;
 
 	init_timer(&timer);
 	timer.data     = (unsigned long) cmd;
 	timer.expires  = jiffies + 100*HZ;   /* 10s */
 	timer.function = (void (*)(unsigned long)) timer_expired;
 
-	aha152x_internal_queue(cmd, &sem, resetting, 0, internal_done);
-
+	aha152x_internal_queue(SCpnt, &sem, resetting, reset_done);
 	add_timer(&timer);
 	down(&sem);
-
 	del_timer(&timer);
 
-	if(cmd->SCp.phase & resetted) {
+	SCpnt->cmd_len         = SCpnt->old_cmd_len;
+	SCpnt->use_sg          = SCpnt->old_use_sg;
+  	SCpnt->request_buffer  = SCpnt->buffer;
+       	SCpnt->request_bufflen = SCpnt->bufflen;
+
+	if(SCpnt->SCp.phase & resetted) {
 		ret = SUCCESS;
 	} else {
 		ret = FAILED;
 	}
 
-	scsi_put_command(cmd);
 	spin_lock_irq(shpnt->host_lock);
 	return ret;
 }
@@ -1975,23 +1983,26 @@
 #if defined(AHA152X_STAT)
 		action++;
 #endif
-		if(SCDONE(DONE_SC)) {
-			Scsi_Cmnd *ptr=DONE_SC;
-			DONE_SC=SCDONE(DONE_SC);
-
+		if(DONE_SC->SCp.phase & check_condition) {
 #if 0
 			if(HOSTDATA(shpnt)->debug & debug_eh) {
-				printk(ERR_LEAD "received sense: ", CMDINFO(ptr));
+				printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
 				print_sense("bh", DONE_SC);
 			}
 #endif
 
+			/* restore old command */
+			memcpy((void *) DONE_SC->cmnd, (void *) DONE_SC->data_cmnd, sizeof(DONE_SC->data_cmnd));
+			DONE_SC->request_buffer  = DONE_SC->buffer;
+			DONE_SC->request_bufflen = DONE_SC->bufflen;
+			DONE_SC->use_sg          = DONE_SC->old_use_sg;
+			DONE_SC->cmd_len         = DONE_SC->old_cmd_len;
+
+			DONE_SC->SCp.Status = 0x02;
+
 			HOSTDATA(shpnt)->commands--;
 			if (!HOSTDATA(shpnt)->commands)
 				SETPORT(PORTA, 0);	/* turn led off */
-
-			kfree(ptr->host_scribble);
-			kfree(ptr);
 		} else if(DONE_SC->SCp.Status==0x02) {
 #if defined(AHA152X_STAT)
 			HOSTDATA(shpnt)->busfree_with_check_condition++;
@@ -2001,42 +2012,30 @@
 #endif
 
 			if(!(DONE_SC->SCp.Status & not_issued)) {
-				Scsi_Cmnd *cmnd = kmalloc(sizeof(Scsi_Cmnd), GFP_ATOMIC);
-
-				if(cmnd) {
-					Scsi_Cmnd *ptr=DONE_SC;
-					DONE_SC=0;
-
 #if 0
-					DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
+				DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(DONE_SC));
 #endif
 
-					cmnd->cmnd[0]         = REQUEST_SENSE;
-					cmnd->cmnd[1]         = 0;
-					cmnd->cmnd[2]         = 0;
-					cmnd->cmnd[3]         = 0;
-					cmnd->cmnd[4]         = sizeof(ptr->sense_buffer);
-					cmnd->cmnd[5]         = 0;
-					cmnd->cmd_len	      = 6;
-					cmnd->device->host    = ptr->device->host;
-					cmnd->device->id      = ptr->device->id;
-					cmnd->device->lun     = ptr->device->lun;
-					cmnd->use_sg          = 0; 
-					cmnd->request_buffer  = ptr->sense_buffer;
-					cmnd->request_bufflen = sizeof(ptr->sense_buffer);
+				DONE_SC->cmnd[0]         = REQUEST_SENSE;
+				DONE_SC->cmnd[1]         = 0;
+				DONE_SC->cmnd[2]         = 0;
+				DONE_SC->cmnd[3]         = 0;
+				DONE_SC->cmnd[4]         = sizeof(DONE_SC->sense_buffer);
+				DONE_SC->cmnd[5]         = 0;
+				DONE_SC->cmd_len         = 6;
+				DONE_SC->use_sg          = 0; 
+				DONE_SC->request_buffer  = DONE_SC->sense_buffer;
+				DONE_SC->request_bufflen = sizeof(DONE_SC->sense_buffer);
 			
-					DO_UNLOCK(flags);
-					aha152x_internal_queue(cmnd, 0, 0, ptr, internal_done);
-					DO_LOCK(flags);
-				} else {
-					printk(ERR_LEAD "allocation failed\n", CMDINFO(CURRENT_SC));
-					if(cmnd)
-						kfree(cmnd);
-				}
+				DO_UNLOCK(flags);
+				aha152x_internal_queue(DONE_SC, 0, check_condition, DONE_SC->scsi_done);
+				DO_LOCK(flags);
+
+				DONE_SC=0;
 			} else {
 #if 0
 				DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
-#endif				
+#endif
 			}
 		}
 
@@ -2946,13 +2945,12 @@
 	int pending;
 
 	DO_LOCK(flags);
-	if(HOSTDATA(shpnt)->in_intr!=0) {
+	if(HOSTDATA(shpnt)->in_intr) {
 		DO_UNLOCK(flags);
 		/* aha152x_error never returns.. */
 		aha152x_error(shpnt, "bottom-half already running!?");
 	}
 	HOSTDATA(shpnt)->in_intr++;
-	DO_UNLOCK(flags);
 
 	/*
 	 * loop while there are interrupt conditions pending
@@ -2960,6 +2958,8 @@
 	 */
 	do {
 		unsigned long start = jiffies;
+		DO_UNLOCK(flags);
+
 		dataphase=update_state(shpnt);
 
 		DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
@@ -3035,7 +3035,6 @@
 			HOSTDATA(shpnt)->count_trans[STATE]++;
 		HOSTDATA(shpnt)->time[STATE] += jiffies-start;
 #endif
-		DO_UNLOCK(flags);
 
 		DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
 	} while(pending);
@@ -3044,7 +3043,6 @@
 	 * enable interrupts and leave bottom-half
 	 *
 	 */
-	DO_LOCK(flags);
 	HOSTDATA(shpnt)->in_intr--;
 	SETBITS(DMACNTRL0, INTEN);
 	DO_UNLOCK(flags);
diff -Nru a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c
--- a/drivers/scsi/aha1740.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aha1740.c	Thu Jan  8 23:00:23 2004
@@ -27,6 +27,9 @@
  * Converted to EISA and generic DMA APIs by Marc Zyngier
  * <maz@wild-wind.fr.eu.org>, 4/2003.
  *
+ * Shared interrupt support added by Rask Ingemann Lambertsen
+ * <rask@sygehus.dk>, 10/2003
+ *
  * For the avoidance of doubt the "preferred form" of this code is one which
  * is in an open non patent encumbered format. Where cryptographic key signing
  * forms part of the process of creating an executable the information
@@ -518,15 +521,17 @@
 	return 0;
 }
 
-/* Query the board for its irq_level.  Nothing else matters
+/* Query the board for its irq_level and irq_type.  Nothing else matters
    in enhanced mode on an EISA bus. */
 
 static void aha1740_getconfig(unsigned int base, unsigned int *irq_level,
+			      unsigned int *irq_type,
 			      unsigned int *translation)
 {
 	static int intab[] = { 9, 10, 11, 12, 0, 14, 15, 0 };
 
 	*irq_level = intab[inb(INTDEF(base)) & 0x7];
+	*irq_type  = (inb(INTDEF(base)) & 0x8) >> 3;
 	*translation = inb(RESV1(base)) & 0x1;
 	outb(inb(INTDEF(base)) | 0x10, INTDEF(base));
 }
@@ -583,7 +588,7 @@
 static int aha1740_probe (struct device *dev)
 {
 	int slotbase;
-	unsigned int irq_level, translation;
+	unsigned int irq_level, irq_type, translation;
 	struct Scsi_Host *shpnt;
 	struct aha1740_hostdata *host;
 	struct eisa_device *edev = to_eisa_device (dev);
@@ -595,15 +600,15 @@
 		return -EBUSY;
 	if (!aha1740_test_port(slotbase))
 		goto err_release_region;
-	aha1740_getconfig(slotbase,&irq_level,&translation);
+	aha1740_getconfig(slotbase,&irq_level,&irq_type,&translation);
 	if ((inb(G2STAT(slotbase)) &
 	     (G2STAT_MBXOUT|G2STAT_BUSY)) != G2STAT_MBXOUT) {
 		/* If the card isn't ready, hard reset it */
 		outb(G2CNTRL_HRST, G2CNTRL(slotbase));
 		outb(0, G2CNTRL(slotbase));
 	}
-	printk(KERN_INFO "Configuring slot %d at IO:%x, IRQ %d\n",
-	       edev->slot, slotbase, irq_level);
+	printk(KERN_INFO "Configuring slot %d at IO:%x, IRQ %u (%s)\n",
+	       edev->slot, slotbase, irq_level, irq_type ? "edge" : "level");
 	printk(KERN_INFO "aha174x: Extended translation %sabled.\n",
 	       translation ? "en" : "dis");
 	shpnt = scsi_host_alloc(&aha1740_template,
@@ -629,7 +634,8 @@
 	}
 	
 	DEB(printk("aha1740_probe: enable interrupt channel %d\n",irq_level));
-	if (request_irq(irq_level,aha1740_intr_handle,0,"aha1740",shpnt)) {
+	if (request_irq(irq_level,aha1740_intr_handle,irq_type ? 0 : SA_SHIRQ,
+			"aha1740",shpnt)) {
 		printk(KERN_ERR "aha1740_probe: Unable to allocate IRQ %d.\n",
 		       irq_level);
 		goto err_unmap;
diff -Nru a/drivers/scsi/aic7xxx/Kconfig.aic7xxx b/drivers/scsi/aic7xxx/Kconfig.aic7xxx
--- a/drivers/scsi/aic7xxx/Kconfig.aic7xxx	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/Kconfig.aic7xxx	Thu Jan  8 23:00:23 2004
@@ -1,9 +1,10 @@
 #
 # AIC7XXX and AIC79XX 2.5.X Kernel configuration File.
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#6 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#7 $
 #
 config SCSI_AIC7XXX
 	tristate "Adaptec AIC7xxx Fast -> U160 support (New Driver)"
+	depends on PCI || EISA
 	---help---
 	This driver supports all of Adaptec's Fast through Ultra 160 PCI
 	based SCSI controllers as well as the aic7770 based EISA and VLB
@@ -50,7 +51,7 @@
 
 config AIC7XXX_PROBE_EISA_VL
 	bool "Probe for EISA and VL AIC7XXX Adapters"
-	depends on SCSI_AIC7XXX
+	depends on SCSI_AIC7XXX && EISA
 	help
 	Probe for EISA and VLB Aic7xxx controllers.  In many newer systems,
 	the invasive probes necessary to detect these controllers can cause
diff -Nru a/drivers/scsi/aic7xxx/Makefile b/drivers/scsi/aic7xxx/Makefile
--- a/drivers/scsi/aic7xxx/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/Makefile	Thu Jan  8 23:00:24 2004
@@ -1,7 +1,7 @@
 #
 # Makefile for the Linux aic7xxx SCSI driver.
 #
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#6 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#7 $
 #
 
 # Let kbuild descend into aicasm when cleaning
@@ -12,15 +12,15 @@
 
 # Core Fast -> U160 files
 aic7xxx-y					+= aic7xxx_core.o	\
-						   aic7xxx_93cx6.o	\
-						   aic7770.o
+						   aic7xxx_93cx6.o
+aic7xxx-$(CONFIG_EISA)				+= aic7770.o
 aic7xxx-$(CONFIG_PCI)				+= aic7xxx_pci.o
 aic7xxx-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT)	+= aic7xxx_reg_print.o
 
 # Platform Specific Fast -> U160 Files
 aic7xxx-y					+= aic7xxx_osm.o	\
-						   aic7xxx_proc.o	\
-						   aic7770_osm.o
+						   aic7xxx_proc.o
+aic7xxx-$(CONFIG_EISA)				+= aic7770_osm.o
 aic7xxx-$(CONFIG_PCI)				+= aic7xxx_osm_pci.o
 
 # Core U320 files
@@ -33,7 +33,10 @@
 						   aic79xx_proc.o	\
 						   aic79xx_osm_pci.o
 
-EXTRA_CFLAGS += -Idrivers/scsi -Werror
+EXTRA_CFLAGS += -Idrivers/scsi
+ifdef WARNINGS_BECOME_ERRORS
+EXTRA_CFLAGS += -Werror
+endif
 #EXTRA_CFLAGS += -g
 
 # Files generated that shall be removed upon make clean
diff -Nru a/drivers/scsi/aic7xxx/aic7770.c b/drivers/scsi/aic7xxx/aic7770.c
--- a/drivers/scsi/aic7xxx/aic7770.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic7770.c	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#30 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#32 $
  *
  * $FreeBSD$
  */
@@ -67,8 +67,7 @@
 static ahc_device_setup_t ahc_aic7770_EISA_setup;;
 static ahc_device_setup_t ahc_aic7770_setup;
 
-
-struct aic7770_identity aic7770_ident_table [] =
+struct aic7770_identity aic7770_ident_table[] =
 {
 	{
 		ID_AHA_274x,
@@ -83,6 +82,12 @@
 		ahc_aic7770_VL_setup
 	},
 	{
+		ID_AHA_284x,
+		0xFFFFFFFE,
+		"Adaptec 284X SCSI adapter (BIOS Disabled)",
+		ahc_aic7770_VL_setup
+	},
+	{
 		ID_OLV_274x,
 		0xFFFFFFFF,
 		"Adaptec (Olivetti OEM) 274X SCSI adapter",
@@ -154,7 +159,7 @@
 	ahc->bus_suspend = aic7770_suspend;
 	ahc->bus_resume = aic7770_resume;
 
-	error = ahc_reset(ahc);
+	error = ahc_reset(ahc, /*reinit*/FALSE);
 	if (error != 0)
 		return (error);
 
diff -Nru a/drivers/scsi/aic7xxx/aic7770_osm.c b/drivers/scsi/aic7xxx/aic7770_osm.c
--- a/drivers/scsi/aic7xxx/aic7770_osm.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic7770_osm.c	Thu Jan  8 23:00:24 2004
@@ -1,7 +1,7 @@
 /*
  * Linux driver attachment glue for aic7770 based controllers.
  *
- * Copyright (c) 2000-2001 Adaptec Inc.
+ * Copyright (c) 2000-2003 Adaptec Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,27 +36,90 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#13 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#14 $
  */
 
 #include "aic7xxx_osm.h"
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#include <linux/device.h>
+#include <linux/eisa.h>
+
+#define EISA_MFCTR_CHAR0(ID) (char)(((ID>>26) & 0x1F) | '@')  /* Bits 26-30 */
+#define EISA_MFCTR_CHAR1(ID) (char)(((ID>>21) & 0x1F) | '@')  /* Bits 21-25 */
+#define EISA_MFCTR_CHAR2(ID) (char)(((ID>>16) & 0x1F) | '@')  /* Bits 16-20 */
+#define EISA_PRODUCT_ID(ID)  (short)((ID>>4)  & 0xFFF)        /* Bits  4-15 */
+#define EISA_REVISION_ID(ID) (uint8_t)(ID & 0x0F)             /* Bits  0-3  */
+
+static int aic7770_eisa_dev_probe(struct device *dev);
+static int aic7770_eisa_dev_remove(struct device *dev);
+static struct eisa_driver aic7770_driver = {
+	.driver = {
+		.name   = "aic7xxx",
+		.probe  = aic7770_eisa_dev_probe,
+		.remove = aic7770_eisa_dev_remove,
+	}
+};
+
+typedef  struct device *aic7770_dev_t;
+#else
 #define MINSLOT			1
 #define NUMSLOTS		16
 #define IDOFFSET		0x80
 
-int
-aic7770_linux_probe(Scsi_Host_Template *template)
+typedef void *aic7770_dev_t;
+#endif
+
+static int aic7770_linux_config(struct aic7770_identity *entry,
+				aic7770_dev_t dev, u_int eisaBase);
+
+void
+ahc_linux_eisa_init(void)
 {
-#if defined(__i386__) || defined(__alpha__)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	struct eisa_device_id *eid;
+	struct aic7770_identity *id;
+	int i;
+
+	if (aic7xxx_probe_eisa_vl == 0)
+		return;
+
+	/*
+	 * Linux requires the EISA IDs to be specified in
+	 * the EISA ID string format.  Perform the conversion
+	 * and setup a table with a NUL terminal entry.
+	 */
+	aic7770_driver.id_table = malloc(sizeof(struct eisa_device_id) *
+					 (ahc_num_aic7770_devs + 1),
+					 M_DEVBUF, M_NOWAIT);
+	if (aic7770_driver.id_table == NULL)
+		return;
+
+	for (eid = (struct eisa_device_id *)aic7770_driver.id_table,
+	     id = aic7770_ident_table, i = 0;
+	     i < ahc_num_aic7770_devs; eid++, id++, i++) {
+
+		sprintf(eid->sig, "%c%c%c%03X%01X",
+			EISA_MFCTR_CHAR0(id->full_id),
+			EISA_MFCTR_CHAR1(id->full_id),
+			EISA_MFCTR_CHAR2(id->full_id),
+			EISA_PRODUCT_ID(id->full_id),
+			EISA_REVISION_ID(id->full_id));
+		eid->driver_data = i;
+	}
+	eid->sig[0] = 0;
+
+	eisa_driver_register(&aic7770_driver);
+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */
 	struct aic7770_identity *entry;
-	struct ahc_softc *ahc;
-	int i, slot;
-	int eisaBase;
-	int found;
+	u_int  slot;
+	u_int  eisaBase;
+	u_int  i;
+
+	if (aic7xxx_probe_eisa_vl == 0)
+		return;
 
 	eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET;
-	found = 0;
 	for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) {
 		uint32_t eisa_id;
 		size_t	 id_size;
@@ -83,45 +146,64 @@
 			continue;  /* no EISA card in slot */
 
 		entry = aic7770_find_device(eisa_id);
-		if (entry != NULL) {
-			char	 buf[80];
-			char	*name;
-			int	 error;
-
-			/*
-			 * Allocate a softc for this card and
-			 * set it up for attachment by our
-			 * common detect routine.
-			 */
-			sprintf(buf, "ahc_eisa:%d", slot);
-			name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
-			if (name == NULL)
-				break;
-			strcpy(name, buf);
-			ahc = ahc_alloc(template, name);
-			if (ahc == NULL) {
-				/*
-				 * If we can't allocate this one,
-				 * chances are we won't be able to
-				 * allocate future card structures.
-				 */
-				break;
-			}
-			error = aic7770_config(ahc, entry, eisaBase);
-			if (error != 0) {
-				ahc->bsh.ioport = 0;
-				ahc_free(ahc);
-				continue;
-			}
-			found++;
-		}
+		if (entry != NULL)
+			aic7770_linux_config(entry, NULL, eisaBase);
 	}
-	return (found);
-#else
-	return (0);
 #endif
 }
 
+void
+ahc_linux_eisa_exit(void)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	if (aic7xxx_probe_eisa_vl == 0)
+		return;
+
+	if (aic7770_driver.id_table != NULL) {
+		eisa_driver_unregister(&aic7770_driver);
+		free(aic7770_driver.id_table, M_DEVBUF);
+	}
+#endif
+}
+
+static int
+aic7770_linux_config(struct aic7770_identity *entry, aic7770_dev_t dev,
+		     u_int eisaBase)
+{
+	struct	ahc_softc *ahc;
+	char	buf[80];
+	char   *name;
+	int	error;
+
+	/*
+	 * Allocate a softc for this card and
+	 * set it up for attachment by our
+	 * common detect routine.
+	 */
+	sprintf(buf, "ahc_eisa:%d", eisaBase >> 12);
+	name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
+	if (name == NULL)
+		return (ENOMEM);
+	strcpy(name, buf);
+	ahc = ahc_alloc(&aic7xxx_driver_template, name);
+	if (ahc == NULL) {
+		free(name, M_DEVBUF);
+		return (ENOMEM);
+	}
+	error = aic7770_config(ahc, entry, eisaBase);
+	if (error != 0) {
+		ahc->bsh.ioport = 0;
+		ahc_free(ahc);
+		return (error);
+	}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	dev->driver_data = (void *)ahc;
+	if (aic7xxx_detect_complete)
+		error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
+#endif
+	return (error);
+}
+
 int
 aic7770_map_registers(struct ahc_softc *ahc, u_int port)
 {
@@ -129,6 +211,8 @@
 	 * Lock out other contenders for our i/o space.
 	 */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
+	if (check_region(port, AHC_EISA_IOSIZE) != 0)
+		return (ENOMEM);
 	request_region(port, AHC_EISA_IOSIZE, "aic7xxx");
 #else
 	if (request_region(port, AHC_EISA_IOSIZE, "aic7xxx") == 0)
@@ -155,3 +239,41 @@
 	
 	return (-error);
 }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+static int
+aic7770_eisa_dev_probe(struct device *dev)
+{
+	struct eisa_device *edev;
+
+	edev = to_eisa_device(dev);
+	return (aic7770_linux_config(aic7770_ident_table + edev->id.driver_data,
+				    dev, edev->base_addr+AHC_EISA_SLOT_OFFSET));
+}
+
+static int
+aic7770_eisa_dev_remove(struct device *dev)
+{
+	struct ahc_softc *ahc;
+	u_long l;
+
+	/*
+	 * We should be able to just perform
+	 * the free directly, but check our
+	 * list for extra sanity.
+	 */
+	ahc_list_lock(&l);
+	ahc = ahc_find_softc((struct ahc_softc *)dev->driver_data);
+	if (ahc != NULL) {
+		u_long s;
+
+		ahc_lock(ahc, &s);
+		ahc_intr_enable(ahc, FALSE);
+		ahc_unlock(ahc, &s);
+		ahc_free(ahc);
+	}
+	ahc_list_unlock(&l);
+
+	return (0);
+}
+#endif
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h
--- a/drivers/scsi/aic7xxx/aic79xx.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx.h	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#90 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#95 $
  *
  * $FreeBSD$
  */
@@ -229,8 +229,10 @@
 	AHD_RTI			= 0x04000,/* Retained Training Support */
 	AHD_NEW_IOCELL_OPTS	= 0x08000,/* More Signal knobs in the IOCELL */
 	AHD_NEW_DFCNTRL_OPTS	= 0x10000,/* SCSIENWRDIS bit */
+	AHD_FAST_CDB_DELIVERY	= 0x20000,/* CDB acks released to Output Sync */
 	AHD_REMOVABLE		= 0x00000,/* Hot-Swap supported - None so far*/
 	AHD_AIC7901_FE		= AHD_FENONE,
+	AHD_AIC7901A_FE		= AHD_FENONE,
 	AHD_AIC7902_FE		= AHD_MULTI_FUNC
 } ahd_feature;
 
@@ -372,7 +374,8 @@
 	AHD_HP_BOARD	      = 0x100000,
 	AHD_RESET_POLL_ACTIVE = 0x200000,
 	AHD_UPDATE_PEND_CMDS  = 0x400000,
-	AHD_RUNNING_QOUTFIFO  = 0x800000
+	AHD_RUNNING_QOUTFIFO  = 0x800000,
+	AHD_HAD_FIRST_SEL     = 0x1000000
 } ahd_flag;
 
 /************************* Hardware  SCB Definition ***************************/
@@ -494,21 +497,21 @@
  *	  transfer.
  */ 
 #define SG_PTR_MASK	0xFFFFFFF8
-/*16*/	uint64_t dataptr;
-/*24*/	uint32_t datacnt;	/* Byte 3 is spare. */
-/*28*/	uint32_t sgptr;
-/*32*/	uint32_t hscb_busaddr;
-/*36*/	uint32_t next_hscb_busaddr;
-/*40*/	uint8_t  control;	/* See SCB_CONTROL in aic79xx.reg for details */
-/*41*/	uint8_t	 scsiid;	/*
+/*16*/	uint16_t tag;		/* Reused by Sequencer. */
+/*18*/	uint8_t  control;	/* See SCB_CONTROL in aic79xx.reg for details */
+/*19*/	uint8_t	 scsiid;	/*
 				 * Selection out Id
 				 * Our Id (bits 0-3) Their ID (bits 4-7)
 				 */
-/*42*/	uint8_t  lun;
-/*43*/	uint8_t  task_attribute;
-/*44*/	uint8_t  cdb_len;
-/*45*/	uint8_t  task_management;
-/*46*/	uint16_t tag;		/* Reused by Sequencer. */
+/*20*/	uint8_t  lun;
+/*21*/	uint8_t  task_attribute;
+/*22*/	uint8_t  cdb_len;
+/*23*/	uint8_t  task_management;
+/*24*/	uint64_t dataptr;
+/*32*/	uint32_t datacnt;	/* Byte 3 is spare. */
+/*36*/	uint32_t sgptr;
+/*40*/	uint32_t hscb_busaddr;
+/*44*/	uint32_t next_hscb_busaddr;
 /********** Long lun field only downloaded for full 8 byte lun support ********/
 /*48*/  uint8_t	 pkt_long_lun[8];
 /******* Fields below are not Downloaded (Sequencer may use for scratch) ******/
@@ -1379,13 +1382,13 @@
 void			 ahd_free_scb(struct ahd_softc *ahd, struct scb *scb);
 void			 ahd_alloc_scbs(struct ahd_softc *ahd);
 void			 ahd_free(struct ahd_softc *ahd);
-int			 ahd_reset(struct ahd_softc *ahd);
+int			 ahd_reset(struct ahd_softc *ahd, int reinit);
 void			 ahd_shutdown(void *arg);
-int			ahd_write_flexport(struct ahd_softc *ahd,
-					   u_int addr, u_int value);
-int			ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
-					  uint8_t *value);
-int			ahd_wait_flexport(struct ahd_softc *ahd);
+int			 ahd_write_flexport(struct ahd_softc *ahd,
+					    u_int addr, u_int value);
+int			 ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
+					   uint8_t *value);
+int			 ahd_wait_flexport(struct ahd_softc *ahd);
 
 /*************************** Interrupt Services *******************************/
 void			ahd_pci_intr(struct ahd_softc *ahd);
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.reg b/drivers/scsi/aic7xxx/aic79xx.reg
--- a/drivers/scsi/aic7xxx/aic79xx.reg	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx.reg	Thu Jan  8 23:00:24 2004
@@ -39,7 +39,7 @@
  *
  * $FreeBSD$
  */
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $"
 
 /*
  * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -1377,7 +1377,10 @@
 	address			0x030
 	access_mode	RW
 	modes		M_CFG
+	mask		ILUNLEN	0x0F
+	mask		TLUNLEN	0xF0
 }
+const LUNLEN_SINGLE_LEVEL_LUN 0xF
 
 /*
  * CDB Limit
@@ -3797,32 +3800,8 @@
 		size	4
 		alias	SCB_NEXT_COMPLETE
 	}
-	SCB_DATAPTR {
-		size	8
-	}
-	SCB_DATACNT {
-		/*
-		 * The last byte is really the high address bits for
-		 * the data address.
-		 */
-		size	4
-		field	SG_LAST_SEG		0x80	/* In the fourth byte */
-		field	SG_HIGH_ADDR_BITS	0x7F	/* In the fourth byte */
-	}
-	SCB_SGPTR {
-		size	4
-		field	SG_STATUS_VALID	0x04	/* In the first byte */
-		field	SG_FULL_RESID	0x02	/* In the first byte */
-		field	SG_LIST_NULL	0x01	/* In the first byte */
-	}
-	SCB_BUSADDR {
-		size	4
-	}
-	SCB_NEXT {
-		alias	SCB_NEXT_SCB_BUSADDR
-		size	2
-	}
-	SCB_NEXT2 {
+	SCB_TAG {
+		alias	SCB_FIFO_USE_COUNT
 		size	2
 	}
 	SCB_CONTROL {
@@ -3859,8 +3838,32 @@
 	SCB_TASK_MANAGEMENT {
 		size	1
 	}
-	SCB_TAG {
-		alias	SCB_FIFO_USE_COUNT
+	SCB_DATAPTR {
+		size	8
+	}
+	SCB_DATACNT {
+		/*
+		 * The last byte is really the high address bits for
+		 * the data address.
+		 */
+		size	4
+		field	SG_LAST_SEG		0x80	/* In the fourth byte */
+		field	SG_HIGH_ADDR_BITS	0x7F	/* In the fourth byte */
+	}
+	SCB_SGPTR {
+		size	4
+		field	SG_STATUS_VALID	0x04	/* In the first byte */
+		field	SG_FULL_RESID	0x02	/* In the first byte */
+		field	SG_LIST_NULL	0x01	/* In the first byte */
+	}
+	SCB_BUSADDR {
+		size	4
+	}
+	SCB_NEXT {
+		alias	SCB_NEXT_SCB_BUSADDR
+		size	2
+	}
+	SCB_NEXT2 {
 		size	2
 	}
 	SCB_SPARE {
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.seq b/drivers/scsi/aic7xxx/aic79xx.seq
--- a/drivers/scsi/aic7xxx/aic79xx.seq	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx.seq	Thu Jan  8 23:00:24 2004
@@ -40,7 +40,7 @@
  * $FreeBSD$
  */
 
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#99 $"
 PATCH_ARG_LIST = "struct ahd_softc *ahd"
 PREFIX = "ahd_"
 
@@ -163,8 +163,8 @@
 idle_loop_cchan:
 	SET_MODE(M_CCHAN, M_CCHAN)
 	test	QOFF_CTLSTA, HS_MAILBOX_ACT jz	hs_mailbox_empty;
-	mov	LOCAL_HS_MAILBOX, HS_MAILBOX;
 	or	QOFF_CTLSTA, HS_MAILBOX_ACT;
+	mov	LOCAL_HS_MAILBOX, HS_MAILBOX;
 hs_mailbox_empty:
 BEGIN_CRITICAL;
 	test	CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
@@ -276,7 +276,7 @@
 	 * knows the correct location to store the SCB.
 	 * Set it to zero before processing the SCB.
 	 */
-	mov	SCB_FIFO_USE_COUNT, ALLZEROS;
+	clr	SCB_FIFO_USE_COUNT;
 	/* Update the next SCB address to download. */
 	bmov	NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
 	mvi	SCB_NEXT[1], SCB_LIST_NULL;
@@ -492,12 +492,13 @@
 select_in:
 	if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
 		/*
-		 * This exposes a window whereby a
-		 * busfree just after a selection will
-		 * be missed, but there is no other safe
-		 * way to enable busfree detection if
-		 * the busfreerev function is broken.
+		 * Test to ensure that the bus has not
+		 * already gone free prior to clearing
+		 * any stale busfree status.  This avoids
+		 * a window whereby a busfree just after
+		 * a selection could be missed.
 		 */
+		test	SCSISIGI, BSYI jz . + 2;
 		mvi	CLRSINT1,CLRBUSFREE;
 		or	SIMODE1, ENBUSFREE;
 	}
@@ -582,9 +583,6 @@
 		bmov	CURRSCB, SCBPTR, 2;
 curscb_ww_done:
 	} else {
-		/*
-		 * Untested - Verify with Rev B.
-		 */
 		bmov	SCBPTR, CURRSCB, 2;
 	}
 
@@ -651,12 +649,13 @@
 	and     SCSISEQ0, ~ENSELO;
 	if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
 		/*
-		 * This exposes a window whereby a
-		 * busfree just after a selection will
-		 * be missed, but there is no other safe
-		 * way to enable busfree detection if
-		 * the busfreerev function is broken.
+		 * Test to ensure that the bus has not
+		 * already gone free prior to clearing
+		 * any stale busfree status.  This avoids
+		 * a window whereby a busfree just after
+		 * a selection could be missed.
 		 */
+		test	SCSISIGI, BSYI jz . + 2;
 		mvi	CLRSINT1,CLRBUSFREE;
 		or	SIMODE1, ENBUSFREE;
 	}
@@ -729,13 +728,38 @@
 	mvi	DFCNTRL, SCSIEN;
 p_command_xfer:
 	and	SEQ_FLAGS, ~NO_CDB_SENT;
-	test	DFCNTRL, SCSIEN jnz .;
+	if ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0) {
+		/*
+		 * To speed up CDB delivery in Rev B, all CDB acks
+		 * are "released" to the output sync as soon as the
+		 * command phase starts.  There is only one problem
+		 * with this approach.  If the target changes phase
+		 * before all data are sent, we have left over acks
+		 * that can go out on the bus in a data phase.  Due
+		 * to other chip contraints, this only happens if
+		 * the target goes to data-in, but if the acks go
+		 * out before we can test SDONE, we'll think that
+		 * the transfer has completed successfully.  Work
+		 * around this by taking advantage of the 400ns or
+		 * 800ns dead time between command phase and the REQ
+		 * of the new phase.  If the transfer has completed
+		 * successfully, SCSIEN should fall *long* before we
+		 * see a phase change.  We thus treat any phasemiss
+		 * that occurs before SCSIEN falls as an incomplete
+		 * transfer.
+		 */
+		test	SSTAT1, PHASEMIS jnz p_command_xfer_failed;
+		test	DFCNTRL, SCSIEN jnz . - 1;
+	} else {
+		test	DFCNTRL, SCSIEN jnz .;
+	}
 	/*
 	 * DMA Channel automatically disabled.
 	 * Don't allow a data phase if the command
 	 * was not fully transferred.
 	 */
 	test	SSTAT2, SDONE jnz ITloop;
+p_command_xfer_failed:
 	or	SEQ_FLAGS, NO_CDB_SENT;
 	jmp	ITloop;
 
@@ -1959,12 +1983,14 @@
 	test	SSTAT0, SELDO jnz return;
 	mvi	SCBPTR[1], SCB_LIST_NULL;
 unexpected_nonpkt_phase:
-	test	MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1)) jnz . + 3;
+	test	MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
+		jnz unexpected_nonpkt_mode_cleared;
 SET_SRC_MODE	M_DFF0;
 SET_DST_MODE	M_DFF0;
 	or	LONGJMP_ADDR[1], INVALID_ADDR;
 	dec	SCB_FIFO_USE_COUNT;
 	mvi	DFFSXFRCTL, CLRCHN;
+unexpected_nonpkt_mode_cleared:
 	mvi	CLRSINT2, CLRNONPACKREQ;
 	test	SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase;
 	SET_SEQINTCODE(ENTERING_NONPACK)
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c
--- a/drivers/scsi/aic7xxx/aic79xx_core.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_core.c	Thu Jan  8 23:00:23 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#194 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#202 $
  *
  * $FreeBSD$
  */
@@ -224,6 +224,11 @@
 static void		ahd_download_instr(struct ahd_softc *ahd,
 					   u_int instrptr, uint8_t *dconsts);
 static int		ahd_probe_stack_size(struct ahd_softc *ahd);
+static int		ahd_scb_active_in_fifo(struct ahd_softc *ahd,
+					       struct scb *scb);
+static void		ahd_run_data_fifo(struct ahd_softc *ahd,
+					  struct scb *scb);
+
 #ifdef AHD_TARGET_MODE
 static void		ahd_queue_lstate_event(struct ahd_softc *ahd,
 					       struct ahd_tmode_lstate *lstate,
@@ -328,10 +333,7 @@
 	/* Always allow reselection */
 	ahd_outb(ahd, SCSISEQ1,
 		 ahd_inb(ahd, SCSISEQ_TEMPLATE) & (ENSELI|ENRSELI|ENAUTOATNP));
-	/* Ensure that no DMA operations are in progress */
 	ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
-	ahd_outb(ahd, SCBHCNT, 0);
-	ahd_outb(ahd, CCSCBCTL, CCSCBRESET);
 	ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
 	ahd_unpause(ahd);
 }
@@ -371,14 +373,92 @@
 	u_int		next_scbid;
 
 	saved_modes = ahd_save_modes(ahd);
-	ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
+
+	/*
+	 * Complete any SCBs that just finished being
+	 * DMA'ed into the qoutfifo.
+	 */
+	ahd_run_qoutfifo(ahd);
+
+	/*
+	 * Flush the good status FIFO for compelted packetized commands.
+	 */
+	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 	saved_scbptr = ahd_get_scbptr(ahd);
+	while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
+		u_int fifo_mode;
+		u_int i;
+		
+		scbid = (ahd_inb(ahd, GSFIFO+1) << 8)
+		      | ahd_inb(ahd, GSFIFO);
+		scb = ahd_lookup_scb(ahd, scbid);
+		if (scb == NULL) {
+			printf("%s: Warning - GSFIFO SCB %d invalid\n",
+			       ahd_name(ahd), scbid);
+			continue;
+		}
+		/*
+		 * Determine if this transaction is still active in
+		 * any FIFO.  If it is, we must flush that FIFO to
+		 * the host before completing the  command.
+		 */
+		fifo_mode = 0;
+		for (i = 0; i < 2; i++) {
+			/* Toggle to the other mode. */
+			fifo_mode ^= 1;
+			ahd_set_modes(ahd, fifo_mode, fifo_mode);
+			if (ahd_scb_active_in_fifo(ahd, scb) == 0)
+				continue;
+
+			ahd_run_data_fifo(ahd, scb);
+
+			/*
+			 * Clearing this transaction in this FIFO may
+			 * cause a CFG4DATA for this same transaction
+			 * to assert in the other FIFO.  Make sure we
+			 * loop one more time and check the other FIFO.
+			 */
+			i = 0;
+		}
+		ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
+		ahd_set_scbptr(ahd, scbid);
+		if ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_LIST_NULL) == 0
+		 && ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_FULL_RESID) != 0
+		  || (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR)
+		      & SG_LIST_NULL) != 0)) {
+			u_int comp_head;
+
+			/*
+			 * The transfer completed with a residual.
+			 * Place this SCB on the complete DMA list
+			 * so that we Update our in-core copy of the
+			 * SCB before completing the command.
+			 */
+			ahd_outb(ahd, SCB_SCSI_STATUS, 0);
+			ahd_outb(ahd, SCB_SGPTR,
+				 ahd_inb_scbram(ahd, SCB_SGPTR)
+				 | SG_STATUS_VALID);
+			ahd_outw(ahd, SCB_TAG, SCB_GET_TAG(scb));
+			comp_head = ahd_inw(ahd, COMPLETE_DMA_SCB_HEAD);
+			ahd_outw(ahd, SCB_NEXT_COMPLETE, comp_head);
+			if (SCBID_IS_NULL(comp_head))
+				ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD,
+					 SCB_GET_TAG(scb));
+		} else
+			ahd_complete_scb(ahd, scb);
+	}
+	ahd_set_scbptr(ahd, saved_scbptr);
+
+	/*
+	 * Setup for command channel portion of flush.
+	 */
+	ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
 
 	/*
 	 * Wait for any inprogress DMA to complete and clear DMA state
 	 * if this if for an SCB in the qinfifo.
 	 */
-	while ((ccscbctl = ahd_inb(ahd, CCSCBCTL) & (CCARREN|CCSCBEN)) != 0) {
+	while (((ccscbctl = ahd_inb(ahd, CCSCBCTL)) & (CCARREN|CCSCBEN)) != 0) {
 
 		if ((ccscbctl & (CCSCBDIR|CCARREN)) == (CCSCBDIR|CCARREN)) {
 			if ((ccscbctl & ARRDONE) != 0)
@@ -390,12 +470,7 @@
 	if ((ccscbctl & CCSCBDIR) != 0)
 		ahd_outb(ahd, CCSCBCTL, ccscbctl & ~(CCARREN|CCSCBEN));
 
-	/*
-	 * Complete any SCBs that just finished being
-	 * DMA'ed into the qoutfifo.
-	 */
-	ahd_run_qoutfifo(ahd);
-
+	saved_scbptr = ahd_get_scbptr(ahd);
 	/*
 	 * Manually update/complete any completed SCBs that are waiting to be
 	 * DMA'ed back up to the host.
@@ -438,29 +513,276 @@
 		scbid = next_scbid;
 	}
 	ahd_outw(ahd, COMPLETE_SCB_HEAD, SCB_LIST_NULL);
+
+	/*
+	 * Restore state.
+	 */
 	ahd_set_scbptr(ahd, saved_scbptr);
+	ahd_restore_modes(ahd, saved_modes);
+	ahd->flags |= AHD_UPDATE_PEND_CMDS;
+}
+
+/*
+ * Determine if an SCB for a packetized transaction
+ * is active in a FIFO.
+ */
+static int
+ahd_scb_active_in_fifo(struct ahd_softc *ahd, struct scb *scb)
+{
 
 	/*
-	 * Flush the good status FIFO for compelted packetized commands.
+	 * The FIFO is only active for our transaction if
+	 * the SCBPTR matches the SCB's ID and the firmware
+	 * has installed a handler for the FIFO or we have
+	 * a pending SAVEPTRS or CFG4DATA interrupt.
 	 */
-	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-	while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
-		scbid = (ahd_inb(ahd, GSFIFO+1) << 8)
-		      | ahd_inb(ahd, GSFIFO);
-		scb = ahd_lookup_scb(ahd, scbid);
-		if (scb == NULL) {
-			printf("%s: Warning - GSFIFO SCB %d invalid\n",
-			       ahd_name(ahd), scbid);
-			continue;
+	if (ahd_get_scbptr(ahd) != SCB_GET_TAG(scb)
+	 || ((ahd_inb(ahd, LONGJMP_ADDR+1) & INVALID_ADDR) != 0
+	  && (ahd_inb(ahd, SEQINTSRC) & (CFG4DATA|SAVEPTRS)) == 0))
+		return (0);
+
+	return (1);
+}
+
+/*
+ * Run a data fifo to completion for a transaction we know
+ * has completed across the SCSI bus (good status has been
+ * received).  We are already set to the correct FIFO mode
+ * on entry to this routine.
+ *
+ * This function attempts to operate exactly as the firmware
+ * would when running this FIFO.  Care must be taken to update
+ * this routine any time the firmware's FIFO algorithm is
+ * changed.
+ */
+static void
+ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb)
+{
+	u_int seqintsrc;
+
+	while (1) {
+		seqintsrc = ahd_inb(ahd, SEQINTSRC);
+		if ((seqintsrc & CFG4DATA) != 0) {
+			uint32_t datacnt;
+			uint32_t sgptr;
+
+			/*
+			 * Clear full residual flag.
+			 */
+			sgptr = ahd_inl_scbram(ahd, SCB_SGPTR) & ~SG_FULL_RESID;
+			ahd_outb(ahd, SCB_SGPTR, sgptr);
+
+			/*
+			 * Load datacnt and address.
+			 */
+			datacnt = ahd_inl_scbram(ahd, SCB_DATACNT);
+			if ((datacnt & AHD_DMA_LAST_SEG) != 0) {
+				sgptr |= LAST_SEG;
+				ahd_outb(ahd, SG_STATE, 0);
+			} else
+				ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
+			ahd_outq(ahd, HADDR, ahd_inq_scbram(ahd, SCB_DATAPTR));
+			ahd_outl(ahd, HCNT, datacnt & AHD_SG_LEN_MASK);
+			ahd_outb(ahd, SG_CACHE_PRE, sgptr);
+			ahd_outb(ahd, DFCNTRL, PRELOADEN|SCSIEN|HDMAEN);
+
+			/*
+			 * Initialize Residual Fields.
+			 */
+			ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, datacnt >> 24);
+			ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr & SG_PTR_MASK);
+
+			/*
+			 * Mark the SCB as having a FIFO in use.
+			 */
+			ahd_outb(ahd, SCB_FIFO_USE_COUNT,
+				 ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) + 1);
+
+			/*
+			 * Install a "fake" handler for this FIFO.
+			 */
+			ahd_outw(ahd, LONGJMP_ADDR, 0);
+
+			/*
+			 * Notify the hardware that we have satisfied
+			 * this sequencer interrupt.
+			 */
+			ahd_outb(ahd, CLRSEQINTSRC, CLRCFG4DATA);
+		} else if ((seqintsrc & SAVEPTRS) != 0) {
+			uint32_t sgptr;
+			uint32_t resid;
+
+			if ((ahd_inb(ahd, LONGJMP_ADDR+1)&INVALID_ADDR) != 0) {
+				/*
+				 * Snapshot Save Pointers.  Clear
+				 * the snapshot and continue.
+				 */
+				ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
+				continue;
+			}
+
+			/*
+			 * Disable S/G fetch so the DMA engine
+			 * is available to future users.
+			 */
+			if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0)
+				ahd_outb(ahd, CCSGCTL, 0);
+			ahd_outb(ahd, SG_STATE, 0);
+
+			/*
+			 * Flush the data FIFO.  Strickly only
+			 * necessary for Rev A parts.
+			 */
+			ahd_outb(ahd, DFCNTRL,
+				 ahd_inb(ahd, DFCNTRL) | FIFOFLUSH);
+
+			/*
+			 * Calculate residual.
+			 */
+			sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
+			resid = ahd_inl(ahd, SHCNT);
+			resid |=
+			    ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT+3) << 24;
+			ahd_outl(ahd, SCB_RESIDUAL_DATACNT, resid);
+			if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG) == 0) {
+				/*
+				 * Must back up to the correct S/G element.
+				 * Typically this just means resetting our
+				 * low byte to the offset in the SG_CACHE,
+				 * but if we wrapped, we have to correct
+				 * the other bytes of the sgptr too.
+				 */
+				if ((ahd_inb(ahd, SG_CACHE_SHADOW) & 0x80) != 0
+				 && (sgptr & 0x80) == 0)
+					sgptr -= 0x100;
+				sgptr &= ~0xFF;
+				sgptr |= ahd_inb(ahd, SG_CACHE_SHADOW)
+				       & SG_ADDR_MASK;
+				ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
+				ahd_outb(ahd, SCB_RESIDUAL_DATACNT + 3, 0);
+			} else if ((resid & AHD_SG_LEN_MASK) == 0) {
+				ahd_outb(ahd, SCB_RESIDUAL_SGPTR,
+					 sgptr | SG_LIST_NULL);
+			}
+			/*
+			 * Save Pointers.
+			 */
+			ahd_outq(ahd, SCB_DATAPTR, ahd_inq(ahd, SHADDR));
+			ahd_outl(ahd, SCB_DATACNT, resid);
+			ahd_outl(ahd, SCB_SGPTR, sgptr);
+			ahd_outb(ahd, CLRSEQINTSRC, CLRSAVEPTRS);
+			ahd_outb(ahd, SEQIMODE,
+				 ahd_inb(ahd, SEQIMODE) | ENSAVEPTRS);
+			/*
+			 * If the data is to the SCSI bus, we are
+			 * done, otherwise wait for FIFOEMP.
+			 */
+			if ((ahd_inb(ahd, DFCNTRL) & DIRECTION) != 0)
+				break;
+		} else if ((ahd_inb(ahd, SG_STATE) & LOADING_NEEDED) != 0) {
+			uint32_t sgptr;
+			uint64_t data_addr;
+			uint32_t data_len;
+			u_int	 dfcntrl;
+
+			/*
+			 * Disable S/G fetch so the DMA engine
+			 * is available to future users.
+			 */
+			if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) {
+				ahd_outb(ahd, CCSGCTL, 0);
+				ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
+			}
+
+			/*
+			 * Wait for the DMA engine to notice that the
+			 * host transfer is enabled and that there is
+			 * space in the S/G FIFO for new segments before
+			 * loading more segments.
+			 */
+			if ((ahd_inb(ahd, DFSTATUS) & PRELOAD_AVAIL) == 0)
+				continue;
+			if ((ahd_inb(ahd, DFCNTRL) & HDMAENACK) == 0)
+				continue;
+
+			/*
+			 * Determine the offset of the next S/G
+			 * element to load.
+			 */
+			sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
+			sgptr &= SG_PTR_MASK;
+			if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
+				struct ahd_dma64_seg *sg;
+
+				sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
+				data_addr = sg->addr;
+				data_len = sg->len;
+				sgptr += sizeof(*sg);
+			} else {
+				struct	ahd_dma_seg *sg;
+
+				sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
+				data_addr = sg->len & AHD_SG_HIGH_ADDR_MASK;
+				data_addr <<= 8;
+				data_addr |= sg->addr;
+				data_len = sg->len;
+				sgptr += sizeof(*sg);
+			}
+
+			/*
+			 * Update residual information.
+			 */
+			ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, data_len >> 24);
+			ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
+
+			/*
+			 * Load the S/G.
+			 */
+			if (data_len & AHD_DMA_LAST_SEG) {
+				sgptr |= LAST_SEG;
+				ahd_outb(ahd, SG_STATE, 0);
+			}
+			ahd_outq(ahd, HADDR, data_addr);
+			ahd_outl(ahd, HCNT, data_len & AHD_SG_LEN_MASK);
+			ahd_outb(ahd, SG_CACHE_PRE, sgptr & 0xFF);
+
+			/*
+			 * Advertise the segment to the hardware.
+			 */
+			dfcntrl = ahd_inb(ahd, DFCNTRL)|PRELOADEN|HDMAEN;
+			if ((ahd->features & AHD_NEW_DFCNTRL_OPTS)!=0) {
+				/*
+				 * Use SCSIENWRDIS so that SCSIEN
+				 * is never modified by this
+				 * operation.
+				 */
+				dfcntrl |= SCSIENWRDIS;
+			}
+			ahd_outb(ahd, DFCNTRL, dfcntrl);
+		} else if ((ahd_inb(ahd, SG_CACHE_SHADOW)
+			 & LAST_SEG_DONE) != 0) {
+
+			/*
+			 * Transfer completed to the end of SG list
+			 * and has flushed to the host.
+			 */
+			ahd_outb(ahd, SCB_SGPTR,
+				 ahd_inb_scbram(ahd, SCB_SGPTR) | SG_LIST_NULL);
+			break;
+		} else if ((ahd_inb(ahd, DFSTATUS) & FIFOEMP) != 0) {
+			break;
 		}
-		ahd_complete_scb(ahd, scb);
+		ahd_delay(200);
 	}
-
 	/*
-	 * Restore state.
+	 * Clear any handler for this FIFO, decrement
+	 * the FIFO use count for the SCB, and release
+	 * the FIFO.
 	 */
-	ahd_restore_modes(ahd, saved_modes);
-	ahd->flags |= AHD_UPDATE_PEND_CMDS;
+	ahd_outb(ahd, LONGJMP_ADDR + 1, INVALID_ADDR);
+	ahd_outb(ahd, SCB_FIFO_USE_COUNT,
+		 ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) - 1);
+	ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
 }
 
 void
@@ -589,7 +911,7 @@
 			/*
 			 * Somehow need to know if this
 			 * is from a selection or reselection.
-			 * From that, we can termine target
+			 * From that, we can determine target
 			 * ID so we at least have an I_T nexus.
 			 */
 		} else {
@@ -796,7 +1118,8 @@
 			 * attempt to complete this bogus SCB.
 			 */
 			ahd_outb(ahd, SCB_CONTROL,
-				 ahd_inb(ahd, SCB_CONTROL) & ~STATUS_RCVD);
+				 ahd_inb_scbram(ahd, SCB_CONTROL)
+				 & ~STATUS_RCVD);
 		}
 		break;
 	}
@@ -1029,7 +1352,7 @@
 					   ROLE_INITIATOR, /*status*/0,
 					   SEARCH_REMOVE);
 		ahd_outb(ahd, SCB_CONTROL,
-			 ahd_inb(ahd, SCB_CONTROL) & ~MK_MESSAGE);
+			 ahd_inb_scbram(ahd, SCB_CONTROL) & ~MK_MESSAGE);
 		break;
 	}
 	case TASKMGMT_FUNC_COMPLETE:
@@ -1880,21 +2203,32 @@
 			tinfo->goal.ppr_options = 0;
 			ahd_qinfifo_requeue_tail(ahd, scb);
 			printerror = 0;
-		} else if ((ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE)
-			 || ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE))
+		} else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE)
 			&& ppr_busfree == 0) {
 			/*
-			 * Negotiation Rejected.  Go-async and
+			 * Negotiation Rejected.  Go-narrow and
 			 * retry command.
 			 */
 #ifdef AHD_DEBUG
 			if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
-				printf("Negotiation rejected busfree.\n");
+				printf("WDTR negotiation rejected busfree.\n");
 #endif
 			ahd_set_width(ahd, &devinfo,
 				      MSG_EXT_WDTR_BUS_8_BIT,
 				      AHD_TRANS_CUR|AHD_TRANS_GOAL,
 				      /*paused*/TRUE);
+			ahd_qinfifo_requeue_tail(ahd, scb);
+			printerror = 0;
+		} else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE)
+			&& ppr_busfree == 0) {
+			/*
+			 * Negotiation Rejected.  Go-async and
+			 * retry command.
+			 */
+#ifdef AHD_DEBUG
+			if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
+				printf("SDTR negotiation rejected busfree.\n");
+#endif
 			ahd_set_syncrate(ahd, &devinfo,
 					/*period*/0, /*offset*/0,
 					/*ppr_options*/0,
@@ -2187,8 +2521,14 @@
 			ahd_outb(ahd, LQOMODE0, 0);
 			ahd_outb(ahd, LQOMODE1, 0);
 			ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-  			simode1 = ahd_inb(ahd, SIMODE1);
-  			ahd_outb(ahd, SIMODE1, ENBUSFREE);
+			simode1 = ahd_inb(ahd, SIMODE1);
+			/*
+			 * We don't clear ENBUSFREE.  Unfortunately
+			 * we cannot re-enable busfree detection within
+			 * the current connection, so we must leave it
+			 * on while single stepping.
+			 */
+			ahd_outb(ahd, SIMODE1, simode1 & ENBUSFREE);
 			ahd_outb(ahd, SEQCTL0, ahd_inb(ahd, SEQCTL0) | STEP);
 			stepping = TRUE;
 		}
@@ -2196,9 +2536,8 @@
 		ahd_outb(ahd, CLRINT, CLRSCSIINT);
 		ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
 		ahd_outb(ahd, HCNTRL, ahd->unpause);
-		do {
+		while (!ahd_is_paused(ahd))
 			ahd_delay(200);
-		} while (!ahd_is_paused(ahd));
 		ahd_update_modes(ahd);
 	}
 	if (stepping) {
@@ -2316,7 +2655,7 @@
 				len = ahd_le32toh(sg_list[i].len);
 				printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
 				       i,
-				       (len >> 24) & SG_HIGH_ADDR_BITS,
+				       (len & AHD_SG_HIGH_ADDR_MASK) >> 24,
 				       ahd_le32toh(sg_list[i].addr),
 				       len & AHD_SG_LEN_MASK,
 				       len & AHD_DMA_LAST_SEG ? " Last" : "");
@@ -2904,7 +3243,7 @@
 {
 	struct		scb *pending_scb;
 	int		pending_scb_count;
-	int		i;
+	u_int		scb_tag;
 	int		paused;
 	u_int		saved_scbptr;
 	ahd_mode_state	saved_modes;
@@ -2962,17 +3301,14 @@
 	ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
 	saved_scbptr = ahd_get_scbptr(ahd);
 	/* Ensure that the hscbs down on the card match the new information */
-	for (i = 0; i < ahd->scb_data.maxhscbs; i++) {
+	for (scb_tag = 0; scb_tag < ahd->scb_data.maxhscbs; scb_tag++) {
 		struct	hardware_scb *pending_hscb;
 		u_int	control;
-		u_int	scb_tag;
 
-		ahd_set_scbptr(ahd, i);
-		scb_tag = i;
 		pending_scb = ahd_lookup_scb(ahd, scb_tag);
 		if (pending_scb == NULL)
 			continue;
-
+		ahd_set_scbptr(ahd, scb_tag);
 		pending_hscb = pending_scb->hscb;
 		control = ahd_inb_scbram(ahd, SCB_CONTROL);
 		control &= ~MK_MESSAGE;
@@ -3187,7 +3523,7 @@
 		       devinfo->target_mask);
 		panic("SCB = %d, SCB Control = %x:%x, MSG_OUT = %x "
 		      "SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control,
-		      ahd_inb(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
+		      ahd_inb_scbram(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
 		      scb->flags);
 	}
 
@@ -3232,6 +3568,7 @@
 	 * may change.
 	 */
 	period = tinfo->goal.period;
+	offset = tinfo->goal.offset;
 	ppr_options = tinfo->goal.ppr_options;
 	/* Target initiated PPR is not allowed in the SCSI spec */
 	if (devinfo->role == ROLE_TARGET)
@@ -3239,7 +3576,7 @@
 	ahd_devlimited_syncrate(ahd, tinfo, &period,
 				&ppr_options, devinfo->role);
 	dowide = tinfo->curr.width != tinfo->goal.width;
-	dosync = tinfo->curr.period != period;
+	dosync = tinfo->curr.offset != offset || tinfo->curr.period != period;
 	/*
 	 * Only use PPR if we have options that need it, even if the device
 	 * claims to support it.  There might be an expander in the way
@@ -3249,7 +3586,7 @@
 
 	if (!dowide && !dosync && !doppr) {
 		dowide = tinfo->goal.width != MSG_EXT_WDTR_BUS_8_BIT;
-		dosync = tinfo->goal.period != 0;
+		dosync = tinfo->goal.offset != 0;
 	}
 
 	if (!dowide && !dosync && !doppr) {
@@ -3725,8 +4062,13 @@
 		if ((ahd->msg_flags & MSG_FLAG_PACKETIZED) != 0) {
 			printf("%s: Returning to Idle Loop\n",
 			       ahd_name(ahd));
-			ahd_outb(ahd, LASTPHASE, P_BUSFREE);
 			ahd_clear_msg_state(ahd);
+
+			/*
+			 * Perform the equivalent of a clear_target_state.
+			 */
+			ahd_outb(ahd, LASTPHASE, P_BUSFREE);
+			ahd_outb(ahd, SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT);
 			ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
 		} else {
 			ahd_clear_msg_state(ahd);
@@ -3983,22 +4325,30 @@
 				response = TRUE;
 				sending_reply = TRUE;
 			}
+			/*
+			 * After a wide message, we are async, but
+			 * some devices don't seem to honor this portion
+			 * of the spec.  Force a renegotiation of the
+			 * sync component of our transfer agreement even
+			 * if our goal is async.  By updating our width
+			 * after forcing the negotiation, we avoid
+			 * renegotiating for width.
+			 */
+			ahd_update_neg_request(ahd, devinfo, tstate,
+					       tinfo, AHD_NEG_ALWAYS);
 			ahd_set_width(ahd, devinfo, bus_width,
 				      AHD_TRANS_ACTIVE|AHD_TRANS_GOAL,
 				      /*paused*/TRUE);
-			/* After a wide message, we are async */
-			ahd_set_syncrate(ahd, devinfo, /*period*/0,
-					 /*offset*/0, /*ppr_options*/0,
-					 AHD_TRANS_ACTIVE, /*paused*/TRUE);
 			if (sending_reply == FALSE && reject == FALSE) {
 
-				if (tinfo->goal.offset) {
-					ahd->msgout_index = 0;
-					ahd->msgout_len = 0;
-					ahd_build_transfer_msg(ahd, devinfo);
-					ahd->msgout_index = 0;
-					response = TRUE;
-				}
+				/*
+				 * We will always have an SDTR to send.
+				 */
+				ahd->msgout_index = 0;
+				ahd->msgout_len = 0;
+				ahd_build_transfer_msg(ahd, devinfo);
+				ahd->msgout_index = 0;
+				response = TRUE;
 			}
 			done = MSGLOOP_MSGCOMPLETE;
 			break;
@@ -4401,7 +4751,8 @@
 
 		sgptr = ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR);
 		if ((sgptr & SG_LIST_NULL) != 0
-		 && (ahd_inb(ahd, SCB_TASK_ATTRIBUTE) & SCB_XFERLEN_ODD) != 0) {
+		 && (ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
+		     & SCB_XFERLEN_ODD) != 0) {
 			/*
 			 * If the residual occurred on the last
 			 * transfer and the transfer request was
@@ -4502,7 +4853,8 @@
 			 * correct for subsequent data transfers.
 			 */
 			ahd_outb(ahd, SCB_TASK_ATTRIBUTE,
-			    ahd_inb(ahd, SCB_TASK_ATTRIBUTE) ^ SCB_XFERLEN_ODD);
+			    ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
+			    ^ SCB_XFERLEN_ODD);
 
 			ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
 			ahd_outl(ahd, SCB_RESIDUAL_DATACNT, data_cnt);
@@ -4542,9 +4894,8 @@
 	 */
 	ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
 	wait = 1000;
-	do {
+	while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE))
 		ahd_delay(100);
-	} while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE));
 	if (wait == 0) {
 		ahd_print_path(ahd, scb);
 		printf("ahd_reinitialize_dataptrs: Forcing FIFO free.\n");
@@ -5000,15 +5351,20 @@
 	ahd_timer_stop(&ahd->stat_timer);
 
 	/* This will reset most registers to 0, but not all */
-	ahd_reset(ahd);
+	ahd_reset(ahd, /*reinit*/FALSE);
 }
 
 /*
  * Reset the controller and record some information about it
- * that is only available just after a reset.
+ * that is only available just after a reset.  If "reinit" is
+ * non-zero, this reset occured after initial configuration
+ * and the caller requests that the chip be fully reinitialized
+ * to a runable state.  Chip interrupts are *not* enabled after
+ * a reinitialization.  The caller must enable interrupts via
+ * ahd_intr_enable().
  */
 int
-ahd_reset(struct ahd_softc *ahd)
+ahd_reset(struct ahd_softc *ahd, int reinit)
 {
 	u_int	 sxfrctl1;
 	int	 wait;
@@ -5101,7 +5457,7 @@
 	 * If a recovery action has forced a chip reset,
 	 * re-initialize the chip to our liking.
 	 */
-	if (ahd->init_level > 0)
+	if (reinit != 0)
 		ahd_chip_init(ahd);
 
 	return (0);
@@ -5382,6 +5738,7 @@
 		printf("%s: Setting up iocell workaround\n", ahd_name(ahd));
 #endif
 	ahd_restore_modes(ahd, saved_modes);
+	ahd->flags &= ~AHD_HAD_FIRST_SEL;
 }
 
 static void
@@ -5390,6 +5747,8 @@
 	ahd_mode_state	saved_modes;
 	u_int		sblkctl;
 
+	if ((ahd->flags & AHD_HAD_FIRST_SEL) != 0)
+		return;
 	saved_modes = ahd_save_modes(ahd);
 	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 	sblkctl = ahd_inb(ahd, SBLKCTL);
@@ -5409,6 +5768,7 @@
 	ahd_outb(ahd, SIMODE0, ahd_inb(ahd, SIMODE0) & ~(ENSELDO|ENSELDI));
 	ahd_outb(ahd, CLRINT, CLRSCSIINT);
 	ahd_restore_modes(ahd, saved_modes);
+	ahd->flags |= AHD_HAD_FIRST_SEL;
 }
 
 /*************************** SCB Management ***********************************/
@@ -6174,7 +6534,7 @@
 		ahd_outb(ahd, LUNLEN,
 			 sizeof(ahd->next_queued_hscb->pkt_long_lun) - 1);
 	} else {
-		ahd_outb(ahd, LUNLEN, sizeof(ahd->next_queued_hscb->lun) - 1);
+		ahd_outb(ahd, LUNLEN, LUNLEN_SINGLE_LEVEL_LUN);
 	}
 	ahd_outb(ahd, CDBLIMIT, SCB_CDB_LEN_PTR - 1);
 	ahd_outb(ahd, MAXCMD, 0xFF);
@@ -6215,6 +6575,7 @@
 	ahd_outb(ahd, CLRSINT3, NTRAMPERR|OSRAMPERR);
 	ahd_outb(ahd, CLRINT, CLRSCSIINT);
 
+#if NEEDS_MORE_TESTING
 	/*
 	 * Always enable abort on incoming L_Qs if this feature is
 	 * supported.  We use this to catch invalid SCB references.
@@ -6222,6 +6583,7 @@
 	if ((ahd->bugs & AHD_ABORT_LQI_BUG) == 0)
 		ahd_outb(ahd, LQCTL1, ABORTPENDING);
 	else
+#endif
 		ahd_outb(ahd, LQCTL1, 0);
 
 	/* All of our queues are empty */
@@ -6703,141 +7065,24 @@
 int
 ahd_suspend(struct ahd_softc *ahd)
 {
-#if 0
-	uint8_t *ptr;
-	int	 i;
 
 	ahd_pause_and_flushwork(ahd);
 
-	if (LIST_FIRST(&ahd->pending_scbs) != NULL)
-		return (EBUSY);
-
-#if AHD_TARGET_MODE
-	/*
-	 * XXX What about ATIOs that have not yet been serviced?
-	 * Perhaps we should just refuse to be suspended if we
-	 * are acting in a target role.
-	 */
-	if (ahd->pending_device != NULL)
+	if (LIST_FIRST(&ahd->pending_scbs) != NULL) {
+		ahd_unpause(ahd);
 		return (EBUSY);
-#endif
-
-	/* Save volatile registers */
-	ahd->suspend_state.channel[0].scsiseq = ahd_inb(ahd, SCSISEQ0);
-	ahd->suspend_state.channel[0].sxfrctl0 = ahd_inb(ahd, SXFRCTL0);
-	ahd->suspend_state.channel[0].sxfrctl1 = ahd_inb(ahd, SXFRCTL1);
-	ahd->suspend_state.channel[0].simode0 = ahd_inb(ahd, SIMODE0);
-	ahd->suspend_state.channel[0].simode1 = ahd_inb(ahd, SIMODE1);
-	ahd->suspend_state.channel[0].seltimer = ahd_inb(ahd, SELTIMER);
-	ahd->suspend_state.channel[0].seqctl = ahd_inb(ahd, SEQCTL0);
-	ahd->suspend_state.dscommand0 = ahd_inb(ahd, DSCOMMAND0);
-	ahd->suspend_state.dspcistatus = ahd_inb(ahd, DSPCISTATUS);
-
-	if ((ahd->features & AHD_DT) != 0) {
-		u_int sfunct;
-
-		sfunct = ahd_inb(ahd, SFUNCT) & ~ALT_MODE;
-		ahd_outb(ahd, SFUNCT, sfunct | ALT_MODE);
-		ahd->suspend_state.optionmode = ahd_inb(ahd, OPTIONMODE);
-		ahd_outb(ahd, SFUNCT, sfunct);
-		ahd->suspend_state.crccontrol1 = ahd_inb(ahd, CRCCONTROL1);
-	}
-
-	if ((ahd->features & AHD_MULTI_FUNC) != 0)
-		ahd->suspend_state.scbbaddr = ahd_inb(ahd, SCBBADDR);
-
-	if ((ahd->features & AHD_ULTRA2) != 0)
-		ahd->suspend_state.dff_thrsh = ahd_inb(ahd, DFF_THRSH);
-
-	ptr = ahd->suspend_state.scratch_ram;
-	for (i = 0; i < 64; i++)
-		*ptr++ = ahd_inb(ahd, SRAM_BASE + i);
-
-	if ((ahd->features & AHD_MORE_SRAM) != 0) {
-		for (i = 0; i < 16; i++)
-			*ptr++ = ahd_inb(ahd, TARG_OFFSET + i);
-	}
-
-	ptr = ahd->suspend_state.btt;
-	for (i = 0;i < AHD_NUM_TARGETS; i++) {
-		int j;
-
-		for (j = 0;j < AHD_NUM_LUNS_NONPKT; j++) {
-			u_int tcl;
-
-			tcl = BUILD_TCL_RAW(i, 'A', j);
-			*ptr = ahd_find_busy_tcl(ahd, tcl);
-		}
 	}
 	ahd_shutdown(ahd);
-#endif
 	return (0);
 }
 
 int
 ahd_resume(struct ahd_softc *ahd)
 {
-#if 0
-	uint8_t *ptr;
-	int	 i;
-
-	ahd_reset(ahd);
-
-	ahd_build_free_scb_list(ahd);
-
-	/* Restore volatile registers */
-	ahd_outb(ahd, SCSISEQ0, ahd->suspend_state.channel[0].scsiseq);
-	ahd_outb(ahd, SXFRCTL0, ahd->suspend_state.channel[0].sxfrctl0);
-	ahd_outb(ahd, SXFRCTL1, ahd->suspend_state.channel[0].sxfrctl1);
-	ahd_outb(ahd, SIMODE0, ahd->suspend_state.channel[0].simode0);
-	ahd_outb(ahd, SIMODE1, ahd->suspend_state.channel[0].simode1);
-	ahd_outb(ahd, SELTIMER, ahd->suspend_state.channel[0].seltimer);
-	ahd_outb(ahd, SEQCTL0, ahd->suspend_state.channel[0].seqctl);
-	if ((ahd->features & AHD_ULTRA2) != 0)
-		ahd_outb(ahd, SCSIID_ULTRA2, ahd->our_id);
-	else
-		ahd_outb(ahd, SCSIID, ahd->our_id);
-
-	ahd_outb(ahd, DSCOMMAND0, ahd->suspend_state.dscommand0);
-	ahd_outb(ahd, DSPCISTATUS, ahd->suspend_state.dspcistatus);
-
-	if ((ahd->features & AHD_DT) != 0) {
-		u_int sfunct;
 
-		sfunct = ahd_inb(ahd, SFUNCT) & ~ALT_MODE;
-		ahd_outb(ahd, SFUNCT, sfunct | ALT_MODE);
-		ahd_outb(ahd, OPTIONMODE, ahd->suspend_state.optionmode);
-		ahd_outb(ahd, SFUNCT, sfunct);
-		ahd_outb(ahd, CRCCONTROL1, ahd->suspend_state.crccontrol1);
-	}
-
-	if ((ahd->features & AHD_MULTI_FUNC) != 0)
-		ahd_outb(ahd, SCBBADDR, ahd->suspend_state.scbbaddr);
-
-	if ((ahd->features & AHD_ULTRA2) != 0)
-		ahd_outb(ahd, DFF_THRSH, ahd->suspend_state.dff_thrsh);
-
-	ptr = ahd->suspend_state.scratch_ram;
-	for (i = 0; i < 64; i++)
-		ahd_outb(ahd, SRAM_BASE + i, *ptr++);
-
-	if ((ahd->features & AHD_MORE_SRAM) != 0) {
-		for (i = 0; i < 16; i++)
-			ahd_outb(ahd, TARG_OFFSET + i, *ptr++);
-	}
-
-	ptr = ahd->suspend_state.btt;
-	for (i = 0;i < AHD_NUM_TARGETS; i++) {
-		int j;
-
-		for (j = 0;j < AHD_NUM_LUNS; j++) {
-			u_int tcl;
-
-			tcl = BUILD_TCL(i << 4, j);
-			ahd_busy_tcl(ahd, tcl, *ptr);
-		}
-	}
-#endif
+	ahd_reset(ahd, /*reinit*/TRUE);
+	ahd_intr_enable(ahd, TRUE); 
+	ahd_restart(ahd);
 	return (0);
 }
 
@@ -7479,9 +7724,12 @@
 	ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) & ~ENSCSIRST);
 	scsiseq = ahd_inb(ahd, SCSISEQ0) & ~(ENSELO|ENARBO|SCSIRSTO);
 	ahd_outb(ahd, SCSISEQ0, scsiseq | SCSIRSTO);
+	ahd_flush_device_writes(ahd);
 	ahd_delay(AHD_BUSRESET_DELAY);
 	/* Turn off the bus reset */
 	ahd_outb(ahd, SCSISEQ0, scsiseq);
+	ahd_flush_device_writes(ahd);
+	ahd_delay(AHD_BUSRESET_DELAY);
 	if ((ahd->bugs & AHD_SCSIRST_BUG) != 0) {
 		/*
 		 * 2A Razor #474
@@ -7489,8 +7737,7 @@
 		 * SCSI bus resets that we initiate, so
 		 * we must reset the chip.
 		 */
-		ahd_delay(AHD_BUSRESET_DELAY);
-		ahd_reset(ahd);
+		ahd_reset(ahd, /*reinit*/TRUE);
 		ahd_intr_enable(ahd, /*enable*/TRUE);
 		AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
 	}
@@ -8585,6 +8832,10 @@
 				    ahd->saved_dst_mode));
 	if (paused)
 		printf("Card was paused\n");
+
+	if (ahd_check_cmdcmpltqueues(ahd))
+		printf("Completions are pending\n");
+
 	/*
 	 * Mode independent registers.
 	 */
@@ -8634,10 +8885,12 @@
 		if (i++ > AHD_SCB_MAX)
 			break;
 		cur_col = printf("\n%3d FIFO_USE[0x%x] ", SCB_GET_TAG(scb),
-				 ahd_inb(ahd, SCB_FIFO_USE_COUNT));
+				 ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT));
 		ahd_set_scbptr(ahd, SCB_GET_TAG(scb));
-		ahd_scb_control_print(ahd_inb(ahd, SCB_CONTROL), &cur_col, 60);
-		ahd_scb_scsiid_print(ahd_inb(ahd, SCB_SCSIID), &cur_col, 60);
+		ahd_scb_control_print(ahd_inb_scbram(ahd, SCB_CONTROL),
+				      &cur_col, 60);
+		ahd_scb_scsiid_print(ahd_inb_scbram(ahd, SCB_SCSIID),
+				     &cur_col, 60);
 	}
 	printf("\nTotal %d\n", i);
 
@@ -8666,7 +8919,7 @@
 	while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
 		ahd_set_scbptr(ahd, scb_index);
 		printf("%d ", scb_index);
-		scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
+		scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
 	}
 	printf("\n");
 
@@ -8676,7 +8929,7 @@
 	while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
 		ahd_set_scbptr(ahd, scb_index);
 		printf("%d ", scb_index);
-		scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
+		scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
 	}
 	printf("\n");
 
@@ -8687,7 +8940,7 @@
 	while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
 		ahd_set_scbptr(ahd, scb_index);
 		printf("%d ", scb_index);
-		scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
+		scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
 	}
 	printf("\n");
 	ahd_set_scbptr(ahd, saved_scb_index);
@@ -8766,15 +9019,16 @@
 	       ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX),
 	       ahd_inw(ahd, DINDEX));
 	printf("%s: SCBPTR == 0x%x, SCB_NEXT == 0x%x, SCB_NEXT2 == 0x%x\n",
-	       ahd_name(ahd), ahd_get_scbptr(ahd), ahd_inw(ahd, SCB_NEXT),
-	       ahd_inw(ahd, SCB_NEXT2));
+	       ahd_name(ahd), ahd_get_scbptr(ahd),
+	       ahd_inw_scbram(ahd, SCB_NEXT),
+	       ahd_inw_scbram(ahd, SCB_NEXT2));
 	printf("CDB %x %x %x %x %x %x\n",
-	       ahd_inb(ahd, SCB_CDB_STORE),
-	       ahd_inb(ahd, SCB_CDB_STORE+1),
-	       ahd_inb(ahd, SCB_CDB_STORE+2),
-	       ahd_inb(ahd, SCB_CDB_STORE+3),
-	       ahd_inb(ahd, SCB_CDB_STORE+4),
-	       ahd_inb(ahd, SCB_CDB_STORE+5));
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE),
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE+1),
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE+2),
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE+3),
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE+4),
+	       ahd_inb_scbram(ahd, SCB_CDB_STORE+5));
 	printf("STACK:");
 	for (i = 0; i < ahd->stack_size; i++) {
 		ahd->saved_stack[i] =
@@ -8806,10 +9060,12 @@
 		ahd_set_scbptr(ahd, i);
 		printf("%3d", i);
 		printf("(CTRL 0x%x ID 0x%x N 0x%x N2 0x%x SG 0x%x, RSG 0x%x)\n",
-		       ahd_inb(ahd, SCB_CONTROL),
-		       ahd_inb(ahd, SCB_SCSIID), ahd_inw(ahd, SCB_NEXT),
-		       ahd_inw(ahd, SCB_NEXT2), ahd_inl(ahd, SCB_SGPTR),
-		       ahd_inl(ahd, SCB_RESIDUAL_SGPTR));
+		       ahd_inb_scbram(ahd, SCB_CONTROL),
+		       ahd_inb_scbram(ahd, SCB_SCSIID),
+		       ahd_inw_scbram(ahd, SCB_NEXT),
+		       ahd_inw_scbram(ahd, SCB_NEXT2),
+		       ahd_inl_scbram(ahd, SCB_SGPTR),
+		       ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR));
 	}
 	printf("\n");
 	ahd_set_scbptr(ahd, saved_scb_index);
@@ -9192,6 +9448,7 @@
 			ahd->flags &= ~AHD_INITIATORROLE;
 		ahd_pause(ahd);
 		ahd_loadseq(ahd);
+		ahd_restart(ahd);
 		ahd_unlock(ahd, &s);
 	}
 	cel = &ccb->cel;
@@ -9425,6 +9682,11 @@
 				ahd->flags |= AHD_INITIATORROLE;
 				ahd_pause(ahd);
 				ahd_loadseq(ahd);
+				ahd_restart(ahd);
+				/*
+				 * Unpaused.  The extra unpause
+				 * that follows is harmless.
+				 */
 			}
 		}
 		ahd_unpause(ahd);
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h
--- a/drivers/scsi/aic7xxx/aic79xx_inline.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_inline.h	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#50 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#51 $
  *
  * $FreeBSD$
  */
@@ -455,6 +455,8 @@
 static __inline u_int	ahd_inw_scbram(struct ahd_softc *ahd, u_int offset);
 static __inline uint32_t
 			ahd_inl_scbram(struct ahd_softc *ahd, u_int offset);
+static __inline uint64_t
+			ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
 static __inline void	ahd_swap_with_next_hscb(struct ahd_softc *ahd,
 						struct scb *scb);
 static __inline void	ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
@@ -697,10 +699,15 @@
 static __inline uint32_t
 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
 {
-	return (ahd_inb_scbram(ahd, offset)
-	      | (ahd_inb_scbram(ahd, offset+1) << 8)
-	      | (ahd_inb_scbram(ahd, offset+2) << 16)
-	      | (ahd_inb_scbram(ahd, offset+3) << 24));
+	return (ahd_inw_scbram(ahd, offset)
+	      | (ahd_inw_scbram(ahd, offset+2) << 16));
+}
+
+static __inline uint64_t
+ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
+{
+	return (ahd_inl_scbram(ahd, offset)
+	      | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
 }
 
 static __inline struct scb *
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c	Thu Jan  8 23:00:24 2004
@@ -1,7 +1,7 @@
 /*
  * Adaptec AIC79xx device driver for Linux.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#169 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#171 $
  *
  * --------------------------------------------------------------------------
  * Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -425,7 +425,7 @@
 static char dummy_buffer[60] = "Please don't trounce on me insmod!!\n";
 
 MODULE_AUTHOR("Maintainer: Justin T. Gibbs <gibbs@scsiguy.com>");
-MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver");
+MODULE_DESCRIPTION("Adaptec Aic790X U320 SCSI Host Bus Adapter driver");
 #ifdef MODULE_LICENSE
 MODULE_LICENSE("Dual BSD/GPL");
 #endif
@@ -4442,6 +4442,16 @@
 			}
 #endif
 			ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
+#ifdef AHD_REPORT_UNDERFLOWS
+		/*
+		 * This code is disabled by default as some
+		 * clients of the SCSI system do not properly
+		 * initialize the underflow parameter.  This
+		 * results in spurious termination of commands
+		 * that complete as expected (e.g. underflow is
+		 * allowed as command can return variable amounts
+		 * of data.
+		 */
 		} else if (amount_xferred < scb->io_ctx->underflow) {
 			u_int i;
 
@@ -4456,6 +4466,7 @@
 				ahd_get_residual(scb),
 				ahd_get_transfer_length(scb));
 			ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
+#endif
 		} else {
 			ahd_set_transaction_status(scb, CAM_REQ_CMP);
 		}
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h	Thu Jan  8 23:00:24 2004
@@ -36,7 +36,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#133 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#137 $
  *
  */
 #ifndef _AIC79XX_LINUX_H_
@@ -292,7 +292,7 @@
 #define AHD_SCSI_HAS_HOST_LOCK 0
 #endif
 
-#define AIC79XX_DRIVER_VERSION "1.3.9"
+#define AIC79XX_DRIVER_VERSION "1.3.11"
 
 /**************************** Front End Queues ********************************/
 /*
@@ -590,10 +590,6 @@
 
 
 /***************************** Low Level I/O **********************************/
-#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
-#define MMAPIO
-#endif
-
 static __inline uint8_t ahd_inb(struct ahd_softc * ahd, long port);
 static __inline uint16_t ahd_inw_atomic(struct ahd_softc * ahd, long port);
 static __inline void ahd_outb(struct ahd_softc * ahd, long port, uint8_t val);
@@ -608,16 +604,12 @@
 ahd_inb(struct ahd_softc * ahd, long port)
 {
 	uint8_t x;
-#ifdef MMAPIO
 
 	if (ahd->tags[0] == BUS_SPACE_MEMIO) {
 		x = readb(ahd->bshs[0].maddr + port);
 	} else {
 		x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
 	}
-#else
-	x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
-#endif
 	mb();
 	return (x);
 }
@@ -626,16 +618,12 @@
 ahd_inw_atomic(struct ahd_softc * ahd, long port)
 {
 	uint8_t x;
-#ifdef MMAPIO
 
 	if (ahd->tags[0] == BUS_SPACE_MEMIO) {
 		x = readw(ahd->bshs[0].maddr + port);
 	} else {
 		x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
 	}
-#else
-	x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
-#endif
 	mb();
 	return (x);
 }
@@ -643,30 +631,22 @@
 static __inline void
 ahd_outb(struct ahd_softc * ahd, long port, uint8_t val)
 {
-#ifdef MMAPIO
 	if (ahd->tags[0] == BUS_SPACE_MEMIO) {
 		writeb(val, ahd->bshs[0].maddr + port);
 	} else {
 		outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
 	}
-#else
-	outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
-#endif
 	mb();
 }
 
 static __inline void
 ahd_outw_atomic(struct ahd_softc * ahd, long port, uint16_t val)
 {
-#ifdef MMAPIO
 	if (ahd->tags[0] == BUS_SPACE_MEMIO) {
 		writew(val, ahd->bshs[0].maddr + port);
 	} else {
 		outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
 	}
-#else
-	outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
-#endif
 	mb();
 }
 
@@ -1005,7 +985,12 @@
 	(((dev_softc)->dma_mask = mask) && 0)
 #endif
 /**************************** Proc FS Support *********************************/
-int	ahd_linux_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+int	ahd_linux_proc_info(char *, char **, off_t, int, int, int);
+#else
+int	ahd_linux_proc_info(struct Scsi_Host *, char *, char **,
+			    off_t, int, int);
+#endif
 
 /*************************** Domain Validation ********************************/
 #define AHD_DV_CMD(cmd) ((cmd)->scsi_done == ahd_linux_dv_complete)
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
--- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c	Thu Jan  8 23:00:23 2004
@@ -36,7 +36,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#23 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#25 $
  */
 
 #include "aic79xx_osm.h"
@@ -52,11 +52,9 @@
 					const struct pci_device_id *ent);
 static int	ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd,
 						 u_long *base, u_long *base2);
-#ifdef MMAPIO
 static int	ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
 						 u_long *bus_addr,
 						 uint8_t **maddr);
-#endif
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 static void	ahd_linux_pci_dev_remove(struct pci_dev *pdev);
 
@@ -163,8 +161,8 @@
 		bus_addr_t mask_39bit;
 
 		memsize = ahd_linux_get_memsize();
-		mask_64bit = (bus_addr_t)(0xFFFFFFFFFFFFFFFFULL&(bus_addr_t)~0);
-		mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL&(bus_addr_t)~0);
+		mask_64bit = (bus_addr_t)0xFFFFFFFFFFFFFFFFULL;
+		mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
 		if (memsize >= 0x8000000000ULL
 	 	 && ahd_pci_set_dma_mask(pdev, mask_64bit) == 0) {
 			ahd->flags |= AHD_64BIT_ADDRESSING;
@@ -273,7 +271,6 @@
 	return (0);
 }
 
-#ifdef MMAPIO
 static int
 ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
 				 u_long *bus_addr,
@@ -321,7 +318,6 @@
 		error = ENOMEM;
 	return (error);
 }
-#endif
 
 int
 ahd_pci_map_registers(struct ahd_softc *ahd)
@@ -338,7 +334,6 @@
 	command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
 	base = 0;
 	maddr = NULL;
-#ifdef MMAPIO
 	error = ahd_linux_pci_reserve_mem_region(ahd, &base, &maddr);
 	if (error == 0) {
 		ahd->platform_data->mem_busaddr = base;
@@ -373,7 +368,6 @@
 		       ahd_get_pci_function(ahd->dev_softc),
 		       base);
 	}
-#endif
 
 	if (maddr == NULL) {
 		u_long	 base2;
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c
--- a/drivers/scsi/aic7xxx/aic79xx_pci.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_pci.c	Thu Jan  8 23:00:24 2004
@@ -38,7 +38,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#73 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#77 $
  *
  * $FreeBSD$
  */
@@ -117,6 +117,7 @@
 static ahd_device_setup_t ahd_aic7901_setup;
 static ahd_device_setup_t ahd_aic7901A_setup;
 static ahd_device_setup_t ahd_aic7902_setup;
+static ahd_device_setup_t ahd_aic790X_setup;
 
 struct ahd_pci_identity ahd_pci_ident_table [] =
 {
@@ -375,7 +376,7 @@
 
 	ahd->bus_intr = ahd_pci_intr;
 
-	error = ahd_reset(ahd);
+	error = ahd_reset(ahd, /*reinit*/FALSE);
 	if (error != 0)
 		return (ENXIO);
 
@@ -418,9 +419,11 @@
 int
 ahd_pci_test_register_access(struct ahd_softc *ahd)
 {
-	uint32_t	cmd;
-	int		error;
-	uint8_t		hcntrl;
+	uint32_t cmd;
+	u_int	 targpcistat;
+	u_int	 pci_status1;
+	int	 error;
+	uint8_t	 hcntrl;
 
 	error = EIO;
 
@@ -454,6 +457,18 @@
 	ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
 	while (ahd_is_paused(ahd) == 0)
 		;
+
+	/* Clear any PCI errors that occurred before our driver attached. */
+	ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG);
+	targpcistat = ahd_inb(ahd, TARGPCISTAT);
+	ahd_outb(ahd, TARGPCISTAT, targpcistat);
+	pci_status1 = ahd_pci_read_config(ahd->dev_softc,
+					  PCIR_STATUS + 1, /*bytes*/1);
+	ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
+			     pci_status1, /*bytes*/1);
+	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
+	ahd_outb(ahd, CLRINT, CLRPCIINT);
+
 	ahd_outb(ahd, SEQCTL0, PERRORDIS);
 	ahd_outl(ahd, SRAM_BASE, 0x5aa555aa);
 	if (ahd_inl(ahd, SRAM_BASE) != 0x5aa555aa)
@@ -472,8 +487,6 @@
 
 fail:
 	if ((ahd_inb(ahd, INTSTAT) & PCIINT) != 0) {
-		u_int targpcistat;
-		u_int pci_status1;
 
 		ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG);
 		targpcistat = ahd_inb(ahd, TARGPCISTAT);
@@ -486,7 +499,6 @@
 				     pci_status1, /*bytes*/1);
 		ahd_outb(ahd, CLRINT, CLRPCIINT);
 	}
-
 	ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS);
 	ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
 	return (error);
@@ -903,30 +915,32 @@
 static int
 ahd_aic7901_setup(struct ahd_softc *ahd)
 {
-	int error;
 
-	error = ahd_aic7902_setup(ahd);
-	if (error != 0)
-		return (error);
 	ahd->chip = AHD_AIC7901;
-	return (0);
+	ahd->features = AHD_AIC7901_FE;
+	return (ahd_aic790X_setup(ahd));
 }
 
 static int
 ahd_aic7901A_setup(struct ahd_softc *ahd)
 {
-	int error;
 
-	error = ahd_aic7902_setup(ahd);
-	if (error != 0)
-		return (error);
 	ahd->chip = AHD_AIC7901A;
-	return (0);
+	ahd->features = AHD_AIC7901A_FE;
+	return (ahd_aic790X_setup(ahd));
 }
 
 static int
 ahd_aic7902_setup(struct ahd_softc *ahd)
 {
+	ahd->chip = AHD_AIC7902;
+	ahd->features = AHD_AIC7902_FE;
+	return (ahd_aic790X_setup(ahd));
+}
+
+static int
+ahd_aic790X_setup(struct ahd_softc *ahd)
+{
 	ahd_dev_softc_t pci;
 	u_int rev;
 
@@ -939,8 +953,6 @@
 		return (ENXIO);
 	}
 	ahd->channel = ahd_get_pci_function(pci) + 'A';
-	ahd->chip = AHD_AIC7902;
-	ahd->features = AHD_AIC7902_FE;
 	if (rev < ID_AIC7902_PCI_REV_B0) {
 		/*
 		 * Enable A series workarounds.
@@ -968,9 +980,14 @@
 		u_int devconfig1;
 
 		ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS
-			      |  AHD_NEW_DFCNTRL_OPTS;
-		ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_ABORT_LQI_BUG
-			  |  AHD_INTCOLLISION_BUG|AHD_EARLY_REQ_BUG;
+			      |  AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY;
+		ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG;
+
+		/*
+		 * Some issues have been resolved in the 7901B.
+		 */
+		if ((ahd->features & AHD_MULTI_FUNC) != 0)
+			ahd->bugs |= AHD_INTCOLLISION_BUG|AHD_ABORT_LQI_BUG;
 
 		/*
 		 * IO Cell paramter setup.
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c
--- a/drivers/scsi/aic7xxx/aic79xx_proc.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_proc.c	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
  * sym driver.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#17 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#19 $
  */
 #include "aic79xx_osm.h"
 #include "aic79xx_inline.h"
@@ -278,8 +278,13 @@
  * Return information to handle /proc support for the driver.
  */
 int
-ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset,
-		  int length, int inout)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ahd_linux_proc_info(char *buffer, char **start, off_t offset,
+		    int length, int hostno, int inout)
+#else
+ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
+		    off_t offset, int length, int inout)
+#endif
 {
 	struct	ahd_softc *ahd;
 	struct	info_str info;
@@ -291,10 +296,14 @@
 
 	retval = -EINVAL;
 	ahd_list_lock(&l);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	TAILQ_FOREACH(ahd, &ahd_tailq, links) {
-		if (ahd->platform_data->host == shost)
+		if (ahd->platform_data->host->host_no == hostno)
 			break;
 	}
+#else
+	ahd = ahd_find_softc(*(struct ahd_softc **)shost->hostdata);
+#endif
 
 	if (ahd == NULL)
 		goto done;
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped
--- a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped	Thu Jan  8 23:00:24 2004
@@ -3,7 +3,7 @@
  *		 from the following source files:
  *
  * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
  */
 typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
 typedef struct ahd_reg_parse_entry {
@@ -2239,94 +2239,94 @@
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_dataptr_print;
+ahd_reg_print_t ahd_scb_tag_print;
 #else
-#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x190, regvalue, cur_col, wrap)
+#define ahd_scb_tag_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_TAG", 0x190, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_datacnt_print;
+ahd_reg_print_t ahd_scb_control_print;
 #else
-#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_DATACNT", 0x198, regvalue, cur_col, wrap)
+#define ahd_scb_control_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_CONTROL", 0x192, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_sgptr_print;
+ahd_reg_print_t ahd_scb_scsiid_print;
 #else
-#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_SGPTR", 0x19c, regvalue, cur_col, wrap)
+#define ahd_scb_scsiid_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_SCSIID", 0x193, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_busaddr_print;
+ahd_reg_print_t ahd_scb_lun_print;
 #else
-#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1a0, regvalue, cur_col, wrap)
+#define ahd_scb_lun_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_LUN", 0x194, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_next_print;
+ahd_reg_print_t ahd_scb_task_attribute_print;
 #else
-#define ahd_scb_next_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_NEXT", 0x1a4, regvalue, cur_col, wrap)
+#define ahd_scb_task_attribute_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE", 0x195, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_next2_print;
+ahd_reg_print_t ahd_scb_cdb_len_print;
 #else
-#define ahd_scb_next2_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_NEXT2", 0x1a6, regvalue, cur_col, wrap)
+#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x196, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_control_print;
+ahd_reg_print_t ahd_scb_task_management_print;
 #else
-#define ahd_scb_control_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_CONTROL", 0x1a8, regvalue, cur_col, wrap)
+#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x197, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_scsiid_print;
+ahd_reg_print_t ahd_scb_dataptr_print;
 #else
-#define ahd_scb_scsiid_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_SCSIID", 0x1a9, regvalue, cur_col, wrap)
+#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x198, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_lun_print;
+ahd_reg_print_t ahd_scb_datacnt_print;
 #else
-#define ahd_scb_lun_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_LUN", 0x1aa, regvalue, cur_col, wrap)
+#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_DATACNT", 0x1a0, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_task_attribute_print;
+ahd_reg_print_t ahd_scb_sgptr_print;
 #else
-#define ahd_scb_task_attribute_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE", 0x1ab, regvalue, cur_col, wrap)
+#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_SGPTR", 0x1a4, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_cdb_len_print;
+ahd_reg_print_t ahd_scb_busaddr_print;
 #else
-#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x1ac, regvalue, cur_col, wrap)
+#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1a8, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_task_management_print;
+ahd_reg_print_t ahd_scb_next_print;
 #else
-#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x1ad, regvalue, cur_col, wrap)
+#define ahd_scb_next_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_NEXT", 0x1ac, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
-ahd_reg_print_t ahd_scb_tag_print;
+ahd_reg_print_t ahd_scb_next2_print;
 #else
-#define ahd_scb_tag_print(regvalue, cur_col, wrap) \
-    ahd_print_register(NULL, 0, "SCB_TAG", 0x1ae, regvalue, cur_col, wrap)
+#define ahd_scb_next2_print(regvalue, cur_col, wrap) \
+    ahd_print_register(NULL, 0, "SCB_NEXT2", 0x1ae, regvalue, cur_col, wrap)
 #endif
 
 #if AIC_DEBUG_REGISTERS
@@ -2557,6 +2557,8 @@
 #define	SHORTTHRESH     		0x2f
 
 #define	LUNLEN          		0x30
+#define		TLUNLEN         	0xf0
+#define		ILUNLEN         	0x0f
 
 #define	CDBLIMIT        		0x31
 
@@ -3648,25 +3650,10 @@
 #define	SCB_SENSE_BUSADDR		0x18c
 #define	SCB_NEXT_COMPLETE		0x18c
 
-#define	SCB_DATAPTR     		0x190
-
-#define	SCB_DATACNT     		0x198
-#define		SG_LAST_SEG     	0x80
-#define		SG_HIGH_ADDR_BITS	0x7f
-
-#define	SCB_SGPTR       		0x19c
-#define		SG_STATUS_VALID 	0x04
-#define		SG_FULL_RESID   	0x02
-#define		SG_LIST_NULL    	0x01
+#define	SCB_TAG         		0x190
+#define	SCB_FIFO_USE_COUNT		0x190
 
-#define	SCB_BUSADDR     		0x1a0
-
-#define	SCB_NEXT        		0x1a4
-#define	SCB_NEXT_SCB_BUSADDR		0x1a4
-
-#define	SCB_NEXT2       		0x1a6
-
-#define	SCB_CONTROL     		0x1a8
+#define	SCB_CONTROL     		0x192
 #define		TARGET_SCB      	0x80
 #define		DISCENB         	0x40
 #define		TAG_ENB         	0x20
@@ -3675,23 +3662,38 @@
 #define		DISCONNECTED    	0x04
 #define		SCB_TAG_TYPE    	0x03
 
-#define	SCB_SCSIID      		0x1a9
+#define	SCB_SCSIID      		0x193
 #define		TID             	0xf0
 #define		OID             	0x0f
 
-#define	SCB_LUN         		0x1aa
+#define	SCB_LUN         		0x194
 #define		LID             	0xff
 
-#define	SCB_TASK_ATTRIBUTE		0x1ab
+#define	SCB_TASK_ATTRIBUTE		0x195
 #define		SCB_XFERLEN_ODD 	0x01
 
-#define	SCB_CDB_LEN     		0x1ac
+#define	SCB_CDB_LEN     		0x196
 #define		SCB_CDB_LEN_PTR 	0x80
 
-#define	SCB_TASK_MANAGEMENT		0x1ad
+#define	SCB_TASK_MANAGEMENT		0x197
+
+#define	SCB_DATAPTR     		0x198
+
+#define	SCB_DATACNT     		0x1a0
+#define		SG_LAST_SEG     	0x80
+#define		SG_HIGH_ADDR_BITS	0x7f
+
+#define	SCB_SGPTR       		0x1a4
+#define		SG_STATUS_VALID 	0x04
+#define		SG_FULL_RESID   	0x02
+#define		SG_LIST_NULL    	0x01
+
+#define	SCB_BUSADDR     		0x1a8
+
+#define	SCB_NEXT        		0x1ac
+#define	SCB_NEXT_SCB_BUSADDR		0x1ac
 
-#define	SCB_TAG         		0x1ae
-#define	SCB_FIFO_USE_COUNT		0x1ae
+#define	SCB_NEXT2       		0x1ae
 
 #define	SCB_SPARE       		0x1b0
 #define	SCB_PKT_LUN     		0x1b0
@@ -3720,6 +3722,7 @@
 #define	AHD_PRECOMP_CUTBACK_29	0x06
 #define	AHD_NUM_PER_DEV_ANNEXCOLS	0x04
 #define	B_CURRFIFO_0	0x02
+#define	LUNLEN_SINGLE_LEVEL_LUN	0x0f
 #define	NVRAM_SCB_OFFSET	0x2c
 #define	AHD_TIMER_MAX_US	0x18ffe7
 #define	AHD_TIMER_MAX_TICKS	0xffff
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped
--- a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped	Thu Jan  8 23:00:23 2004
@@ -2,8 +2,8 @@
  * DO NOT EDIT - This file is automatically generated
  *		 from the following source files:
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#93 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#68 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
  */
 
 #include "aic79xx_osm.h"
@@ -489,10 +489,15 @@
 	    0x2f, regvalue, cur_col, wrap));
 }
 
+static ahd_reg_parse_entry_t LUNLEN_parse_table[] = {
+	{ "ILUNLEN",		0x0f, 0x0f },
+	{ "TLUNLEN",		0xf0, 0xf0 }
+};
+
 int
 ahd_lunlen_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahd_print_register(NULL, 0, "LUNLEN",
+	return (ahd_print_register(LUNLEN_parse_table, 2, "LUNLEN",
 	    0x30, regvalue, cur_col, wrap));
 }
 
@@ -3486,58 +3491,12 @@
 }
 
 int
-ahd_scb_dataptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
+ahd_scb_tag_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahd_print_register(NULL, 0, "SCB_DATAPTR",
+	return (ahd_print_register(NULL, 0, "SCB_TAG",
 	    0x190, regvalue, cur_col, wrap));
 }
 
-static ahd_reg_parse_entry_t SCB_DATACNT_parse_table[] = {
-	{ "SG_HIGH_ADDR_BITS",	0x7f, 0x7f },
-	{ "SG_LAST_SEG",	0x80, 0x80 }
-};
-
-int
-ahd_scb_datacnt_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahd_print_register(SCB_DATACNT_parse_table, 2, "SCB_DATACNT",
-	    0x198, regvalue, cur_col, wrap));
-}
-
-static ahd_reg_parse_entry_t SCB_SGPTR_parse_table[] = {
-	{ "SG_LIST_NULL",	0x01, 0x01 },
-	{ "SG_FULL_RESID",	0x02, 0x02 },
-	{ "SG_STATUS_VALID",	0x04, 0x04 }
-};
-
-int
-ahd_scb_sgptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahd_print_register(SCB_SGPTR_parse_table, 3, "SCB_SGPTR",
-	    0x19c, regvalue, cur_col, wrap));
-}
-
-int
-ahd_scb_busaddr_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahd_print_register(NULL, 0, "SCB_BUSADDR",
-	    0x1a0, regvalue, cur_col, wrap));
-}
-
-int
-ahd_scb_next_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahd_print_register(NULL, 0, "SCB_NEXT",
-	    0x1a4, regvalue, cur_col, wrap));
-}
-
-int
-ahd_scb_next2_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahd_print_register(NULL, 0, "SCB_NEXT2",
-	    0x1a6, regvalue, cur_col, wrap));
-}
-
 static ahd_reg_parse_entry_t SCB_CONTROL_parse_table[] = {
 	{ "SCB_TAG_TYPE",	0x03, 0x03 },
 	{ "DISCONNECTED",	0x04, 0x04 },
@@ -3552,7 +3511,7 @@
 ahd_scb_control_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
 	return (ahd_print_register(SCB_CONTROL_parse_table, 7, "SCB_CONTROL",
-	    0x1a8, regvalue, cur_col, wrap));
+	    0x192, regvalue, cur_col, wrap));
 }
 
 static ahd_reg_parse_entry_t SCB_SCSIID_parse_table[] = {
@@ -3564,7 +3523,7 @@
 ahd_scb_scsiid_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
 	return (ahd_print_register(SCB_SCSIID_parse_table, 2, "SCB_SCSIID",
-	    0x1a9, regvalue, cur_col, wrap));
+	    0x193, regvalue, cur_col, wrap));
 }
 
 static ahd_reg_parse_entry_t SCB_LUN_parse_table[] = {
@@ -3575,14 +3534,18 @@
 ahd_scb_lun_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
 	return (ahd_print_register(SCB_LUN_parse_table, 1, "SCB_LUN",
-	    0x1aa, regvalue, cur_col, wrap));
+	    0x194, regvalue, cur_col, wrap));
 }
 
+static ahd_reg_parse_entry_t SCB_TASK_ATTRIBUTE_parse_table[] = {
+	{ "SCB_XFERLEN_ODD",	0x01, 0x01 }
+};
+
 int
 ahd_scb_task_attribute_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE",
-	    0x1ab, regvalue, cur_col, wrap));
+	return (ahd_print_register(SCB_TASK_ATTRIBUTE_parse_table, 1, "SCB_TASK_ATTRIBUTE",
+	    0x195, regvalue, cur_col, wrap));
 }
 
 static ahd_reg_parse_entry_t SCB_CDB_LEN_parse_table[] = {
@@ -3593,20 +3556,66 @@
 ahd_scb_cdb_len_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
 	return (ahd_print_register(SCB_CDB_LEN_parse_table, 1, "SCB_CDB_LEN",
-	    0x1ac, regvalue, cur_col, wrap));
+	    0x196, regvalue, cur_col, wrap));
 }
 
 int
 ahd_scb_task_management_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
 	return (ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT",
-	    0x1ad, regvalue, cur_col, wrap));
+	    0x197, regvalue, cur_col, wrap));
 }
 
 int
-ahd_scb_tag_print(u_int regvalue, u_int *cur_col, u_int wrap)
+ahd_scb_dataptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahd_print_register(NULL, 0, "SCB_TAG",
+	return (ahd_print_register(NULL, 0, "SCB_DATAPTR",
+	    0x198, regvalue, cur_col, wrap));
+}
+
+static ahd_reg_parse_entry_t SCB_DATACNT_parse_table[] = {
+	{ "SG_HIGH_ADDR_BITS",	0x7f, 0x7f },
+	{ "SG_LAST_SEG",	0x80, 0x80 }
+};
+
+int
+ahd_scb_datacnt_print(u_int regvalue, u_int *cur_col, u_int wrap)
+{
+	return (ahd_print_register(SCB_DATACNT_parse_table, 2, "SCB_DATACNT",
+	    0x1a0, regvalue, cur_col, wrap));
+}
+
+static ahd_reg_parse_entry_t SCB_SGPTR_parse_table[] = {
+	{ "SG_LIST_NULL",	0x01, 0x01 },
+	{ "SG_FULL_RESID",	0x02, 0x02 },
+	{ "SG_STATUS_VALID",	0x04, 0x04 }
+};
+
+int
+ahd_scb_sgptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
+{
+	return (ahd_print_register(SCB_SGPTR_parse_table, 3, "SCB_SGPTR",
+	    0x1a4, regvalue, cur_col, wrap));
+}
+
+int
+ahd_scb_busaddr_print(u_int regvalue, u_int *cur_col, u_int wrap)
+{
+	return (ahd_print_register(NULL, 0, "SCB_BUSADDR",
+	    0x1a8, regvalue, cur_col, wrap));
+}
+
+int
+ahd_scb_next_print(u_int regvalue, u_int *cur_col, u_int wrap)
+{
+	return (ahd_print_register(NULL, 0, "SCB_NEXT",
+	    0x1ac, regvalue, cur_col, wrap));
+}
+
+int
+ahd_scb_next2_print(u_int regvalue, u_int *cur_col, u_int wrap)
+{
+	return (ahd_print_register(NULL, 0, "SCB_NEXT2",
 	    0x1ae, regvalue, cur_col, wrap));
 }
 
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped
--- a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped	Thu Jan  8 23:00:24 2004
@@ -3,7 +3,7 @@
  *		 from the following source files:
  *
  * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
  */
 static uint8_t seqprog[] = {
 	0xff, 0x02, 0x06, 0x78,
@@ -40,13 +40,13 @@
 	0x01, 0x52, 0x64, 0x78,
 	0x02, 0x58, 0x50, 0x31,
 	0xff, 0xea, 0x10, 0x0b,
-	0xff, 0xad, 0x4f, 0x78,
+	0xff, 0x97, 0x4f, 0x78,
 	0x50, 0x4b, 0x4a, 0x68,
 	0xbf, 0x3a, 0x74, 0x08,
 	0x14, 0xea, 0x50, 0x59,
 	0x14, 0xea, 0x04, 0x00,
-	0x08, 0xa8, 0x51, 0x03,
-	0xff, 0xae, 0x3f, 0x68,
+	0x08, 0x92, 0x25, 0x03,
+	0xff, 0x90, 0x3f, 0x68,
 	0x00, 0xe2, 0x56, 0x5b,
 	0x00, 0xe2, 0x3e, 0x40,
 	0x00, 0xea, 0x44, 0x59,
@@ -113,24 +113,24 @@
 	0xff, 0xea, 0xc0, 0x09,
 	0x01, 0x4e, 0x9d, 0x1a,
 	0x00, 0x4f, 0x9f, 0x22,
-	0x01, 0xaa, 0x6d, 0x33,
-	0x01, 0xea, 0x5c, 0x33,
-	0x04, 0xa4, 0x49, 0x32,
-	0xff, 0xea, 0x4a, 0x03,
-	0xff, 0xea, 0x4e, 0x03,
+	0x01, 0x94, 0x6d, 0x33,
+	0x01, 0xea, 0x20, 0x33,
+	0x04, 0xac, 0x49, 0x32,
+	0xff, 0xea, 0x5a, 0x03,
+	0xff, 0xea, 0x5e, 0x03,
 	0x01, 0x10, 0xd4, 0x31,
-	0x10, 0xa8, 0xf5, 0x68,
-	0x3d, 0xa9, 0xc5, 0x29,
+	0x10, 0x92, 0xf5, 0x68,
+	0x3d, 0x93, 0xc5, 0x29,
 	0xfe, 0xe2, 0xc4, 0x09,
 	0x01, 0xea, 0xc6, 0x01,
 	0x02, 0xe2, 0xc8, 0x31,
 	0x02, 0xec, 0x50, 0x31,
 	0x02, 0xa0, 0xda, 0x31,
 	0xff, 0xa9, 0xf4, 0x70,
-	0x02, 0xa0, 0x48, 0x37,
+	0x02, 0xa0, 0x58, 0x37,
 	0xff, 0x21, 0xfd, 0x70,
 	0x02, 0x22, 0x51, 0x31,
-	0x02, 0xa0, 0x4c, 0x33,
+	0x02, 0xa0, 0x5c, 0x33,
 	0x02, 0xa0, 0x44, 0x36,
 	0x02, 0xa0, 0x40, 0x32,
 	0x02, 0xa0, 0x44, 0x36,
@@ -161,7 +161,7 @@
 	0x04, 0x24, 0xf9, 0x30,
 	0x1d, 0xea, 0x3a, 0x41,
 	0x02, 0x2c, 0x51, 0x31,
-	0x04, 0xa0, 0xf9, 0x30,
+	0x04, 0xa8, 0xf9, 0x30,
 	0x19, 0xea, 0x3a, 0x41,
 	0x06, 0xea, 0x08, 0x81,
 	0x01, 0xe2, 0x5a, 0x35,
@@ -179,8 +179,8 @@
 	0x02, 0x20, 0xbd, 0x30,
 	0x02, 0x20, 0xb9, 0x30,
 	0x02, 0x20, 0x51, 0x31,
-	0x4c, 0xa9, 0xd7, 0x28,
-	0x10, 0xa8, 0x63, 0x79,
+	0x4c, 0x93, 0xd7, 0x28,
+	0x10, 0x92, 0x63, 0x79,
 	0x01, 0x6b, 0xc0, 0x30,
 	0x02, 0x64, 0xc8, 0x00,
 	0x40, 0x3a, 0x74, 0x04,
@@ -219,42 +219,42 @@
 	0xff, 0xea, 0xb2, 0x09,
 	0xff, 0xe0, 0xc0, 0x19,
 	0xff, 0xe0, 0xb0, 0x79,
-	0x02, 0xa4, 0x51, 0x31,
+	0x02, 0xac, 0x51, 0x31,
 	0x00, 0xe2, 0xa6, 0x41,
 	0x02, 0x5e, 0x50, 0x31,
 	0x02, 0xa8, 0xb8, 0x30,
 	0x02, 0x5c, 0x50, 0x31,
-	0xff, 0xa5, 0xc1, 0x71,
-	0x02, 0xa4, 0x41, 0x31,
+	0xff, 0xad, 0xc1, 0x71,
+	0x02, 0xac, 0x41, 0x31,
 	0x02, 0x22, 0x51, 0x31,
-	0x02, 0xa0, 0x4c, 0x33,
+	0x02, 0xa0, 0x5c, 0x33,
 	0x02, 0xa0, 0x44, 0x32,
 	0x00, 0xe2, 0xca, 0x41,
-	0x10, 0xa8, 0xcb, 0x69,
-	0x3d, 0xa9, 0xc9, 0x29,
+	0x10, 0x92, 0xcb, 0x69,
+	0x3d, 0x93, 0xc9, 0x29,
 	0x01, 0xe4, 0xc8, 0x01,
 	0x01, 0xea, 0xca, 0x01,
 	0xff, 0xea, 0xda, 0x01,
 	0x02, 0x20, 0x51, 0x31,
-	0x02, 0xa6, 0x41, 0x32,
+	0x02, 0xae, 0x41, 0x32,
 	0xff, 0x21, 0xd3, 0x61,
 	0xff, 0xea, 0x46, 0x02,
 	0x02, 0x5c, 0x50, 0x31,
 	0x40, 0xea, 0x96, 0x00,
 	0x02, 0x56, 0xcc, 0x6d,
 	0x01, 0x55, 0xcc, 0x6d,
-	0x10, 0xa8, 0xdf, 0x79,
+	0x10, 0x92, 0xdf, 0x79,
 	0x10, 0x40, 0xe8, 0x69,
 	0x01, 0x56, 0xe8, 0x79,
-	0xff, 0xad, 0x07, 0x78,
+	0xff, 0x97, 0x07, 0x78,
 	0x13, 0xea, 0x50, 0x59,
 	0x13, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x06, 0x40,
 	0xbf, 0x3a, 0x74, 0x08,
 	0x08, 0xea, 0x98, 0x00,
 	0x08, 0x57, 0xae, 0x00,
-	0x01, 0xa9, 0x69, 0x32,
-	0x01, 0xaa, 0x6b, 0x32,
+	0x01, 0x93, 0x69, 0x32,
+	0x01, 0x94, 0x6b, 0x32,
 	0x40, 0xea, 0x66, 0x02,
 	0x08, 0x3c, 0x78, 0x00,
 	0x80, 0xea, 0x62, 0x02,
@@ -277,13 +277,13 @@
 	0x33, 0xea, 0x00, 0x00,
 	0x02, 0xa8, 0x90, 0x32,
 	0x00, 0xe2, 0x6a, 0x59,
-	0xef, 0xac, 0xd5, 0x19,
+	0xef, 0x96, 0xd5, 0x19,
 	0x00, 0xe2, 0x2a, 0x52,
 	0x09, 0x80, 0xe1, 0x30,
 	0x02, 0xea, 0x36, 0x00,
 	0xa8, 0xea, 0x32, 0x00,
 	0x00, 0xe2, 0x30, 0x42,
-	0x01, 0xac, 0xd1, 0x30,
+	0x01, 0x96, 0xd1, 0x30,
 	0x10, 0x80, 0x89, 0x31,
 	0x20, 0xea, 0x32, 0x00,
 	0xbf, 0x33, 0x67, 0x0a,
@@ -293,20 +293,20 @@
 	0x00, 0xe2, 0xf8, 0x41,
 	0x80, 0x33, 0xb5, 0x6a,
 	0x01, 0x44, 0x10, 0x33,
-	0x08, 0xa8, 0x51, 0x03,
+	0x08, 0x92, 0x25, 0x03,
 	0x00, 0xe2, 0xf8, 0x41,
 	0x10, 0xea, 0x80, 0x00,
 	0x01, 0x31, 0xc5, 0x31,
 	0x80, 0xe2, 0x60, 0x62,
-	0x10, 0xa8, 0x85, 0x6a,
-	0xc0, 0xaa, 0xc5, 0x01,
-	0x40, 0xa8, 0x51, 0x6a,
+	0x10, 0x92, 0x85, 0x6a,
+	0xc0, 0x94, 0xc5, 0x01,
+	0x40, 0x92, 0x51, 0x6a,
 	0xbf, 0xe2, 0xc4, 0x09,
-	0x20, 0xa8, 0x65, 0x7a,
+	0x20, 0x92, 0x65, 0x7a,
 	0x01, 0xe2, 0x88, 0x30,
 	0x00, 0xe2, 0xb8, 0x5b,
 	0xa0, 0x36, 0x6d, 0x62,
-	0x23, 0xa8, 0x89, 0x08,
+	0x23, 0x92, 0x89, 0x08,
 	0x00, 0xe2, 0xb8, 0x5b,
 	0xa0, 0x36, 0x6d, 0x62,
 	0x00, 0xa8, 0x64, 0x42,
@@ -348,7 +348,7 @@
 	0xa0, 0xea, 0xca, 0x5b,
 	0x01, 0xa0, 0xba, 0x62,
 	0x01, 0x84, 0xaf, 0x7a,
-	0x01, 0xab, 0xbd, 0x6a,
+	0x01, 0x95, 0xbd, 0x6a,
 	0x05, 0xea, 0x50, 0x59,
 	0x05, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0xbc, 0x42,
@@ -381,22 +381,22 @@
 	0x20, 0x46, 0x12, 0x63,
 	0xff, 0xea, 0x52, 0x09,
 	0xa8, 0xea, 0xca, 0x5b,
-	0x04, 0xa8, 0xf9, 0x7a,
+	0x04, 0x92, 0xf9, 0x7a,
 	0x01, 0x34, 0xc1, 0x31,
-	0x00, 0xa9, 0xf9, 0x62,
+	0x00, 0x93, 0xf9, 0x62,
 	0x01, 0x35, 0xc1, 0x31,
-	0x00, 0xaa, 0x03, 0x73,
+	0x00, 0x94, 0x03, 0x73,
 	0x01, 0xa9, 0x52, 0x11,
 	0xff, 0xa9, 0xee, 0x6a,
 	0x00, 0xe2, 0x12, 0x43,
 	0x10, 0x33, 0x67, 0x02,
-	0x04, 0xa8, 0x13, 0x7b,
-	0xfb, 0xa8, 0x51, 0x0b,
+	0x04, 0x92, 0x13, 0x7b,
+	0xfb, 0x92, 0x25, 0x0b,
 	0xff, 0xea, 0x66, 0x0a,
-	0x01, 0x9c, 0x0d, 0x6b,
+	0x01, 0xa4, 0x0d, 0x6b,
 	0x02, 0xa8, 0x90, 0x32,
 	0x00, 0xe2, 0x6a, 0x59,
-	0x10, 0xa8, 0xbd, 0x7a,
+	0x10, 0x92, 0xbd, 0x7a,
 	0xff, 0xea, 0xdc, 0x5b,
 	0x00, 0xe2, 0xbc, 0x42,
 	0x04, 0xea, 0x50, 0x59,
@@ -405,12 +405,12 @@
 	0x04, 0xea, 0x50, 0x59,
 	0x04, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0xf8, 0x41,
-	0x08, 0xa8, 0xb5, 0x7a,
+	0x08, 0x92, 0xb5, 0x7a,
 	0xc0, 0x33, 0x29, 0x7b,
 	0x80, 0x33, 0xb5, 0x6a,
 	0xff, 0x88, 0x29, 0x6b,
 	0x40, 0x33, 0xb5, 0x6a,
-	0x10, 0xa8, 0x2f, 0x7b,
+	0x10, 0x92, 0x2f, 0x7b,
 	0x0a, 0xea, 0x50, 0x59,
 	0x0a, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x4e, 0x5b,
@@ -428,22 +428,22 @@
 	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x02, 0x42, 0x51, 0x31,
-	0xff, 0xae, 0x65, 0x68,
+	0xff, 0x90, 0x65, 0x68,
 	0xff, 0x88, 0x5b, 0x6b,
-	0x01, 0x9c, 0x57, 0x6b,
-	0x02, 0x9c, 0x5f, 0x6b,
+	0x01, 0xa4, 0x57, 0x6b,
+	0x02, 0xa4, 0x5f, 0x6b,
 	0x01, 0x84, 0x5f, 0x7b,
 	0x02, 0x28, 0x19, 0x33,
 	0x02, 0xa8, 0x50, 0x36,
 	0xff, 0x88, 0x5f, 0x73,
 	0x00, 0xe2, 0x32, 0x5b,
-	0x02, 0xa8, 0x5c, 0x33,
+	0x02, 0xa8, 0x20, 0x33,
 	0x02, 0x2c, 0x19, 0x33,
 	0x02, 0xa8, 0x58, 0x32,
-	0x04, 0x9c, 0x39, 0x07,
+	0x04, 0xa4, 0x49, 0x07,
 	0xc0, 0x33, 0xb5, 0x6a,
-	0x04, 0xa8, 0x51, 0x03,
-	0x20, 0xa8, 0x83, 0x6b,
+	0x04, 0x92, 0x25, 0x03,
+	0x20, 0x92, 0x83, 0x6b,
 	0x02, 0xa8, 0x40, 0x31,
 	0xc0, 0x34, 0xc1, 0x09,
 	0x00, 0x35, 0x51, 0x01,
@@ -470,9 +470,9 @@
 	0x00, 0xe2, 0x9e, 0x5b,
 	0x00, 0xe2, 0xf8, 0x41,
 	0x01, 0x84, 0xa3, 0x7b,
-	0x01, 0x9c, 0x39, 0x07,
-	0x08, 0x60, 0x20, 0x33,
-	0x08, 0x80, 0x31, 0x37,
+	0x01, 0xa4, 0x49, 0x07,
+	0x08, 0x60, 0x30, 0x33,
+	0x08, 0x80, 0x41, 0x37,
 	0xdf, 0x33, 0x67, 0x0a,
 	0xee, 0x00, 0xb0, 0x6b,
 	0x05, 0xea, 0xb4, 0x00,
@@ -542,14 +542,14 @@
 	0x01, 0xac, 0xd4, 0x99,
 	0x00, 0xe2, 0x64, 0x50,
 	0xfe, 0xa6, 0x4c, 0x0d,
-	0x0b, 0x90, 0xe1, 0x30,
-	0xfd, 0x9c, 0x49, 0x09,
-	0x80, 0x9b, 0x39, 0x7c,
+	0x0b, 0x98, 0xe1, 0x30,
+	0xfd, 0xa4, 0x49, 0x09,
+	0x80, 0xa3, 0x39, 0x7c,
 	0x02, 0xa4, 0x48, 0x01,
 	0x01, 0xa4, 0x36, 0x30,
 	0xa8, 0xea, 0x32, 0x00,
-	0xfd, 0x9c, 0x39, 0x0b,
-	0x05, 0x9b, 0x07, 0x33,
+	0xfd, 0xa4, 0x49, 0x0b,
+	0x05, 0xa3, 0x07, 0x33,
 	0x80, 0x83, 0x45, 0x6c,
 	0x02, 0xea, 0x4c, 0x05,
 	0xff, 0xea, 0x4c, 0x0d,
@@ -577,7 +577,7 @@
 	0x09, 0xea, 0x50, 0x59,
 	0x09, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0xf8, 0x41,
-	0x01, 0x9c, 0x5d, 0x6c,
+	0x01, 0xa4, 0x5d, 0x6c,
 	0x00, 0xe2, 0x30, 0x5c,
 	0x20, 0x33, 0x67, 0x02,
 	0x01, 0x00, 0x60, 0x32,
@@ -646,15 +646,15 @@
 	0x80, 0xf9, 0xea, 0x6c,
 	0xdf, 0x5c, 0xb8, 0x08,
 	0x01, 0xd9, 0xb2, 0x05,
-	0x01, 0x9c, 0xe5, 0x6d,
+	0x01, 0xa4, 0xe5, 0x6d,
 	0x00, 0xe2, 0x30, 0x5c,
 	0x00, 0xe2, 0x34, 0x5d,
-	0x01, 0xae, 0x5d, 0x1b,
+	0x01, 0x90, 0x21, 0x1b,
 	0x01, 0xd9, 0xb2, 0x05,
 	0x00, 0xe2, 0x32, 0x5b,
-	0xf3, 0xac, 0xd5, 0x19,
+	0xf3, 0x96, 0xd5, 0x19,
 	0x00, 0xe2, 0x18, 0x55,
-	0x80, 0xac, 0x19, 0x6d,
+	0x80, 0x96, 0x19, 0x6d,
 	0x0f, 0xea, 0x50, 0x59,
 	0x0f, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x20, 0x45,
@@ -662,7 +662,7 @@
 	0x01, 0xea, 0xf2, 0x00,
 	0x02, 0xea, 0x36, 0x00,
 	0xa8, 0xea, 0x32, 0x00,
-	0xff, 0xad, 0x27, 0x7d,
+	0xff, 0x97, 0x27, 0x7d,
 	0x14, 0xea, 0x50, 0x59,
 	0x14, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x96, 0x5d,
@@ -700,10 +700,10 @@
 	0x01, 0x1a, 0x64, 0x78,
 	0x80, 0xf9, 0xf2, 0x01,
 	0x20, 0xa0, 0xcc, 0x7d,
-	0xff, 0xae, 0x5d, 0x1b,
-	0x08, 0xa8, 0x43, 0x6b,
+	0xff, 0x90, 0x21, 0x1b,
+	0x08, 0x92, 0x43, 0x6b,
 	0x02, 0xea, 0xb4, 0x04,
-	0x01, 0x9c, 0x39, 0x03,
+	0x01, 0xa4, 0x49, 0x03,
 	0x40, 0x5b, 0x82, 0x6d,
 	0x00, 0xe2, 0x3e, 0x59,
 	0x40, 0x5b, 0x82, 0x6d,
@@ -714,8 +714,8 @@
 	0x04, 0x5d, 0xe6, 0x7d,
 	0x01, 0x1a, 0xe6, 0x7d,
 	0x80, 0xf9, 0xf2, 0x01,
-	0xff, 0xae, 0x5d, 0x1b,
-	0x08, 0xa8, 0x43, 0x6b,
+	0xff, 0x90, 0x21, 0x1b,
+	0x08, 0x92, 0x43, 0x6b,
 	0x02, 0xea, 0xb4, 0x04,
 	0x00, 0xe2, 0x3e, 0x59,
 	0x01, 0x1b, 0x64, 0x78,
@@ -729,7 +729,7 @@
 	0x01, 0x1a, 0x64, 0x78,
 	0x80, 0xf9, 0xf2, 0x01,
 	0xff, 0xea, 0x10, 0x03,
-	0x08, 0xa8, 0x51, 0x03,
+	0x08, 0x92, 0x25, 0x03,
 	0x00, 0xe2, 0x42, 0x43,
 	0x01, 0x1a, 0xb4, 0x7d,
 	0x40, 0x5b, 0xb0, 0x7d,
@@ -743,14 +743,14 @@
 	0x20, 0x4d, 0x64, 0x78,
 	0x40, 0x5b, 0x9e, 0x6d,
 	0x01, 0x1a, 0x64, 0x78,
-	0x01, 0xae, 0x5d, 0x1b,
+	0x01, 0x90, 0x21, 0x1b,
 	0x30, 0x3f, 0xc0, 0x09,
 	0x30, 0xe0, 0x64, 0x60,
 	0x40, 0x4b, 0x64, 0x68,
 	0xff, 0xea, 0x52, 0x01,
 	0xee, 0x00, 0xd2, 0x6d,
 	0x80, 0xf9, 0xf2, 0x01,
-	0xff, 0xae, 0x5d, 0x1b,
+	0xff, 0x90, 0x21, 0x1b,
 	0x02, 0xea, 0xb4, 0x00,
 	0x20, 0xea, 0x9a, 0x00,
 	0xf3, 0x42, 0xde, 0x6d,
@@ -760,7 +760,7 @@
 	0x0d, 0xea, 0x50, 0x59,
 	0x0d, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0xf8, 0x41,
-	0x01, 0xae, 0x5d, 0x1b,
+	0x01, 0x90, 0x21, 0x1b,
 	0x11, 0xea, 0x50, 0x59,
 	0x11, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x32, 0x5b,
@@ -776,9 +776,9 @@
 	0x20, 0x4d, 0x64, 0x78,
 	0x02, 0x84, 0x09, 0x03,
 	0x40, 0x5b, 0xcc, 0x7d,
-	0xff, 0xae, 0x5d, 0x1b,
+	0xff, 0x90, 0x21, 0x1b,
 	0x80, 0xf9, 0xf2, 0x01,
-	0x08, 0xa8, 0x43, 0x6b,
+	0x08, 0x92, 0x43, 0x6b,
 	0x02, 0xea, 0xb4, 0x04,
 	0x01, 0x38, 0xe1, 0x30,
 	0x05, 0x39, 0xe3, 0x98,
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h
--- a/drivers/scsi/aic7xxx/aic7xxx.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx.h	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#77 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#79 $
  *
  * $FreeBSD$
  */
@@ -1143,17 +1143,17 @@
 	char			*name;
 	ahc_device_setup_t	*setup;
 };
-extern struct ahc_pci_identity ahc_pci_ident_table [];
+extern struct ahc_pci_identity ahc_pci_ident_table[];
 extern const u_int ahc_num_pci_devs;
 
 /***************************** VL/EISA Declarations ***************************/
 struct aic7770_identity {
 	uint32_t		 full_id;
 	uint32_t		 id_mask;
-	char			*name;
+	const char		*name;
 	ahc_device_setup_t	*setup;
 };
-extern struct aic7770_identity aic7770_ident_table [];
+extern struct aic7770_identity aic7770_ident_table[];
 extern const int ahc_num_aic7770_devs;
 
 #define AHC_EISA_SLOT_OFFSET	0xc00
@@ -1205,7 +1205,7 @@
 void			 ahc_set_name(struct ahc_softc *, char *);
 void			 ahc_alloc_scbs(struct ahc_softc *ahc);
 void			 ahc_free(struct ahc_softc *ahc);
-int			 ahc_reset(struct ahc_softc *ahc);
+int			 ahc_reset(struct ahc_softc *ahc, int reinit);
 void			 ahc_shutdown(void *arg);
 
 /*************************** Interrupt Services *******************************/
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c
--- a/drivers/scsi/aic7xxx/aic7xxx_core.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_core.c	Thu Jan  8 23:00:24 2004
@@ -37,7 +37,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#131 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#134 $
  *
  * $FreeBSD$
  */
@@ -1304,17 +1304,23 @@
 				ahc_qinfifo_requeue_tail(ahc, scb);
 				printerror = 0;
 			} else if (ahc_sent_msg(ahc, AHCMSG_EXT,
-						MSG_EXT_WDTR, FALSE)
-				|| ahc_sent_msg(ahc, AHCMSG_EXT,
-						MSG_EXT_SDTR, FALSE)) {
+						MSG_EXT_WDTR, FALSE)) {
 				/*
-				 * Negotiation Rejected.  Go-async and
+				 * Negotiation Rejected.  Go-narrow and
 				 * retry command.
 				 */
 				ahc_set_width(ahc, &devinfo,
 					      MSG_EXT_WDTR_BUS_8_BIT,
 					      AHC_TRANS_CUR|AHC_TRANS_GOAL,
 					      /*paused*/TRUE);
+				ahc_qinfifo_requeue_tail(ahc, scb);
+				printerror = 0;
+			} else if (ahc_sent_msg(ahc, AHCMSG_EXT,
+						MSG_EXT_SDTR, FALSE)) {
+				/*
+				 * Negotiation Rejected.  Go-async and
+				 * retry command.
+				 */
 				ahc_set_syncrate(ahc, &devinfo,
 						/*syncrate*/NULL,
 						/*period*/0, /*offset*/0,
@@ -1463,7 +1469,7 @@
 				 * current connection, so we must
 				 * leave it on while single stepping.
 				 */
-				ahc_outb(ahc, SIMODE1, ENBUSFREE);
+				ahc_outb(ahc, SIMODE1, simode1 & ENBUSFREE);
 			else
 				ahc_outb(ahc, SIMODE1, 0);
 			ahc_outb(ahc, CLRINT, CLRSCSIINT);
@@ -2373,6 +2379,7 @@
 	 * may change.
 	 */
 	period = tinfo->goal.period;
+	offset = tinfo->goal.offset;
 	ppr_options = tinfo->goal.ppr_options;
 	/* Target initiated PPR is not allowed in the SCSI spec */
 	if (devinfo->role == ROLE_TARGET)
@@ -2380,7 +2387,7 @@
 	rate = ahc_devlimited_syncrate(ahc, tinfo, &period,
 				       &ppr_options, devinfo->role);
 	dowide = tinfo->curr.width != tinfo->goal.width;
-	dosync = tinfo->curr.period != period;
+	dosync = tinfo->curr.offset != offset || tinfo->curr.period != period;
 	/*
 	 * Only use PPR if we have options that need it, even if the device
 	 * claims to support it.  There might be an expander in the way
@@ -3176,23 +3183,30 @@
 				response = TRUE;
 				sending_reply = TRUE;
 			}
+			/*
+			 * After a wide message, we are async, but
+			 * some devices don't seem to honor this portion
+			 * of the spec.  Force a renegotiation of the
+			 * sync component of our transfer agreement even
+			 * if our goal is async.  By updating our width
+			 * after forcing the negotiation, we avoid
+			 * renegotiating for width.
+			 */
+			ahc_update_neg_request(ahc, devinfo, tstate,
+					       tinfo, AHC_NEG_ALWAYS);
 			ahc_set_width(ahc, devinfo, bus_width,
 				      AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
 				      /*paused*/TRUE);
-			/* After a wide message, we are async */
-			ahc_set_syncrate(ahc, devinfo,
-					 /*syncrate*/NULL, /*period*/0,
-					 /*offset*/0, /*ppr_options*/0,
-					 AHC_TRANS_ACTIVE, /*paused*/TRUE);
 			if (sending_reply == FALSE && reject == FALSE) {
 
-				if (tinfo->goal.offset) {
-					ahc->msgout_index = 0;
-					ahc->msgout_len = 0;
-					ahc_build_transfer_msg(ahc, devinfo);
-					ahc->msgout_index = 0;
-					response = TRUE;
-				}
+				/*
+				 * We will always have an SDTR to send.
+				 */
+				ahc->msgout_index = 0;
+				ahc->msgout_len = 0;
+				ahc_build_transfer_msg(ahc, devinfo);
+				ahc->msgout_index = 0;
+				response = TRUE;
 			}
 			done = MSGLOOP_MSGCOMPLETE;
 			break;
@@ -4033,7 +4047,7 @@
 	ahc = (struct ahc_softc *)arg;
 
 	/* This will reset most registers to 0, but not all */
-	ahc_reset(ahc);
+	ahc_reset(ahc, /*reinit*/FALSE);
 	ahc_outb(ahc, SCSISEQ, 0);
 	ahc_outb(ahc, SXFRCTL0, 0);
 	ahc_outb(ahc, DSPCISTATUS, 0);
@@ -4044,10 +4058,15 @@
 
 /*
  * Reset the controller and record some information about it
- * that is only available just after a reset.
+ * that is only available just after a reset.  If "reinit" is
+ * non-zero, this reset occured after initial configuration
+ * and the caller requests that the chip be fully reinitialized
+ * to a runable state.  Chip interrupts are *not* enabled after
+ * a reinitialization.  The caller must enable interrupts via
+ * ahc_intr_enable().
  */
 int
-ahc_reset(struct ahc_softc *ahc)
+ahc_reset(struct ahc_softc *ahc, int reinit)
 {
 	u_int	sblkctl;
 	u_int	sxfrctl1_a, sxfrctl1_b;
@@ -4143,7 +4162,7 @@
 	ahc_outb(ahc, SXFRCTL1, sxfrctl1_a);
 
 	error = 0;
-	if (ahc->init_level > 0)
+	if (reinit != 0)
 		/*
 		 * If a recovery action has forced a chip reset,
 		 * re-initialize the chip to our liking.
@@ -4725,14 +4744,12 @@
 		 * never settle, so don't complain if we
 		 * fail here.
 		 */
-		ahc_pause(ahc);
 		for (wait = 5000;
 		     (ahc_inb(ahc, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
 		     wait--)
 			ahc_delay(100);
-		ahc_unpause(ahc);
 	}
-
+	ahc_restart(ahc);
 	return (0);
 }
 
@@ -5145,7 +5162,9 @@
 ahc_resume(struct ahc_softc *ahc)
 {
 
-	ahc_reset(ahc);
+	ahc_reset(ahc, /*reinit*/TRUE);
+	ahc_intr_enable(ahc, TRUE); 
+	ahc_restart(ahc);
 	return (0);
 }
 
@@ -6407,7 +6426,6 @@
 		memcpy(ahc->critical_sections, cs_table, cs_count);
 	}
 	ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE);
-	ahc_restart(ahc);
 
 	if (bootverbose) {
 		printf(" %d instructions downloaded\n", downloaded);
@@ -6968,11 +6986,12 @@
 			 */
 			ahc->flags = saved_flags;
 			(void)ahc_loadseq(ahc);
-			ahc_unpause(ahc);
+			ahc_restart(ahc);
 			ahc_unlock(ahc, &s);
 			ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
 			return;
 		}
+		ahc_restart(ahc);
 		ahc_unlock(ahc, &s);
 	}
 	cel = &ccb->cel;
@@ -7207,12 +7226,16 @@
 				printf("Configuring Initiator Mode\n");
 				ahc->flags &= ~AHC_TARGETROLE;
 				ahc->flags |= AHC_INITIATORROLE;
-				ahc_pause(ahc);
 				/*
 				 * Returning to a configuration that
 				 * fit previously will always succeed.
 				 */
 				(void)ahc_loadseq(ahc);
+				ahc_restart(ahc);
+				/*
+				 * Unpaused.  The extra unpause
+				 * that follows is harmless.
+				 */
 			}
 		}
 		ahc_unpause(ahc);
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c	Thu Jan  8 23:00:23 2004
@@ -1,7 +1,7 @@
 /*
  * Adaptec AIC7xxx device driver for Linux.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#232 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#235 $
  *
  * Copyright (c) 1994 John Aycock
  *   The University of Calgary Department of Computer Science.
@@ -293,7 +293,7 @@
 #define AIC7XXX_CONFIGED_DV -1
 #endif
 
-static uint8_t aic7xxx_dv_settings[] =
+static int8_t aic7xxx_dv_settings[] =
 {
 	AIC7XXX_CONFIGED_DV,
 	AIC7XXX_CONFIGED_DV,
@@ -391,9 +391,9 @@
  * would result in never finding any devices :)
  */
 #ifndef CONFIG_AIC7XXX_PROBE_EISA_VL
-static uint32_t aic7xxx_probe_eisa_vl;
+uint32_t aic7xxx_probe_eisa_vl;
 #else
-static uint32_t aic7xxx_probe_eisa_vl = ~0;
+uint32_t aic7xxx_probe_eisa_vl = ~0;
 #endif
 
 /*
@@ -752,7 +752,6 @@
 
 /************************  Host template entry points *************************/
 static int	   ahc_linux_detect(Scsi_Host_Template *);
-static int	   ahc_linux_release(struct Scsi_Host *);
 static int	   ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
 static const char *ahc_linux_info(struct Scsi_Host *);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
@@ -765,6 +764,7 @@
 				       sector_t, int[]);
 #endif
 #else
+static int	   ahc_linux_release(struct Scsi_Host *);
 static void	   ahc_linux_select_queue_depth(struct Scsi_Host *host,
 						Scsi_Device *scsi_devs);
 #if defined(__i386__)
@@ -895,8 +895,9 @@
 	ahc_linux_pci_init();
 #endif
 
-	if (aic7xxx_probe_eisa_vl != 0)
-		aic7770_linux_probe(template);
+#ifdef CONFIG_EISA
+	ahc_linux_eisa_init();
+#endif
 
 	/*
 	 * Register with the SCSI layer all
@@ -915,6 +916,7 @@
 	return (found);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 /*
  * Free the passed in Scsi_Host memory structures prior to unloading the
  * module.
@@ -946,6 +948,7 @@
 	ahc_list_unlock(&l);
 	return (0);
 }
+#endif
 
 /*
  * Return a string describing the driver.
@@ -4137,6 +4140,16 @@
 			}
 #endif
 			ahc_set_transaction_status(scb, CAM_UNCOR_PARITY);
+#ifdef AHC_REPORT_UNDERFLOWS
+		/*
+		 * This code is disabled by default as some
+		 * clients of the SCSI system do not properly
+		 * initialize the underflow parameter.  This
+		 * results in spurious termination of commands
+		 * that complete as expected (e.g. underflow is
+		 * allowed as command can return variable amounts
+		 * of data.
+		 */
 		} else if (amount_xferred < scb->io_ctx->underflow) {
 			u_int i;
 
@@ -4151,6 +4164,7 @@
 				ahc_get_residual(scb),
 				ahc_get_transfer_length(scb));
 			ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
+#endif
 		} else {
 			ahc_set_transaction_status(scb, CAM_REQ_CMP);
 		}
@@ -5082,26 +5096,20 @@
 		ahc_linux_kill_dv_thread(ahc);
 	}
 	ahc_list_unlock(&l);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-
-	ahc_linux_pci_exit();
-
-	/*
-	 * Get rid of the non-pci devices.  
-	 *
-	 * XXX(hch): switch over eisa support to new LDM-based API
-	 */
-	TAILQ_FOREACH(ahc, &ahc_tailq, links)
-		ahc_linux_release(ahc->platform_data->host);
-#else
-	scsi_unregister_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	/*
 	 * In 2.4 we have to unregister from the PCI core _after_
 	 * unregistering from the scsi midlayer to avoid dangling
 	 * references.
 	 */
+	scsi_unregister_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
+#endif
+#ifdef CONFIG_PCI
 	ahc_linux_pci_exit();
+#endif
+#ifdef CONFIG_EISA
+	ahc_linux_eisa_exit();
 #endif
 }
 
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h	Thu Jan  8 23:00:23 2004
@@ -53,7 +53,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#147 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#151 $
  *
  */
 #ifndef _AIC7XXX_LINUX_H_
@@ -304,7 +304,7 @@
 #define AHC_SCSI_HAS_HOST_LOCK 0
 #endif
 
-#define AIC7XXX_DRIVER_VERSION "6.2.35"
+#define AIC7XXX_DRIVER_VERSION "6.2.36"
 
 /**************************** Front End Queues ********************************/
 /*
@@ -595,10 +595,6 @@
 
 
 /***************************** Low Level I/O **********************************/
-#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
-#define MMAPIO
-#endif
-
 static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port);
 static __inline void ahc_outb(struct ahc_softc * ahc, long port, uint8_t val);
 static __inline void ahc_outsb(struct ahc_softc * ahc, long port,
@@ -610,16 +606,12 @@
 ahc_inb(struct ahc_softc * ahc, long port)
 {
 	uint8_t x;
-#ifdef MMAPIO
 
 	if (ahc->tag == BUS_SPACE_MEMIO) {
 		x = readb(ahc->bsh.maddr + port);
 	} else {
 		x = inb(ahc->bsh.ioport + port);
 	}
-#else
-	x = inb(ahc->bsh.ioport + port);
-#endif
 	mb();
 	return (x);
 }
@@ -627,15 +619,11 @@
 static __inline void
 ahc_outb(struct ahc_softc * ahc, long port, uint8_t val)
 {
-#ifdef MMAPIO
 	if (ahc->tag == BUS_SPACE_MEMIO) {
 		writeb(val, ahc->bsh.maddr + port);
 	} else {
 		outb(val, ahc->bsh.ioport + port);
 	}
-#else
-	outb(val, ahc->bsh.ioport + port);
-#endif
 	mb();
 }
 
@@ -843,15 +831,26 @@
 	AHC_POWER_STATE_D3
 } ahc_power_state;
 
-void ahc_power_state_change(struct ahc_softc *ahc,
-			    ahc_power_state new_state);
 /**************************** VL/EISA Routines ********************************/
-int			 aic7770_linux_probe(Scsi_Host_Template *);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \
+  && (defined(__i386__) || defined(__alpha__)) \
+  && (!defined(CONFIG_EISA)))
+#define CONFIG_EISA
+#endif
+
+#ifdef CONFIG_EISA
+extern uint32_t aic7xxx_probe_eisa_vl;
+void			 ahc_linux_eisa_init(void);
+void			 ahc_linux_eisa_exit(void);
 int			 aic7770_map_registers(struct ahc_softc *ahc,
 					       u_int port);
 int			 aic7770_map_int(struct ahc_softc *ahc, u_int irq);
+#endif
 
 /******************************* PCI Routines *********************************/
+#ifdef CONFIG_PCI
+void			 ahc_power_state_change(struct ahc_softc *ahc,
+						ahc_power_state new_state);
 int			 ahc_linux_pci_init(void);
 void			 ahc_linux_pci_exit(void);
 int			 ahc_pci_map_registers(struct ahc_softc *ahc);
@@ -933,6 +932,7 @@
 {
 	return (pci->bus->number);
 }
+#endif
 
 static __inline void ahc_flush_device_writes(struct ahc_softc *);
 static __inline void
@@ -962,7 +962,12 @@
 	(((dev_softc)->dma_mask = mask) && 0)
 #endif
 /**************************** Proc FS Support *********************************/
-int	ahc_linux_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+int	ahc_linux_proc_info(char *, char **, off_t, int, int, int);
+#else
+int	ahc_linux_proc_info(struct Scsi_Host *, char *, char **,
+			    off_t, int, int);
+#endif
 
 /*************************** Domain Validation ********************************/
 #define AHC_DV_CMD(cmd) ((cmd)->scsi_done == ahc_linux_dv_complete)
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	Thu Jan  8 23:00:23 2004
@@ -36,7 +36,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#45 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#47 $
  */
 
 #include "aic7xxx_osm.h"
@@ -51,11 +51,9 @@
 					const struct pci_device_id *ent);
 static int	ahc_linux_pci_reserve_io_region(struct ahc_softc *ahc,
 						u_long *base);
-#ifdef MMAPIO
 static int	ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
 						 u_long *bus_addr,
 						 uint8_t **maddr);
-#endif /* MMAPIO */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 static void	ahc_linux_pci_dev_remove(struct pci_dev *pdev);
 
@@ -161,7 +159,7 @@
 	}
 	pci_set_master(pdev);
 
-	mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
+	mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
 	if (sizeof(bus_addr_t) > 4
 	 && ahc_linux_get_memsize() > 0x80000000
 	 && ahc_pci_set_dma_mask(pdev, mask_39bit) == 0) {
@@ -254,7 +252,6 @@
 	return (0);
 }
 
-#ifdef MMAPIO
 static int
 ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
 				 u_long *bus_addr,
@@ -296,7 +293,6 @@
 		error = ENOMEM;
 	return (error);
 }
-#endif /* MMAPIO */
 
 int
 ahc_pci_map_registers(struct ahc_softc *ahc)
@@ -313,7 +309,6 @@
 	command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
 	base = 0;
 	maddr = NULL;
-#ifdef MMAPIO
 	error = ahc_linux_pci_reserve_mem_region(ahc, &base, &maddr);
 	if (error == 0) {
 		ahc->platform_data->mem_busaddr = base;
@@ -350,7 +345,6 @@
 		       ahc_get_pci_function(ahc->dev_softc),
 		       base);
 	}
-#endif /* MMAPIO */
 
 	/*
 	 * We always prefer memory mapped access.
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c
--- a/drivers/scsi/aic7xxx/aic7xxx_pci.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c	Thu Jan  8 23:00:23 2004
@@ -39,7 +39,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#66 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#69 $
  *
  * $FreeBSD$
  */
@@ -76,7 +76,7 @@
 #define ID_9005_SISL_MASK		0x000FFFFF00000000ull
 #define ID_9005_SISL_ID			0x0005900500000000ull
 #define ID_AIC7850			0x5078900400000000ull
-#define ID_AHA_2902_04_10_15_20_30C	0x5078900478509004ull
+#define ID_AHA_2902_04_10_15_20C_30C	0x5078900478509004ull
 #define ID_AIC7855			0x5578900400000000ull
 #define ID_AIC7859			0x3860900400000000ull
 #define ID_AHA_2930CU			0x3860900438699004ull
@@ -245,9 +245,9 @@
 {
 	/* aic7850 based controllers */
 	{
-		ID_AHA_2902_04_10_15_20_30C,
+		ID_AHA_2902_04_10_15_20C_30C,
 		ID_ALL_MASK,
-		"Adaptec 2902/04/10/15/20/30C SCSI adapter",
+		"Adaptec 2902/04/10/15/20C/30C SCSI adapter",
 		ahc_aic785X_setup
 	},
 	/* aic7860 based controllers */
@@ -877,7 +877,7 @@
 		scsiseq = 0;
 	}
 
-	error = ahc_reset(ahc);
+	error = ahc_reset(ahc, /*reinit*/FALSE);
 	if (error != 0)
 		return (ENXIO);
 
@@ -1289,6 +1289,14 @@
 	ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
 	while (ahc_is_paused(ahc) == 0)
 		;
+
+	/* Clear any PCI errors that occurred before our driver attached. */
+	status1 = ahc_pci_read_config(ahc->dev_softc,
+				      PCIR_STATUS + 1, /*bytes*/1);
+	ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
+			     status1, /*bytes*/1);
+	ahc_outb(ahc, CLRINT, CLRPARERR);
+
 	ahc_outb(ahc, SEQCTL, PERRORDIS);
 	ahc_outb(ahc, SCBPTR, 0);
 	ahc_outl(ahc, SCB_BASE, 0x5aa555aa);
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c
--- a/drivers/scsi/aic7xxx/aic7xxx_proc.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c	Thu Jan  8 23:00:23 2004
@@ -37,7 +37,7 @@
  * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
  * sym driver.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#27 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#29 $
  */
 #include "aic7xxx_osm.h"
 #include "aic7xxx_inline.h"
@@ -289,8 +289,13 @@
  * Return information to handle /proc support for the driver.
  */
 int
-ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset,
-		  int length, int inout)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ahc_linux_proc_info(char *buffer, char **start, off_t offset,
+		    int length, int hostno, int inout)
+#else
+ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
+		    off_t offset, int length, int inout)
+#endif
 {
 	struct	ahc_softc *ahc;
 	struct	info_str info;
@@ -302,10 +307,14 @@
 
 	retval = -EINVAL;
 	ahc_list_lock(&s);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	TAILQ_FOREACH(ahc, &ahc_tailq, links) {
-		if (ahc->platform_data->host == shost)
+		if (ahc->platform_data->host->host_no == hostno)
 			break;
 	}
+#else
+	ahc = ahc_find_softc(*(struct ahc_softc **)shost->hostdata);
+#endif
 
 	if (ahc == NULL)
 		goto done;
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped b/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped	Thu Jan  8 23:00:24 2004
@@ -2,8 +2,8 @@
  * DO NOT EDIT - This file is automatically generated
  *		 from the following source files:
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#54 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#56 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
  */
 
 #include "aic7xxx_osm.h"
@@ -747,13 +747,6 @@
 	    0x54, regvalue, cur_col, wrap));
 }
 
-int
-ahc_data_count_odd_print(u_int regvalue, u_int *cur_col, u_int wrap)
-{
-	return (ahc_print_register(NULL, 0, "DATA_COUNT_ODD",
-	    0x55, regvalue, cur_col, wrap));
-}
-
 static ahc_reg_parse_entry_t HA_274_BIOSGLOBAL_parse_table[] = {
 	{ "HA_274_EXTENDED_TRANS",0x01, 0x01 }
 };
@@ -1416,13 +1409,14 @@
 }
 
 static ahc_reg_parse_entry_t SCB_LUN_parse_table[] = {
-	{ "LID",		0xff, 0xff }
+	{ "SCB_XFERLEN_ODD",	0x80, 0x80 },
+	{ "LID",		0x3f, 0x3f }
 };
 
 int
 ahc_scb_lun_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahc_print_register(SCB_LUN_parse_table, 1, "SCB_LUN",
+	return (ahc_print_register(SCB_LUN_parse_table, 2, "SCB_LUN",
 	    0xba, regvalue, cur_col, wrap));
 }
 
@@ -1662,28 +1656,26 @@
 static ahc_reg_parse_entry_t SG_CACHE_SHADOW_parse_table[] = {
 	{ "LAST_SEG_DONE",	0x01, 0x01 },
 	{ "LAST_SEG",		0x02, 0x02 },
-	{ "ODD_SEG",		0x04, 0x04 },
 	{ "SG_ADDR_MASK",	0xf8, 0xf8 }
 };
 
 int
 ahc_sg_cache_shadow_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahc_print_register(SG_CACHE_SHADOW_parse_table, 4, "SG_CACHE_SHADOW",
+	return (ahc_print_register(SG_CACHE_SHADOW_parse_table, 3, "SG_CACHE_SHADOW",
 	    0xfc, regvalue, cur_col, wrap));
 }
 
 static ahc_reg_parse_entry_t SG_CACHE_PRE_parse_table[] = {
 	{ "LAST_SEG_DONE",	0x01, 0x01 },
 	{ "LAST_SEG",		0x02, 0x02 },
-	{ "ODD_SEG",		0x04, 0x04 },
 	{ "SG_ADDR_MASK",	0xf8, 0xf8 }
 };
 
 int
 ahc_sg_cache_pre_print(u_int regvalue, u_int *cur_col, u_int wrap)
 {
-	return (ahc_print_register(SG_CACHE_PRE_parse_table, 4, "SG_CACHE_PRE",
+	return (ahc_print_register(SG_CACHE_PRE_parse_table, 3, "SG_CACHE_PRE",
 	    0xfc, regvalue, cur_col, wrap));
 }
 
diff -Nru a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l	Thu Jan  8 23:00:24 2004
@@ -38,7 +38,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#7 $
+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#8 $
  *
  * $FreeBSD$
  */
@@ -78,6 +78,7 @@
 \n			{
 				++yylineno;
 			}
+\r			;
 <ARGLIST>{SPACE}	;
 <ARGLIST>\(		{
 				parren_count++;
diff -Nru a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l	Thu Jan  8 23:00:24 2004
@@ -38,7 +38,7 @@
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#18 $
+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#19 $
  *
  * $FreeBSD$
  */
@@ -87,6 +87,7 @@
 
 %%
 \n			{ ++yylineno; }
+\r			;
 "/*"			{ BEGIN COMMENT;  /* Enter comment eating state */ }
 <COMMENT>"/*"		{ fprintf(stderr, "Warning! Comment within comment."); }
 <COMMENT>\n		{ ++yylineno; }
@@ -114,6 +115,7 @@
 				}
 			}
 <CEXPR>\n		{ ++yylineno; }
+<CEXPR>\r		;
 <CEXPR>[^()\n]+	{
 				char *yptr;
 
@@ -359,6 +361,7 @@
 				/* Eat escaped newlines. */
 				++yylineno;
 			}
+<MACROBODY>\r		;
 <MACROBODY>\n		{
 				/* Macros end on the first unescaped newline. */
 				BEGIN INITIAL;
@@ -369,10 +372,17 @@
 			}
 <MACROBODY>{MBODY}	{
 				char *yptr;
+				char c;
 
 				yptr = yytext;
-				while (*yptr)
-					*string_buf_ptr++ = *yptr++;
+				while (c = *yptr++) {
+					/*
+					 * Strip carriage returns.
+					 */
+					if (c == '\r')
+						continue;
+					*string_buf_ptr++ = c;
+				}
 			}
 {WORD}\(		{
 				char *yptr;
diff -Nru a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
--- a/drivers/scsi/ata_piix.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/ata_piix.c	Thu Jan  8 23:00:24 2004
@@ -97,6 +97,7 @@
 	.proc_name		= DRV_NAME,
 	.dma_boundary		= ATA_DMA_BOUNDARY,
 	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
 };
 
 static struct ata_port_operations piix_pata_ops = {
diff -Nru a/drivers/scsi/cpqfcTSinit.c b/drivers/scsi/cpqfcTSinit.c
--- a/drivers/scsi/cpqfcTSinit.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/cpqfcTSinit.c	Thu Jan  8 23:00:23 2004
@@ -467,6 +467,7 @@
   return NumberOfAdapters;
 }
 
+#ifdef SUPPORT_RESET
 static void my_ioctl_done (Scsi_Cmnd * SCpnt)
 {
     struct request * req;
@@ -477,7 +478,7 @@
     if (req->CPQFC_WAITING != NULL)
 	CPQFC_COMPLETE(req->CPQFC_WAITING);
 }   
-
+#endif
 
 static int cpqfc_alloc_private_data_pool(CPQFCHBA *hba)
 {
@@ -1577,6 +1578,8 @@
 // See dpANS Fibre Channel Protocol for SCSI
 // X3.269-199X revision 12, pg 25
 
+#ifdef SUPPORT_RESET
+
 int cpqfcTS_TargetDeviceReset( Scsi_Device *ScsiDev, 
                                unsigned int reset_flags)
 {
@@ -1592,8 +1595,7 @@
 // around the 2.5.30 kernel.  Scsi_Cmnd replaced with 
 // Scsi_Request, etc.
 // For now, so people don't fall into a hole...
-return -ENOTSUPP;
-/*
+
   // printk("   ENTERING cpqfcTS_TargetDeviceReset() - flag=%d \n",reset_flags);
 
   if (ScsiDev->host->eh_active) return FAILED;
@@ -1647,7 +1649,6 @@
 		   SCpnt->sense_buffer[2] & 0xf);
 	    
       };
-*/    
   result = SCpnt->result;
 
   SDpnt = SCpnt->device;
@@ -1658,6 +1659,14 @@
   return SUCCESS;
 }
 
+#else
+int cpqfcTS_TargetDeviceReset( Scsi_Device *ScsiDev, 
+                               unsigned int reset_flags)
+{
+	return -ENOTSUPP;
+}
+
+#endif /* SUPPORT_RESET */
 
 int cpqfcTS_eh_device_reset(Scsi_Cmnd *Cmnd)
 {
diff -Nru a/drivers/scsi/dc390.h b/drivers/scsi/dc390.h
--- a/drivers/scsi/dc390.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/dc390.h	Thu Jan  8 23:00:23 2004
@@ -36,14 +36,10 @@
 extern int DC390_detect(Scsi_Host_Template *psht);
 extern int DC390_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *));
 extern int DC390_abort(Scsi_Cmnd *cmd);
-extern int DC390_reset(Scsi_Cmnd *cmd, unsigned int resetFlags);
+extern int DC390_reset(Scsi_Cmnd *cmd);
 extern int DC390_bios_param(struct scsi_device *sdev, struct block_device *dev,
 		sector_t capacity, int geom[]);
 
-#ifdef MODULE
 static int DC390_release(struct Scsi_Host *);
-#else
-# define DC390_release NULL
-#endif
 
 #endif /* DC390_H */
diff -Nru a/drivers/scsi/esp.c b/drivers/scsi/esp.c
--- a/drivers/scsi/esp.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/esp.c	Thu Jan  8 23:00:24 2004
@@ -4394,3 +4394,6 @@
 };
 
 #include "scsi_module.c"
+
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/scsi/fcal.c b/drivers/scsi/fcal.c
--- a/drivers/scsi/fcal.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/fcal.c	Thu Jan  8 23:00:23 2004
@@ -316,3 +316,5 @@
 };
 #include "scsi_module.c"
 
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
--- a/drivers/scsi/hosts.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/hosts.c	Thu Jan  8 23:00:23 2004
@@ -109,7 +109,7 @@
 	}
 
 	if (!shost->shost_gendev.parent)
-		shost->shost_gendev.parent = dev ? dev : &legacy_bus;
+		shost->shost_gendev.parent = dev ? dev : &platform_bus;
 
 	error = device_add(&shost->shost_gendev);
 	if (error)
diff -Nru a/drivers/scsi/i60uscsi.c b/drivers/scsi/i60uscsi.c
--- a/drivers/scsi/i60uscsi.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/i60uscsi.c	Thu Jan  8 23:00:23 2004
@@ -108,9 +108,6 @@
 /* ---- EXTERNAL FUNCTIONS ---- */
 extern void inia100SCBPost(BYTE * pHcb, BYTE * pScb);
 
-/* ---- INTERNAL VARIABLES ---- */
-struct inia100_Adpt_Struc *inia100_adpt;
-
 NVRAM nvram, *nvramp = &nvram;
 static UCHAR dftNvRam[64] =
 {
@@ -701,83 +698,6 @@
 			scsi_to_pci_dma_dir(SCpnt->sc_data_direction));
 	}
 }
-
-/*****************************************************************************
- Function name	: Addinia100_into_Adapter_table
- Description	: This function will scan PCI bus to get all Orchid card
- Input		: None.
- Output		: None.
- Return		: SUCCESSFUL	- Successful scan
- ohterwise	- No drives founded
-*****************************************************************************/
-int Addinia100_into_Adapter_table(WORD wBIOS, WORD wBASE, struct pci_dev *pdev,
-		int iAdapters)
-{
-	unsigned int i, j;
-
-	for (i = 0; i < iAdapters; i++) {
-		if (inia100_adpt[i].ADPT_BIOS < wBIOS)
-			continue;
-		if (inia100_adpt[i].ADPT_BIOS == wBIOS) {
-			if (inia100_adpt[i].ADPT_BASE == wBASE) {
-				if (inia100_adpt[i].ADPT_pdev->bus->number != 0xFF)
-					return (FAILURE);
-			} else if (inia100_adpt[i].ADPT_BASE < wBASE)
-				continue;
-		}
-		for (j = iAdapters - 1; j > i; j--) {
-			inia100_adpt[j].ADPT_BASE = inia100_adpt[j - 1].ADPT_BASE;
-			inia100_adpt[j].ADPT_BIOS = inia100_adpt[j - 1].ADPT_BIOS;
-			inia100_adpt[j].ADPT_pdev = inia100_adpt[j - 1].ADPT_pdev;
-		}
-		inia100_adpt[i].ADPT_BASE = wBASE;
-		inia100_adpt[i].ADPT_BIOS = wBIOS;
-		inia100_adpt[i].ADPT_pdev = pdev;
-		return (SUCCESSFUL);
-	}
-	return (FAILURE);
-}
-
-
-/*****************************************************************************
- Function name	: init_inia100Adapter_table
- Description	: This function will scan PCI bus to get all Orchid card
- Input		: None.
- Output		: None.
- Return		: 0 on success, 1 on failure
-*****************************************************************************/
-int init_inia100Adapter_table(int iAdapters)
-{
-	int i;
-
-	inia100_adpt = kmalloc(sizeof(INIA100_ADPT_STRUCT) * iAdapters,
-			GFP_KERNEL);
-	if(inia100_adpt == NULL)
-		return 1;
-
-	for (i = 0; i < iAdapters; i++) {/* Initialize adapter structure */
-		inia100_adpt[i].ADPT_BIOS = 0xffff;
-		inia100_adpt[i].ADPT_BASE = 0xffff;
-		inia100_adpt[i].ADPT_pdev = NULL;
-	}
-	return 0;
-}
-
-/*****************************************************************************
- Function name  : get_orcPCIConfig
- Description    : 
- Input          : pHCB  -       Pointer to host adapter structure
- Output         : None.
- Return         : pSRB  -       Pointer to SCSI request block.
-*****************************************************************************/
-void get_orcPCIConfig(ORC_HCS * pCurHcb, int ch_idx)
-{
-	pCurHcb->HCS_Base = inia100_adpt[ch_idx].ADPT_BASE;	/* Supply base address  */
-	pCurHcb->HCS_BIOS = inia100_adpt[ch_idx].ADPT_BIOS;	/* Supply BIOS address  */
-	pCurHcb->HCS_Intr = inia100_adpt[ch_idx].ADPT_pdev->irq;	/* Supply interrupt line */
-	return;
-}
-
 
 /*****************************************************************************
  Function name  : abort_SCB
diff -Nru a/drivers/scsi/ini9100u.c b/drivers/scsi/ini9100u.c
--- a/drivers/scsi/ini9100u.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/ini9100u.c	Thu Jan  8 23:00:23 2004
@@ -104,12 +104,12 @@
  *		  Now fixed.
  * 05/07/99 bv	- v1.03g
  *		- Changed the assumption that HZ = 100
+ * 10/17/03 mc	- v1.04
+ *		- added new DMA API support
  **************************************************************************/
 
 #define CVT_LINUX_VERSION(V,P,S)        (V * 65536 + P * 256 + S)
 
-#error Please convert me to Documentation/DMA-mapping.txt
-
 #ifndef LINUX_VERSION_CODE
 #include <linux/version.h>
 #endif
@@ -143,13 +143,12 @@
 
 static Scsi_Host_Template driver_template = {
 	.proc_name	= "INI9100U",
-	.proc_info	= "INI9100U",
 	.name		= i91u_REVID,
 	.detect		= i91u_detect,
 	.release	= i91u_release,
 	.queuecommand	= i91u_queue,
-	.abort		= i91u_abort,
-	.reset		= i91u_reset,
+//	.abort		= i91u_abort,
+//	.reset		= i91u_reset,
 	.bios_param	= i91u_biosparam,
 	.can_queue	= 1,
 	.this_id	= 1,
@@ -162,7 +161,7 @@
 char *i91uCopyright = "Copyright (C) 1996-98";
 char *i91uInitioName = "by Initio Corporation";
 char *i91uProductName = "INI-9X00U/UW";
-char *i91uVersion = "v1.03g";
+char *i91uVersion = "v1.04";
 
 #define TULSZ(sz)     (sizeof(sz) / sizeof(sz[0]))
 #define TUL_RDWORD(x,y)         (short)(inl((int)((ULONG)((ULONG)x+(UCHAR)y)) ))
@@ -238,12 +237,12 @@
 	ULONG flags;
 	spin_lock_irqsave(&(pHCB->pSRB_lock), flags);
 
-	pSRB->next = NULL;	/* Pointer to next              */
+	pSRB->host_scribble = NULL;	/* Pointer to next */
 
 	if (pHCB->pSRB_head == NULL)
 		pHCB->pSRB_head = pSRB;
 	else
-		pHCB->pSRB_tail->next = pSRB;	/* Pointer to next              */
+		pHCB->pSRB_tail->host_scribble = (char *)pSRB;	/* Pointer to next */
 	pHCB->pSRB_tail = pSRB;
 
 	spin_unlock_irqrestore(&(pHCB->pSRB_lock), flags);
@@ -265,8 +264,8 @@
 	spin_lock_irqsave(&(pHCB->pSRB_lock), flags);
 
 	if ((pSRB = pHCB->pSRB_head) != NULL) {
-		pHCB->pSRB_head = pHCB->pSRB_head->next;
-		pSRB->next = NULL;
+		pHCB->pSRB_head = (struct scsi_cmnd *)pHCB->pSRB_head->host_scribble;
+		pSRB->host_scribble = NULL;
 	}
 	spin_unlock_irqrestore(&(pHCB->pSRB_lock), flags);
 
@@ -308,6 +307,12 @@
 			if (((dRegValue & 0xFF00) >> 8) == 0xFF)
 				dRegValue = 0;
 			wBIOS = (wBIOS << 8) + ((UWORD) ((dRegValue & 0xFF00) >> 8));
+			if (pci_set_dma_mask(pDev, 0xffffffff)) {
+				printk(KERN_WARNING 
+				       "i91u: Could not set 32 bit DMA mask\n");
+				continue;
+			}
+
 			if (Addi91u_into_Adapter_table(wBIOS,
 							(pDev->resource[0].start),
 						       	pDev->irq,
@@ -323,7 +328,6 @@
 
 int i91u_detect(Scsi_Host_Template * tpnt)
 {
-	SCB *pSCB;
 	HCS *pHCB;
 	struct Scsi_Host *hreg;
 	unsigned long i;	/* 01/14/98                     */
@@ -346,12 +350,7 @@
 #endif
 	}
 	/* Get total number of adapters in the motherboard */
-#ifdef CONFIG_PCI
 	iAdapters = tul_NewReturnNumberOfAdapters();
-#else
-	iAdapters = tul_ReturnNumberOfAdapters();
-#endif
-
 	if (iAdapters == 0)	/* If no tulip founded, return */
 		return (0);
 
@@ -379,11 +378,6 @@
 	}
 	memset((unsigned char *) tul_scb, 0, i);
 
-	pSCB = tul_scb;
-	for (i = 0; i < tul_num_ch * tul_num_scb; i++, pSCB++) {
-		pSCB->SCB_SGPAddr = (U32) VIRT_TO_BUS(&pSCB->SCB_SGList[0]);
-	}
-
 	for (i = 0, pHCB = &tul_hcs[0];		/* Get pointer for control block */
 	     i < tul_num_ch;
 	     i++, pHCB++) {
@@ -476,6 +470,7 @@
 	SG *pSG;		/* Pointer to SG list           */
 	int i;
 	long TotalLen;
+	dma_addr_t dma_addr;
 
 	pSCB->SCB_Post = i91uSCBPost;	/* i91u's callback routine      */
 	pSCB->SCB_Srb = SCpnt;
@@ -484,11 +479,13 @@
 	pSCB->SCB_Target = SCpnt->device->id;
 	pSCB->SCB_Lun = SCpnt->device->lun;
 	pSCB->SCB_Ident = SCpnt->device->lun | DISC_ALLOW;
-	pSCB->SCB_Flags |= SCF_SENSE;	/* Turn on auto request sense   */
-
-	pSCB->SCB_SensePtr = (U32) VIRT_TO_BUS(SCpnt->sense_buffer);
 
+	pSCB->SCB_Flags |= SCF_SENSE;	/* Turn on auto request sense   */
+	dma_addr = dma_map_single(&pHCB->pci_dev->dev, SCpnt->sense_buffer,
+				  SENSE_SIZE, DMA_FROM_DEVICE);
+	pSCB->SCB_SensePtr = cpu_to_le32((u32)dma_addr);
 	pSCB->SCB_SenseLen = SENSE_SIZE;
+	SCpnt->SCp.ptr = (char *)(unsigned long)dma_addr;
 
 	pSCB->SCB_CDBLen = SCpnt->cmd_len;
 	pSCB->SCB_HaStat = 0;
@@ -500,33 +497,39 @@
 	} else {
 		pSCB->SCB_TagMsg = 0;	/* No tag support               */
 	}
-
+	/* todo handle map_sg error */
 	if (SCpnt->use_sg) {
+		dma_addr = dma_map_single(&pHCB->pci_dev->dev, &pSCB->SCB_SGList[0],
+					  sizeof(struct SG_Struc) * TOTAL_SG_ENTRY,
+					  DMA_BIDIRECTIONAL);
+		pSCB->SCB_BufPtr = dma_addr;
+		SCpnt->SCp.dma_handle = dma_addr;
+
 		pSrbSG = (struct scatterlist *) SCpnt->request_buffer;
-		if (SCpnt->use_sg == 1) {	/* If only one entry in the list *//*      treat it as regular I/O */
-			pSCB->SCB_BufPtr = (U32) VIRT_TO_BUS(pSrbSG->address);
-			TotalLen = pSrbSG->length;
-			pSCB->SCB_SGLen = 0;
-		} else {	/* Assign SG physical address   */
-			pSCB->SCB_BufPtr = pSCB->SCB_SGPAddr;
-			pSCB->SCB_Flags |= SCF_SG;	/* Turn on SG list flag       */
-			for (i = 0, TotalLen = 0, pSG = &pSCB->SCB_SGList[0];	/* 1.01g */
-			     i < SCpnt->use_sg;
-			     i++, pSG++, pSrbSG++) {
-				pSG->SG_Ptr = (U32) VIRT_TO_BUS(pSrbSG->address);
-				TotalLen += pSG->SG_Len = pSrbSG->length;
-			}
-			pSCB->SCB_SGLen = i;
+		pSCB->SCB_SGLen = dma_map_sg(&pHCB->pci_dev->dev, pSrbSG,
+					     SCpnt->use_sg, SCpnt->sc_data_direction);
+
+		pSCB->SCB_Flags |= SCF_SG;	/* Turn on SG list flag       */
+		for (i = 0, TotalLen = 0, pSG = &pSCB->SCB_SGList[0];	/* 1.01g */
+		     i < pSCB->SCB_SGLen; i++, pSG++, pSrbSG++) {
+			pSG->SG_Ptr = (u32)sg_dma_address(pSrbSG);
+			TotalLen += pSG->SG_Len = (u32)sg_dma_len(pSrbSG);
 		}
+
 		pSCB->SCB_BufLen = (SCpnt->request_bufflen > TotalLen) ?
 		    TotalLen : SCpnt->request_bufflen;
-	} else {		/* Non SG                       */
-		pSCB->SCB_BufPtr = (U32) VIRT_TO_BUS(SCpnt->request_buffer);
-		pSCB->SCB_BufLen = SCpnt->request_bufflen;
+	} else if (SCpnt->request_bufflen) {		/* Non SG */
+		dma_addr = dma_map_single(&pHCB->pci_dev->dev, SCpnt->request_buffer,
+					  SCpnt->request_bufflen,
+					  SCpnt->sc_data_direction);
+		SCpnt->SCp.dma_handle = dma_addr;
+		pSCB->SCB_BufPtr = (u32)dma_addr;
+		pSCB->SCB_BufLen = (u32)SCpnt->request_bufflen;
+		pSCB->SCB_SGLen = 0;
+	} else {
+		pSCB->SCB_BufLen = 0;
 		pSCB->SCB_SGLen = 0;
 	}
-
-	return;
 }
 
 /* 
@@ -623,6 +626,32 @@
 	return 0;
 }
 
+static void i91u_unmap_cmnd(struct pci_dev *pci_dev, struct scsi_cmnd *cmnd)
+{
+	/* auto sense buffer */
+	if (cmnd->SCp.ptr) {
+		dma_unmap_single(&pci_dev->dev,
+				 (dma_addr_t)((unsigned long)cmnd->SCp.ptr),
+				 SENSE_SIZE, SCSI_DATA_READ);
+		cmnd->SCp.ptr = NULL;
+	}
+
+	/* request buffer */
+	if (cmnd->use_sg) {
+		dma_unmap_single(&pci_dev->dev, cmnd->SCp.dma_handle,
+				 sizeof(struct SG_Struc) * TOTAL_SG_ENTRY,
+				 DMA_BIDIRECTIONAL);
+
+		dma_unmap_sg(&pci_dev->dev, cmnd->request_buffer,
+			     cmnd->use_sg,
+			     cmnd->sc_data_direction);
+	} else if (cmnd->request_bufflen) {
+		dma_unmap_single(&pci_dev->dev, cmnd->SCp.dma_handle,
+				 cmnd->request_bufflen,
+				 cmnd->sc_data_direction);
+	}
+}
+
 /*****************************************************************************
  Function name  : i91uSCBPost
  Description    : This is callback routine be called when tulip finish one
@@ -686,6 +715,8 @@
 	if (pSRB == NULL) {
 		printk("pSRB is NULL\n");
 	}
+
+	i91u_unmap_cmnd(pHCB->pci_dev, pSRB);
 	pSRB->scsi_done(pSRB);	/* Notify system DONE           */
 	if ((pSRB = i91uPopSRBFromQueue(pHCB)) != NULL)
 		/* Find the next pending SRB    */
diff -Nru a/drivers/scsi/inia100.c b/drivers/scsi/inia100.c
--- a/drivers/scsi/inia100.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/inia100.c	Thu Jan  8 23:00:23 2004
@@ -65,10 +65,15 @@
  *          - Clean up interrupt handler registration
  *          - Fix memory leaks
  *          - Fix allocation of scsi host structs and private data
+ * 18/11/03 Christoph Hellwig <hch@lst.de>
+ *	    - Port to new probing API
+ *	    - Fix some more leaks in init failure cases
+ * TODO:
+ *	    - use list.h macros for SCB queue
+ *	  ( - merge with i60uscsi.c )
  **************************************************************************/
 
 #include <linux/module.h>
-
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
@@ -76,37 +81,19 @@
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/spinlock.h>
-#include <linux/stat.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-//#include <linux/sched.h>
 #include <linux/slab.h>
-#include <linux/proc_fs.h>
-
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include "scsi.h"
-#include "hosts.h"
-#include "inia100.h"
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
 
-static Scsi_Host_Template driver_template = {
-	.proc_name	= "inia100",
-	.name		= inia100_REVID,
-	.detect		= inia100_detect,
-	.release	= inia100_release,
-	.queuecommand	= inia100_queue,
-	.eh_abort_handler = inia100_abort,
-	.eh_bus_reset_handler	= inia100_bus_reset,
-	.eh_device_reset_handler = inia100_device_reset,
-	.can_queue	= 1,
-	.this_id	= 1,
-	.sg_tablesize	= SG_ALL,
-	.cmd_per_lun 	= 1,
-	.use_clustering	= ENABLE_CLUSTERING,
-};
-#include "scsi_module.c"
+#include "inia100.h"
 
 #define ORC_RDWORD(x,y)         (short)(inl((int)((ULONG)((ULONG)x+(UCHAR)y)) ))
 
@@ -115,32 +102,19 @@
 char *inia100_ProductName = "INI-A100U2W";
 char *inia100_Version = "v1.02d";
 
-/* set by inia100_setup according to the command line */
-static int setup_called = 0;
-
-/* ---- INTERNAL VARIABLES ---- */
-#define NUMBER(arr)     (sizeof(arr) / sizeof(arr[0]))
-static char *setup_str = (char *) NULL;
-
-static irqreturn_t inia100_intr(int, void *, struct pt_regs *);
-static void inia100_panic(char *msg);
-
 /* ---- EXTERNAL FUNCTIONS ---- */
 extern void inia100SCBPost(BYTE * pHcb, BYTE * pScb);
-extern int Addinia100_into_Adapter_table(WORD, WORD, struct pci_dev *, int);
 extern int init_inia100Adapter_table(int);
 extern ORC_SCB *orc_alloc_scb(ORC_HCS * hcsp);
 extern void orc_exec_scb(ORC_HCS * hcsp, ORC_SCB * scbp);
 extern void orc_release_scb(ORC_HCS * hcsp, ORC_SCB * scbp);
-extern void orc_release_dma(ORC_HCS * hcsp, Scsi_Cmnd * cmnd);
+extern void orc_release_dma(ORC_HCS * hcsp, struct scsi_cmnd * cmnd);
 extern void orc_interrupt(ORC_HCS * hcsp);
-extern int orc_device_reset(ORC_HCS * pHCB, Scsi_Cmnd *SCpnt, unsigned int target);
+extern int orc_device_reset(ORC_HCS * pHCB, struct scsi_cmnd *SCpnt, unsigned int target);
 extern int orc_reset_scsi_bus(ORC_HCS * pHCB);
 extern int abort_SCB(ORC_HCS * hcsp, ORC_SCB * pScb);
-extern int orc_abort_srb(ORC_HCS * hcsp, Scsi_Cmnd *SCpnt);
-extern void get_orcPCIConfig(ORC_HCS * pCurHcb, int ch_idx);
+extern int orc_abort_srb(ORC_HCS * hcsp, struct scsi_cmnd *SCpnt);
 extern int init_orchid(ORC_HCS * hcsp);
-extern struct inia100_Adpt_Struc *inia100_adpt;
 
 /*****************************************************************************
  Function name  : inia100AppendSRBToQueue
@@ -150,7 +124,7 @@
  Output         : None.
  Return         : None.
 *****************************************************************************/
-static void inia100AppendSRBToQueue(ORC_HCS * pHCB, Scsi_Cmnd * pSRB)
+static void inia100AppendSRBToQueue(ORC_HCS * pHCB, struct scsi_cmnd * pSRB)
 {
 	ULONG flags;
 
@@ -173,13 +147,13 @@
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static Scsi_Cmnd *inia100PopSRBFromQueue(ORC_HCS * pHCB)
+static struct scsi_cmnd *inia100PopSRBFromQueue(ORC_HCS * pHCB)
 {
-	Scsi_Cmnd *pSRB;
+	struct scsi_cmnd *pSRB;
 	ULONG flags;
 	spin_lock_irqsave(&(pHCB->pSRB_lock), flags);
-	if ((pSRB = (Scsi_Cmnd *) pHCB->pSRB_head) != NULL) {
-		pHCB->pSRB_head = (Scsi_Cmnd *) pHCB->pSRB_head->SCp.ptr;
+	if ((pSRB = (struct scsi_cmnd *) pHCB->pSRB_head) != NULL) {
+		pHCB->pSRB_head = (struct scsi_cmnd *) pHCB->pSRB_head->SCp.ptr;
 		pSRB->SCp.ptr = NULL;
 	}
 	spin_unlock_irqrestore(&(pHCB->pSRB_lock), flags);
@@ -187,273 +161,13 @@
 }
 
 /*****************************************************************************
- Function name  : inia100_setup
- Description    : 
- Input          : pHCB  -       Pointer to host adapter structure
- Output         : None.
- Return         : pSRB  -       Pointer to SCSI request block.
-*****************************************************************************/
-void inia100_setup(char *str, int *ints)
-{
-	if (setup_called)
-		inia100_panic("inia100: inia100_setup called twice.\n");
-
-	setup_called = ints[0];
-	setup_str = str;
-}
-
-/*****************************************************************************
- Function name	: orc_ReturnNumberOfAdapters
- Description	: This function will scan PCI bus to get all Orchid card
- Input		: None.
- Output		: None.
- Return		: SUCCESSFUL	- Successful scan
-		  ohterwise	- No drives founded
-*****************************************************************************/
-int orc_ReturnNumberOfAdapters(void)
-{
-	unsigned int iAdapters;
-
-	iAdapters = 0;
-	/*
-	 * PCI-bus probe.
-	 */
-	{
-		/*
-		 * Note: I removed the struct pci_device_list stuff since this
-		 * driver only cares about one device ID.  If that changes in
-		 * the future it can be added in with only a very moderate
-		 * amount of work.  It made the double scan of the device list
-		 * for getting a count and allocating the device list easier
-		 * to not have the for(i ... ) loop in there....
-		 */
-		unsigned int dRegValue;
-		WORD wBIOS, wBASE;
-#ifdef MMAPIO
-		unsigned long page_offset, base;
-#endif
-		struct pci_dev *pdev = NULL;
-
-		/*
-		 * Get a count of adapters that we expect to be able to use.
-		 * Pass that count to init_inia100Adapter_table() for malloc
-		 * reasons.
-		 */
-		pdev = NULL;
-		while((pdev=pci_find_device(ORC_VENDOR_ID, ORC_DEVICE_ID, pdev)))
-		{
-			if (pci_enable_device(pdev))
-				continue;
-			if (pci_set_dma_mask(pdev, (u64)0xffffffff)) {
-				printk(KERN_WARNING "Unable to set 32bit DMA "
-					"on inia100 adapter, ignoring.\n");
-				continue;
-			}
-			iAdapters++;
-		}
-		if(init_inia100Adapter_table(iAdapters))
-			return 0;
-		/*
-		 * Now go through the adapters again actually setting them up
-		 * and putting them in the table this time.
-		 */
-		pdev = NULL;
-		while((pdev=pci_find_device(ORC_VENDOR_ID, ORC_DEVICE_ID, pdev)))
-		{
-			/*
-			 * Read sundry information from PCI BIOS.
-			 */
-			dRegValue = pci_resource_start(pdev, 0);
-			if (dRegValue == -1) {	/* Check return code */
-				printk("\n\rinia100: orchid read configuration error.\n");
-				iAdapters--;
-				continue;	/* Read configuration space error  */
-			}
-
-			/* <02> read from base address + 0x50 offset to get the wBIOS balue. */
-			wBASE = (WORD) dRegValue;
-
-			/* Now read the interrupt line value */
-			dRegValue = pdev->irq;
-
-			wBIOS = ORC_RDWORD(wBASE, 0x50);
-
-			pci_set_master(pdev);
-
-#ifdef MMAPIO
-			base = wBASE & PAGE_MASK;
-			page_offset = wBASE - base;
-
-			/*
-			 * replace the next line with this one if you are using 2.1.x:
-			 * temp_p->maddr = ioremap(base, page_offset + 256);
-			 */
-			wBASE = ioremap(base, page_offset + 256);
-			if (wBASE) {
-				wBASE += page_offset;
-			}
-#endif
-
-			Addinia100_into_Adapter_table(wBIOS, wBASE, pdev, iAdapters);
-		}	/* while(pdev=....) */
-	}			/* PCI BIOS present */
-	return (iAdapters);
-}
-
-/*****************************************************************************
- Function name  : inia100_detect
- Description    : 
- Input          : pHCB  -       Pointer to host adapter structure
- Output         : None.
- Return         : pSRB  -       Pointer to SCSI request block.
-*****************************************************************************/
-int inia100_detect(Scsi_Host_Template * tpnt)
-{
-	ORC_HCS *pHCB;
-	struct Scsi_Host *hreg;
-	U32 sz;
-	U32 i;			/* 01/14/98                     */
-	int ok = 0, iAdapters;
-	ULONG dBiosAdr;
-	BYTE *pbBiosAdr;
-	struct pci_dev *pdev;
-
-	tpnt->proc_name = "inia100";
-	if (setup_called) {
-		/* Setup by inia100_setup          */
-		printk("inia100: processing commandline: ");
-	}
-	/* Get total number of adapters in the motherboard */
-	iAdapters = orc_ReturnNumberOfAdapters();
-
-	/* printk("inia100: Total Initio Adapters = %d\n", iAdapters); */
-	if (iAdapters == 0)	/* If no orc founded, return */
-		return (0);
-
-#if 0
-	printk("orc_num_scb= %x orc_num_ch= %x hcsize= %x scbsize= %x escbsize= %x\n",
-	       orc_num_scb, orc_num_ch, sizeof(ORC_HCS), sizeof(ORC_SCB), sizeof(ESCB));
-#endif
-
-	for (i = 0; i < iAdapters; i++) {
-		pdev = inia100_adpt[i].ADPT_pdev;
-		hreg = scsi_register(tpnt, sizeof(ORC_HCS));
-		if (hreg == NULL) {
-			goto out_disable;
-		}
-		pHCB = (ORC_HCS *)hreg->hostdata;
-		pHCB->pdev = pdev;
-		pHCB->pSRB_head = NULL;	/* Initial SRB save queue       */
-		pHCB->pSRB_tail = NULL;	/* Initial SRB save queue       */
-		pHCB->pSRB_lock = SPIN_LOCK_UNLOCKED; /* SRB save queue lock */
-		pHCB->BitAllocFlagLock = SPIN_LOCK_UNLOCKED;
-		/* Get total memory needed for SCB */
-		sz = ORC_MAXQUEUE * sizeof(ORC_SCB);
-		if ((pHCB->HCS_virScbArray = (PVOID) pci_alloc_consistent(pdev, sz, &pHCB->HCS_physScbArray)) == NULL) {
-			printk("inia100: SCB memory allocation error\n");
-			goto out_unregister;
-		}
-		memset((unsigned char *) pHCB->HCS_virScbArray, 0, sz);
-
-		/* Get total memory needed for ESCB */
-		sz = ORC_MAXQUEUE * sizeof(ESCB);
-		if ((pHCB->HCS_virEscbArray = (PVOID) pci_alloc_consistent(pdev, sz, &pHCB->HCS_physEscbArray)) == NULL) {
-			printk("inia100: ESCB memory allocation error\n");
-			goto out_unalloc;
-		}
-		memset((unsigned char *) pHCB->HCS_virEscbArray, 0, sz);
-
-		get_orcPCIConfig(pHCB, i);
-
-		dBiosAdr = pHCB->HCS_BIOS;
-		dBiosAdr = (dBiosAdr << 4);
-
-		pbBiosAdr = phys_to_virt(dBiosAdr);
-
-		if (init_orchid(pHCB)) {	/* Initial orchid chip    */
-			printk("inia100: initial orchid fail!!\n");
-			goto out_unalloc;
-		}
-		if (!request_region(pHCB->HCS_Base, 256, "inia100")) {
-			printk(KERN_WARNING "inia100: io port 0x%x, is busy.\n", 
-			       pHCB->HCS_Base);
-			return (0);
-		}
-
-		hreg->io_port = pHCB->HCS_Base;
-		hreg->n_io_port = 0xff;
-		hreg->can_queue = ORC_MAXQUEUE;	/* 03/05/98                   */
-
-		hreg->unique_id = pHCB->HCS_Base;
-		hreg->max_id = pHCB->HCS_MaxTar;
-
-		hreg->max_lun = 16;	/* 10/21/97                     */
-/*
-   hreg->max_lun = 8;
-   hreg->max_channel = 1;
- */
-		hreg->irq = pHCB->HCS_Intr;
-		hreg->this_id = pHCB->HCS_SCSI_ID;	/* Assign HCS index           */
-
-#if 1
-		hreg->sg_tablesize = TOTAL_SG_ENTRY;	/* Maximun support is 32 */
-#else
-		hreg->sg_tablesize = SG_NONE;	/* No SG                        */
-#endif
-
-		/* Initial orc chip           */
-		ok = request_irq(pHCB->HCS_Intr, inia100_intr, SA_SHIRQ, "inia100", hreg);
-		if (ok < 0) {
-			if (ok == -EINVAL) {
-				printk("inia100: bad IRQ %d.\n", pHCB->HCS_Intr);
-				printk("         Contact author.\n");
-			} else {
-				if (ok == -EBUSY)
-					printk("inia100: IRQ %d already in use. Configure another.\n", pHCB->HCS_Intr);
-				else {
-					printk("\ninia100: Unexpected error code on requesting IRQ %d.\n",
-					       pHCB->HCS_Intr);
-					printk("         Contact author.\n");
-				}
-			}
-			goto out_irq;
-		}
-	}
-
-	tpnt->this_id = -1;
-	tpnt->can_queue = 1;
-	kfree(inia100_adpt);
-	return 1;
-
-out_irq:
-        release_region(pHCB->HCS_Base, 256);
-out_unalloc:
-	if(pHCB->HCS_virEscbArray) {
-		pci_free_consistent(pHCB->pdev, ORC_MAXQUEUE * sizeof(ESCB),
-			pHCB->HCS_virEscbArray, pHCB->HCS_physEscbArray);
-		pHCB->HCS_virEscbArray = NULL;
-	}
-	if(pHCB->HCS_virScbArray) {
-		pci_free_consistent(pHCB->pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
-			pHCB->HCS_virScbArray, pHCB->HCS_physScbArray);
-		pHCB->HCS_virScbArray = NULL;
-	}
-out_unregister:
-	scsi_unregister(hreg);
-out_disable:
-	pci_disable_device(pdev);
-	kfree(inia100_adpt);
-	return i;
-}
-
-/*****************************************************************************
  Function name  : inia100BuildSCB
  Description    : 
  Input          : pHCB  -       Pointer to host adapter structure
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static void inia100BuildSCB(ORC_HCS * pHCB, ORC_SCB * pSCB, Scsi_Cmnd * SCpnt)
+static void inia100BuildSCB(ORC_HCS * pHCB, ORC_SCB * pSCB, struct scsi_cmnd * SCpnt)
 {				/* Create corresponding SCB     */
 	struct scatterlist *pSrbSG;
 	ORC_SG *pSG;		/* Pointer to SG list           */
@@ -479,7 +193,7 @@
 			TotalLen = 0;
 			pSrbSG = (struct scatterlist *) SCpnt->request_buffer;
 			count_sg = pci_map_sg(pHCB->pdev, pSrbSG, SCpnt->use_sg,
-				scsi_to_pci_dma_dir(SCpnt->sc_data_direction));
+					SCpnt->sc_data_direction);
 			pSCB->SCB_SGLen = (U32) (count_sg * 8);
 			for (i = 0; i < count_sg; i++, pSG++, pSrbSG++) {
 				pSG->SG_Ptr = (U32) sg_dma_address(pSrbSG);
@@ -490,7 +204,7 @@
 			pSCB->SCB_SGLen = 0x8;
 			pSG->SG_Ptr = (U32) pci_map_single(pHCB->pdev,
 				SCpnt->request_buffer, SCpnt->request_bufflen,
-				scsi_to_pci_dma_dir(SCpnt->sc_data_direction));
+				SCpnt->sc_data_direction);
 			SCpnt->host_scribble = (void *)pSG->SG_Ptr;
 			pSG->SG_Len = (U32) SCpnt->request_bufflen;
 		} else {
@@ -526,7 +240,7 @@
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static int inia100_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
+static int inia100_queue(struct scsi_cmnd * SCpnt, void (*done) (struct scsi_cmnd *))
 {
 	register ORC_SCB *pSCB;
 	ORC_HCS *pHCB;		/* Point to Host adapter control block */
@@ -553,7 +267,7 @@
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static int inia100_abort(Scsi_Cmnd * SCpnt)
+static int inia100_abort(struct scsi_cmnd * SCpnt)
 {
 	ORC_HCS *hcsp;
 
@@ -569,7 +283,7 @@
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static int inia100_bus_reset(Scsi_Cmnd * SCpnt)
+static int inia100_bus_reset(struct scsi_cmnd * SCpnt)
 {				/* I need Host Control Block Information */
 	ORC_HCS *pHCB;
 	pHCB = (ORC_HCS *) SCpnt->device->host->hostdata;
@@ -583,7 +297,7 @@
  Output         : None.
  Return         : pSRB  -       Pointer to SCSI request block.
 *****************************************************************************/
-static int inia100_device_reset(Scsi_Cmnd * SCpnt)
+static int inia100_device_reset(struct scsi_cmnd * SCpnt)
 {				/* I need Host Control Block Information */
 	ORC_HCS *pHCB;
 	pHCB = (ORC_HCS *) SCpnt->device->host->hostdata;
@@ -602,7 +316,7 @@
 *****************************************************************************/
 void inia100SCBPost(BYTE * pHcb, BYTE * pScb)
 {
-	Scsi_Cmnd *pSRB;	/* Pointer to SCSI request block */
+	struct scsi_cmnd *pSRB;	/* Pointer to SCSI request block */
 	ORC_HCS *pHCB;
 	ORC_SCB *pSCB;
 	ESCB *pEScb;
@@ -610,7 +324,7 @@
 	pHCB = (ORC_HCS *) pHcb;
 	pSCB = (ORC_SCB *) pScb;
 	pEScb = pSCB->SCB_EScb;
-	if ((pSRB = (Scsi_Cmnd *) pEScb->SCB_Srb) == 0) {
+	if ((pSRB = (struct scsi_cmnd *) pEScb->SCB_Srb) == 0) {
 		printk("inia100SCBPost: SRB pointer is empty\n");
 		orc_release_scb(pHCB, pSCB);	/* Release SCB for current channel */
 		return;
@@ -676,47 +390,187 @@
 static irqreturn_t inia100_intr(int irqno, void *devid, struct pt_regs *regs)
 {
 	struct Scsi_Host *host = (struct Scsi_Host *)devid;
-	ORC_HCS *pHcb;
+	ORC_HCS *pHcb = (ORC_HCS *)host->hostdata;
 	unsigned long flags;
 
- 	pHcb = (ORC_HCS *)host->hostdata;	/* Host adapter control block */
 	spin_lock_irqsave(host->host_lock, flags);
 	orc_interrupt(pHcb);
 	spin_unlock_irqrestore(host->host_lock, flags);
+
 	return IRQ_HANDLED;
 }
 
-/* 
- * Dump the current driver status and panic...
- */
-static void inia100_panic(char *msg)
+static struct scsi_host_template inia100_template = {
+	.proc_name		= "inia100",
+	.name			= inia100_REVID,
+	.queuecommand		= inia100_queue,
+	.eh_abort_handler	= inia100_abort,
+	.eh_bus_reset_handler	= inia100_bus_reset,
+	.eh_device_reset_handler = inia100_device_reset,
+	.can_queue		= 1,
+	.this_id		= 1,
+	.sg_tablesize		= SG_ALL,
+	.cmd_per_lun 		= 1,
+	.use_clustering		= ENABLE_CLUSTERING,
+};
+
+static int __devinit inia100_probe_one(struct pci_dev *pdev,
+		const struct pci_device_id *id)
 {
-	printk("\ninia100_panic: %s\n", msg);
-	panic("inia100 panic");
+	struct Scsi_Host *shost;
+	ORC_HCS *pHCB;
+	unsigned long port, bios;
+	int ok = -ENODEV;
+	u32 sz;
+	unsigned long dBiosAdr;
+	char *pbBiosAdr;
+
+	if (pci_enable_device(pdev))
+		goto out;
+	if (pci_set_dma_mask(pdev, 0xffffffffULL)) {
+		printk(KERN_WARNING "Unable to set 32bit DMA "
+				    "on inia100 adapter, ignoring.\n");
+		goto out_disable_device;
+	}
+
+	port = pci_resource_start(pdev, 0);
+	if (!request_region(pHCB->HCS_Base, 256, "inia100")) {
+		printk(KERN_WARNING "inia100: io port 0x%x, is busy.\n", 
+		       pHCB->HCS_Base);
+		goto out_disable_device; /* XXX: undo init_orchid() ?? */
+	}
+
+	/* <02> read from base address + 0x50 offset to get the bios balue. */
+	bios = ORC_RDWORD(port, 0x50);
+
+	pci_set_master(pdev);
+
+	shost = scsi_host_alloc(&inia100_template, sizeof(ORC_HCS));
+	if (!shost)
+		goto out_release_region;
+
+	pHCB = (ORC_HCS *)shost->hostdata;
+	pHCB->pdev = pdev;
+	pHCB->HCS_Base = port;
+	pHCB->HCS_BIOS = bios;
+	pHCB->pSRB_head = NULL;	/* Initial SRB save queue       */
+	pHCB->pSRB_tail = NULL;	/* Initial SRB save queue       */
+	pHCB->pSRB_lock = SPIN_LOCK_UNLOCKED; /* SRB save queue lock */
+	pHCB->BitAllocFlagLock = SPIN_LOCK_UNLOCKED;
+
+	/* Get total memory needed for SCB */
+	sz = ORC_MAXQUEUE * sizeof(ORC_SCB);
+	pHCB->HCS_virScbArray = pci_alloc_consistent(pdev, sz, &pHCB->HCS_physScbArray);
+	if (!pHCB->HCS_virScbArray) {
+		printk("inia100: SCB memory allocation error\n");
+		goto out_host_put;
+	}
+	memset(pHCB->HCS_virScbArray, 0, sz);
+
+	/* Get total memory needed for ESCB */
+	sz = ORC_MAXQUEUE * sizeof(ESCB);
+	pHCB->HCS_virEscbArray = pci_alloc_consistent(pdev, sz, &pHCB->HCS_physEscbArray);
+	if (!pHCB->HCS_virEscbArray) {
+		printk("inia100: ESCB memory allocation error\n");
+		goto out_free_scb_array;
+	}
+	memset(pHCB->HCS_virEscbArray, 0, sz);
+
+	dBiosAdr = pHCB->HCS_BIOS;
+	dBiosAdr = (dBiosAdr << 4);
+	pbBiosAdr = phys_to_virt(dBiosAdr);
+	if (init_orchid(pHCB)) {	/* Initialize orchid chip */
+		printk("inia100: initial orchid fail!!\n");
+		goto out_free_escb_array;
+	}
+
+	shost->io_port = pHCB->HCS_Base;
+	shost->n_io_port = 0xff;
+	shost->can_queue = ORC_MAXQUEUE;
+	shost->unique_id = shost->io_port;
+	shost->max_id = pHCB->HCS_MaxTar;
+	shost->max_lun = 16;
+	shost->irq = pHCB->HCS_Intr;
+	shost->this_id = pHCB->HCS_SCSI_ID;	/* Assign HCS index */
+	shost->sg_tablesize = TOTAL_SG_ENTRY;
+
+	/* Initial orc chip           */
+	ok = request_irq(pHCB->HCS_Intr, inia100_intr, SA_SHIRQ, "inia100", shost);
+	if (ok < 0) {
+		printk(KERN_WARNING "inia100: unable to get irq %d\n", pHCB->HCS_Intr);
+		goto out_free_escb_array;
+	}
+
+	pci_set_drvdata(pdev, shost);
+
+	ok = scsi_add_host(shost, &pdev->dev);
+	if (!ok)
+		goto out_free_irq;
+
+	scsi_scan_host(shost);
+	return 0;
+
+ out_free_irq:
+        free_irq(shost->irq, shost);
+ out_free_escb_array:
+	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ESCB),
+			pHCB->HCS_virEscbArray, pHCB->HCS_physEscbArray);
+ out_free_scb_array:
+	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
+			pHCB->HCS_virScbArray, pHCB->HCS_physScbArray);
+ out_host_put:
+	scsi_host_put(shost);
+ out_release_region:
+        release_region(pHCB->HCS_Base, 256);
+ out_disable_device:
+	pci_disable_device(pdev);
+ out:
+	return ok;
 }
 
-/*
- * Release ressources
- */
-static int inia100_release(struct Scsi_Host *hreg)
+static void __devexit inia100_remove_one(struct pci_dev *pdev)
 {
-	ORC_HCS *pHCB = (ORC_HCS *)hreg->hostdata;
+	struct Scsi_Host *shost = pci_get_drvdata(pdev);
+	ORC_HCS *pHCB = (ORC_HCS *)shost->hostdata;
+
+	scsi_remove_host(shost);
 
-        free_irq(hreg->irq, hreg);
-        release_region(hreg->io_port, 256);
-	if(pHCB->HCS_virEscbArray) {
-		pci_free_consistent(pHCB->pdev, ORC_MAXQUEUE * sizeof(ESCB),
+        free_irq(shost->irq, shost);
+	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ESCB),
 			pHCB->HCS_virEscbArray, pHCB->HCS_physEscbArray);
-		pHCB->HCS_virEscbArray = NULL;
-	}
-	if(pHCB->HCS_virScbArray) {
-		pci_free_consistent(pHCB->pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
+	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
 			pHCB->HCS_virScbArray, pHCB->HCS_physScbArray);
-		pHCB->HCS_virScbArray = NULL;
-	}
-	pci_disable_device(pHCB->pdev);
-        return 0;
+        release_region(shost->io_port, 256);
+
+	scsi_host_put(shost);
 } 
 
+static struct pci_device_id inia100_pci_tbl[] = {
+	{ORC_VENDOR_ID, ORC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{0,}
+};
+MODULE_DEVICE_TABLE(pci, inia100_pci_tbl);
+
+static struct pci_driver inia100_pci_driver = {
+	.name		= "inia100",
+	.id_table	= inia100_pci_tbl,
+	.probe		= inia100_probe_one,
+	.remove		= __devexit_p(inia100_remove_one),
+};
+
+static int __init inia100_init(void)
+{
+	return pci_module_init(&inia100_pci_driver);
+}
+
+static void __exit inia100_exit(void)
+{
+	pci_unregister_driver(&inia100_pci_driver);
+}
+
+MODULE_DESCRIPTION("Initio A100U2W SCSI driver");
+MODULE_AUTHOR("Initio Corporation");
 MODULE_LICENSE("Dual BSD/GPL");
-/*#include "inia100scsi.c" */
+
+module_init(inia100_init);
+module_exit(inia100_exit);
diff -Nru a/drivers/scsi/inia100.h b/drivers/scsi/inia100.h
--- a/drivers/scsi/inia100.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/inia100.h	Thu Jan  8 23:00:23 2004
@@ -67,13 +67,6 @@
 #include <linux/types.h>
 #include <linux/pci.h>
 
-static int inia100_detect(Scsi_Host_Template *);
-static int inia100_release(struct Scsi_Host *);
-static int inia100_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *));
-static int inia100_abort(Scsi_Cmnd *);
-static int inia100_device_reset(Scsi_Cmnd *);
-static int inia100_bus_reset(Scsi_Cmnd *);
-
 #define inia100_REVID "Initio INI-A100U2W SCSI device driver; Revision: 1.02d"
 
 #define ULONG   unsigned long
@@ -115,13 +108,6 @@
 	U32 SG_Len;		/* Data Length */
 } ORC_SG;
 
-typedef struct inia100_Adpt_Struc {
-        UWORD ADPT_BIOS;        /* 0 */
-        UWORD ADPT_BASE;        /* 1 */
-        struct pci_dev *ADPT_pdev;      /* 2 */
-} INIA100_ADPT_STRUCT;
-
-
 /* SCSI related definition                                              */
 #define DISC_NOT_ALLOW          0x80	/* Disconnect is not allowed    */
 #define DISC_ALLOW              0xC0	/* Disconnect is allowed        */
@@ -211,7 +197,7 @@
 
 typedef struct orc_extended_scb {	/* Extended SCB                 */
 	ORC_SG ESCB_SGList[TOTAL_SG_ENTRY];	/*0 Start of SG list              */
-	Scsi_Cmnd *SCB_Srb;	/*50 SRB Pointer */
+	struct scsi_cmnd *SCB_Srb;	/*50 SRB Pointer */
 } ESCB;
 
 /***********************************************************************
@@ -344,8 +330,8 @@
 	ORC_TCS HCS_Tcs[16];	/* 28 */
 	U32 BitAllocFlag[MAX_CHANNELS][8];	/* Max STB is 256, So 256/32 */
 	spinlock_t BitAllocFlagLock;
-	Scsi_Cmnd *pSRB_head;
-	Scsi_Cmnd *pSRB_tail;
+	struct scsi_cmnd *pSRB_head;
+	struct scsi_cmnd *pSRB_tail;
 	spinlock_t pSRB_lock;
 	struct pci_dev *pdev;
 } ORC_HCS;
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/libata-core.c	Thu Jan  8 23:00:23 2004
@@ -1619,7 +1619,7 @@
 static void ata_sg_clean(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 	struct scatterlist *sg = qc->sg;
 	int dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
@@ -1635,8 +1635,8 @@
 	if (cmd->use_sg)
 		pci_unmap_sg(ap->host_set->pdev, sg, qc->n_elem, dir);
 	else
-		pci_unmap_single(ap->host_set->pdev, sg[0].dma_address,
-				 sg[0].length, dir);
+		pci_unmap_single(ap->host_set->pdev, sg_dma_address(&sg[0]),
+				 sg_dma_len(&sg[0]), dir);
 
 	qc->flags &= ~ATA_QCFLAG_SG;
 	qc->sg = NULL;
@@ -1659,8 +1659,8 @@
 	assert(qc->n_elem > 0);
 
 	for (i = 0; i < qc->n_elem; i++) {
-		ap->prd[i].addr = cpu_to_le32(sg[i].dma_address);
-		ap->prd[i].flags_len = cpu_to_le32(sg[i].length);
+		ap->prd[i].addr = cpu_to_le32(sg_dma_address(&sg[i]));
+		ap->prd[i].flags_len = cpu_to_le32(sg_dma_len(&sg[i]));
 		VPRINTK("PRD[%u] = (0x%X, 0x%X)\n",
 			i, le32_to_cpu(ap->prd[i].addr), le32_to_cpu(ap->prd[i].flags_len));
 	}
@@ -1681,7 +1681,7 @@
 static int ata_sg_setup_one(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 	int dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 	struct scatterlist *sg = qc->sg;
 	unsigned int have_sg = (qc->flags & ATA_QCFLAG_SG);
@@ -1691,12 +1691,12 @@
 
 	sg->page = virt_to_page(cmd->request_buffer);
 	sg->offset = (unsigned long) cmd->request_buffer & ~PAGE_MASK;
-	sg->length = cmd->request_bufflen;
+	sg_dma_len(sg) = cmd->request_bufflen;
 
 	if (!have_sg)
 		return 0;
 
-	sg->dma_address = pci_map_single(ap->host_set->pdev,
+	sg_dma_address(sg) = pci_map_single(ap->host_set->pdev,
 					 cmd->request_buffer,
 					 cmd->request_bufflen, dir);
 
@@ -1720,7 +1720,7 @@
 static int ata_sg_setup(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 	struct scatterlist *sg;
 	int n_elem;
 	unsigned int have_sg = (qc->flags & ATA_QCFLAG_SG);
@@ -1872,7 +1872,7 @@
 {
 	struct ata_queued_cmd *qc;
 	struct scatterlist *sg;
-	Scsi_Cmnd *cmd;
+	struct scsi_cmnd *cmd;
 	unsigned char *buf;
 	u8 status;
 
@@ -1917,7 +1917,7 @@
 	qc->cursg_ofs++;
 
 	if (cmd->use_sg)
-		if ((qc->cursg_ofs * ATA_SECT_SIZE) == sg[qc->cursg].length) {
+		if ((qc->cursg_ofs * ATA_SECT_SIZE) == sg_dma_len(&sg[qc->cursg])) {
 			qc->cursg++;
 			qc->cursg_ofs = 0;
 		}
@@ -2092,7 +2092,7 @@
 void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat, unsigned int done_late)
 {
 	struct ata_port *ap = qc->ap;
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 	unsigned int tag, do_clear = 0;
 
 	assert(qc != NULL);	/* ata_qc_from_tag _might_ return NULL */
@@ -2163,7 +2163,7 @@
 int ata_qc_issue(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 	unsigned int dma = qc->flags & ATA_QCFLAG_DMA;
 
 	ata_dev_select(ap, qc->dev->devno, 1, 0);
@@ -2719,7 +2719,7 @@
 	DPRINTK("ENTER\n");
 
 	if (do_unregister)
-		scsi_remove_host(sh); /* FIXME: check return val */
+		scsi_remove_host(sh);
 
 	ata_thread_kill(ap);	/* FIXME: check return val */
 
@@ -3204,7 +3204,6 @@
 	for (i = 0; i < host_set->n_ports; i++) {
 		ap = host_set->ports[i];
 
-		/* FIXME: check return val */
 		scsi_remove_host(ap->host);
 	}
 
@@ -3215,13 +3214,10 @@
 		host_set->ports[0]->ops->host_stop(host_set);
 
 	for (i = 0; i < host_set->n_ports; i++) {
-		Scsi_Host_Template *sht;
-
 		ap = host_set->ports[i];
-		sht = ap->host->hostt;
 
 		ata_scsi_release(ap->host);
-		scsi_host_put(ap->host); /* FIXME: check return val */
+		scsi_host_put(ap->host);
 	}
 
 	pci_release_regions(pdev);
@@ -3279,6 +3275,7 @@
 	return (tmp == bits->val) ? 1 : 0;
 }
 
+
 /**
  *	ata_init -
  *
@@ -3304,6 +3301,7 @@
  */
 
 EXPORT_SYMBOL_GPL(pci_test_config_bits);
+EXPORT_SYMBOL_GPL(ata_std_bios_param);
 EXPORT_SYMBOL_GPL(ata_std_ports);
 EXPORT_SYMBOL_GPL(ata_device_add);
 EXPORT_SYMBOL_GPL(ata_qc_complete);
diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
--- a/drivers/scsi/libata-scsi.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/libata-scsi.c	Thu Jan  8 23:00:23 2004
@@ -32,10 +32,34 @@
 
 #include "libata.h"
 
+
+/**
+ *	ata_std_bios_param - generic bios head/sector/cylinder calculator
+ *	    used by sd. Most BIOSes nowadays expect a XXX/255/16  (CHS) 
+ *	    mapping. Some situations may arise where the disk is not 
+ *	    bootable if this is not used.
+ *
+ *	LOCKING:
+ *
+ *	RETURNS:
+ *
+ */
+int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
+		       sector_t capacity, int geom[]) 
+{
+	geom[0] = 255;
+	geom[1] = 63;
+	sector_div(capacity, 255*63);
+	geom[2] = capacity;
+
+	return 0;
+}
+
+
 struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap,
 				       struct ata_device *dev,
-				       Scsi_Cmnd *cmd,
-				       void (*done)(Scsi_Cmnd *))
+				       struct scsi_cmnd *cmd,
+				       void (*done)(struct scsi_cmnd *))
 {
 	struct ata_queued_cmd *qc;
 
@@ -69,7 +93,7 @@
 
 void ata_to_sense_error(struct ata_queued_cmd *qc)
 {
-	Scsi_Cmnd *cmd = qc->scsicmd;
+	struct scsi_cmnd *cmd = qc->scsicmd;
 
 	cmd->result = SAM_STAT_CHECK_CONDITION;
 
@@ -282,7 +306,7 @@
  */
 
 void ata_scsi_rw_queue(struct ata_port *ap, struct ata_device *dev,
-		      Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *),
+		      struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
 		      unsigned int cmd_size)
 {
 	struct ata_queued_cmd *qc;
@@ -332,7 +356,7 @@
  *	Length of response buffer.
  */
 
-static unsigned int ata_scsi_rbuf_get(Scsi_Cmnd *cmd, u8 **buf_out)
+static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
 {
 	u8 *buf;
 	unsigned int buflen;
@@ -363,7 +387,7 @@
  *	spin_lock_irqsave(host_set lock)
  */
 
-static inline void ata_scsi_rbuf_put(Scsi_Cmnd *cmd)
+static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd)
 {
 	if (cmd->use_sg) {
 		struct scatterlist *sg;
@@ -394,7 +418,7 @@
 {
 	u8 *rbuf;
 	unsigned int buflen, rc;
-	Scsi_Cmnd *cmd = args->cmd;
+	struct scsi_cmnd *cmd = args->cmd;
 
 	buflen = ata_scsi_rbuf_get(cmd, &rbuf);
 	rc = actor(args, rbuf, buflen);
@@ -817,7 +841,7 @@
  *	spin_lock_irqsave(host_set lock)
  */
 
-void ata_scsi_badcmd(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *), u8 asc, u8 ascq)
+void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
 {
 	DPRINTK("ENTER\n");
 	cmd->result = SAM_STAT_CHECK_CONDITION;
@@ -847,7 +871,7 @@
  */
 
 static void atapi_scsi_queuecmd(struct ata_port *ap, struct ata_device *dev,
-			       Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
+			       struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
 	struct ata_queued_cmd *qc;
 	u8 *scsicmd = cmd->cmnd, status;
@@ -958,7 +982,7 @@
  *	Zero.
  */
 
-int ata_scsi_queuecmd(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
+int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
 	u8 *scsicmd = cmd->cmnd;
 	struct ata_port *ap;
diff -Nru a/drivers/scsi/libata.h b/drivers/scsi/libata.h
--- a/drivers/scsi/libata.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/libata.h	Thu Jan  8 23:00:23 2004
@@ -31,8 +31,8 @@
 struct ata_scsi_args {
 	struct ata_port		*ap;
 	struct ata_device	*dev;
-	Scsi_Cmnd		*cmd;
-	void			(*done)(Scsi_Cmnd *);
+	struct scsi_cmnd		*cmd;
+	void			(*done)(struct scsi_cmnd *);
 };
 
 
@@ -51,7 +51,7 @@
 /* libata-scsi.c */
 extern void ata_to_sense_error(struct ata_queued_cmd *qc);
 extern void ata_scsi_rw_queue(struct ata_port *ap, struct ata_device *dev,
-		      Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *),
+		      struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
 		      unsigned int cmd_size);
 extern int ata_scsi_error(struct Scsi_Host *host);
 extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
@@ -74,19 +74,19 @@
 			        unsigned int buflen);
 extern unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
 				   unsigned int buflen);
-extern void ata_scsi_badcmd(Scsi_Cmnd *cmd,
-			    void (*done)(Scsi_Cmnd *),
+extern void ata_scsi_badcmd(struct scsi_cmnd *cmd,
+			    void (*done)(struct scsi_cmnd *),
 			    u8 asc, u8 ascq);
 extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args, 
                         unsigned int (*actor) (struct ata_scsi_args *args,
                                            u8 *rbuf, unsigned int buflen));
 
-static inline void ata_bad_scsiop(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
+static inline void ata_bad_scsiop(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
 	ata_scsi_badcmd(cmd, done, 0x20, 0x00);
 }
 
-static inline void ata_bad_cdb(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
+static inline void ata_bad_cdb(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
 	ata_scsi_badcmd(cmd, done, 0x24, 0x00);
 }
diff -Nru a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
--- a/drivers/scsi/megaraid.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/megaraid.c	Thu Jan  8 23:00:23 2004
@@ -14,6 +14,9 @@
  *	  - speed-ups (list handling fixes, issued_list, optimizations.)
  *	  - lots of cleanups.
  *
+ * Copyright (c) 2003  Christoph Hellwig  <hch@lst.de>
+ *	  - new-style, hotplug-aware pci probing and scsi registration
+ *
  * Version : v2.00.3 (Feb 19, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
  *
  * Description: Linux device driver for LSI Logic MegaRAID controller
@@ -42,6 +45,7 @@
 #include <linux/list.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
+#include <linux/init.h>
 #include <scsi/scsicam.h>
 
 #include "scsi.h"
@@ -79,10 +83,6 @@
 static adapter_t *hba_soft_state[MAX_CONTROLLERS];
 static struct proc_dir_entry *mega_proc_dir_entry;
 
-static struct notifier_block mega_notifier = {
-	.notifier_call = megaraid_reboot_notify
-};
-
 /* For controller re-ordering */
 static struct mega_hbas mega_hbas[MAX_CONTROLLERS];
 
@@ -116,548 +116,6 @@
  */
 static int trace_level;
 
-/*
- * megaraid_validate_parms()
- *
- * Validate that any module parms passed in
- * have proper values.
- */
-static void
-megaraid_validate_parms(void)
-{
-	if( (max_cmd_per_lun <= 0) || (max_cmd_per_lun > MAX_CMD_PER_LUN) )
-		max_cmd_per_lun = MAX_CMD_PER_LUN;
-	if( max_mbox_busy_wait > MBOX_BUSY_WAIT )
-		max_mbox_busy_wait = MBOX_BUSY_WAIT;
-}
-
-
-/**
- * megaraid_detect()
- * @host_template - Our soft state maintained by mid-layer
- *
- * the detect entry point for the mid-layer.
- * We scan the PCI bus for our controllers and start them.
- *
- * Note: PCI_DEVICE_ID_PERC4_DI below represents the PERC4/Di class of
- * products. All of them share the same vendor id, device id, and subsystem
- * vendor id but different subsystem ids. As of now, driver does not use the
- * subsystem id.
- */
-static int
-megaraid_detect(Scsi_Host_Template *host_template)
-{
-	int	i;
-	u16	dev_sw_table[] = {	/* Table of all supported
-					   vendor/device ids */
-
-		PCI_VENDOR_ID_DELL,		PCI_DEVICE_ID_DISCOVERY, 
-		PCI_VENDOR_ID_DELL,		PCI_DEVICE_ID_PERC4_DI, 
-		PCI_VENDOR_ID_LSI_LOGIC,	PCI_DEVICE_ID_PERC4_QC_VERDE, 
-		PCI_VENDOR_ID_AMI,		PCI_DEVICE_ID_AMI_MEGARAID, 
-		PCI_VENDOR_ID_AMI,		PCI_DEVICE_ID_AMI_MEGARAID2, 
-		PCI_VENDOR_ID_AMI,		PCI_DEVICE_ID_AMI_MEGARAID3, 
-		PCI_VENDOR_ID_INTEL,		PCI_DEVICE_ID_AMI_MEGARAID3, 
-		PCI_VENDOR_ID_LSI_LOGIC,	PCI_DEVICE_ID_AMI_MEGARAID3 };
-
-	host_template->proc_name = "megaraid";
-
-	printk(KERN_NOTICE "megaraid: " MEGARAID_VERSION);
-
-	megaraid_validate_parms();
-
-	memset(mega_hbas, 0, sizeof (mega_hbas));
-
-	hba_count = 0;
-
-	/*
-	 * Scan PCI bus for our all devices.
-	 */
-	for( i = 0; i < sizeof(dev_sw_table)/sizeof(u16); i += 2 ) {
-
-		mega_find_card(host_template, dev_sw_table[i],
-				dev_sw_table[i+1]);
-	}
-
-	if(hba_count) {
-		/*
-		 * re-order hosts so that one with bootable logical drive
-		 * comes first
-		 */
-#ifdef CONFIG_PROC_FS
-		mega_proc_dir_entry = proc_mkdir("megaraid", &proc_root);
-
-		if(!mega_proc_dir_entry) {
-			printk(KERN_WARNING
-				"megaraid: failed to create megaraid root\n");
-		}
-		else {
-			for(i = 0; i < hba_count; i++) {
-				mega_create_proc_entry(i, mega_proc_dir_entry);
-			}
-		}
-#endif
-
-		/*
-		 * Register the driver as a character device, for applications
-		 * to access it for ioctls.
-		 * First argument (major) to register_chrdev implies a dynamic
-		 * major number allocation.
-		 */
-		major = register_chrdev(0, "megadev", &megadev_fops);
-
-		/*
-		 * Register the Shutdown Notification hook in kernel
-		 */
-		if(register_reboot_notifier(&mega_notifier)) {
-			printk(KERN_WARNING
-				"MegaRAID Shutdown routine not registered!!\n");
-		}
-
-	}
-
-	return hba_count;
-}
-
-
-
-/**
- * mega_find_card() - find and start this controller
- * @host_template - Our soft state maintained by mid-layer
- * @pci_vendor - pci vendor id for this controller
- * @pci_device - pci device id for this controller
- *
- * Scans the PCI bus for this vendor and device id combination, setup the
- * resources, and register ourselves as a SCSI HBA driver, and setup all
- * parameters for our soft state.
- *
- * This routine also checks for some buggy firmware and ajust the flags
- * accordingly.
- */
-static void
-mega_find_card(Scsi_Host_Template *host_template, u16 pci_vendor,
-	u16 pci_device)
-{
-	struct Scsi_Host	*host = NULL;
-	adapter_t	*adapter = NULL;
-	u32	magic64;
-	unsigned long	mega_baseport;
-	u16	subsysid, subsysvid;
-	u8	pci_bus;
-	u8	pci_dev_func;
-	u8	irq;
-	struct pci_dev	*pdev = NULL;
-	u8	did_ioremap_f = 0;
-	u8	did_req_region_f = 0;
-	u8	did_scsi_reg_f = 0;
-	u8	alloc_int_buf_f = 0;
-	u8	alloc_scb_f = 0;
-	u8	got_irq_f = 0;
-	u8	did_setup_mbox_f = 0;
-	unsigned long	tbase;
-	unsigned long	flag = 0;
-	int	i, j;
-
-	while((pdev = pci_find_device(pci_vendor, pci_device, pdev))) {
-
-		if(pci_enable_device (pdev)) continue;
-
-		pci_bus = pdev->bus->number;
-		pci_dev_func = pdev->devfn;
-
-		/*
-		 * For these vendor and device ids, signature offsets are not
-		 * valid and 64 bit is implicit
-		 */
-		if( (pci_vendor == PCI_VENDOR_ID_DELL &&
-			pci_device == PCI_DEVICE_ID_PERC4_DI) ||
-			(pci_vendor == PCI_VENDOR_ID_LSI_LOGIC &&
-			pci_device == PCI_DEVICE_ID_PERC4_QC_VERDE) ) {
-
-			flag |= BOARD_64BIT;
-		}
-		else {
-			pci_read_config_dword(pdev, PCI_CONF_AMISIG64,
-					&magic64);
-
-			if (magic64 == HBA_SIGNATURE_64BIT)
-				flag |= BOARD_64BIT;
-		}
-
-		subsysvid = pdev->subsystem_vendor;
-		subsysid = pdev->subsystem_device;
-
-		/*
-		 * If we do not find the valid subsys vendor id, refuse to
-		 * load the driver. This is part of PCI200X compliance
-		 * We load the driver if subsysvid is 0.
-		 */
-		if( subsysvid && (subsysvid != AMI_SUBSYS_VID) &&
-				(subsysvid != DELL_SUBSYS_VID) &&
-				(subsysvid != HP_SUBSYS_VID) &&
-				(subsysvid != INTEL_SUBSYS_VID) &&
-				(subsysvid != LSI_SUBSYS_VID) ) continue;
-
-
-		printk(KERN_NOTICE "megaraid: found 0x%4.04x:0x%4.04x:bus %d:",
-			pci_vendor, pci_device, pci_bus);
-
-		printk("slot %d:func %d\n",
-			PCI_SLOT(pci_dev_func), PCI_FUNC(pci_dev_func));
-
-		/* Read the base port and IRQ from PCI */
-		mega_baseport = pci_resource_start(pdev, 0);
-		irq = pdev->irq;
-
-		tbase = mega_baseport;
-
-		if( pci_resource_flags(pdev, 0) & IORESOURCE_MEM ) {
-
-			if (!request_mem_region(mega_baseport, 128,
-					"MegaRAID: LSI Logic Corporation.")) {
-				printk(KERN_WARNING
-					"megaraid: mem region busy!\n");
-				continue;
-			}
-
-			mega_baseport =
-				(unsigned long)ioremap(mega_baseport, 128);
-
-			if( !mega_baseport ) {
-				printk(KERN_WARNING
-					"megaraid: could not map hba memory\n");
-
-				release_mem_region(tbase, 128);
-
-				continue;
-			}
-
-			flag |= BOARD_MEMMAP;
-
-			did_ioremap_f = 1;
-		}
-		else {
-			mega_baseport += 0x10;
-
-			if( !request_region(mega_baseport, 16, "megaraid") )
-				goto fail_attach;
-
-			flag |= BOARD_IOMAP;
-
-			did_req_region_f = 1;
-		}
-
-		/* Initialize SCSI Host structure */
-		host = scsi_register(host_template, sizeof(adapter_t));
-
-		if(!host) goto fail_attach;
-
-		did_scsi_reg_f = 1;
-
-		scsi_set_device(host, &pdev->dev);
-
-		adapter = (adapter_t *)host->hostdata;
-		memset(adapter, 0, sizeof(adapter_t));
-
-		printk(KERN_NOTICE
-			"scsi%d:Found MegaRAID controller at 0x%lx, IRQ:%d\n",
-			host->host_no, mega_baseport, irq);
-
-		adapter->base = mega_baseport;
-
-		/* Copy resource info into structure */
-		INIT_LIST_HEAD(&adapter->free_list);
-		INIT_LIST_HEAD(&adapter->pending_list);
-		INIT_LIST_HEAD(&adapter->completed_list);
-
-		adapter->flag = flag;
-		spin_lock_init(&adapter->lock);
-		scsi_assign_lock(host, &adapter->lock);
-
-		host->cmd_per_lun = max_cmd_per_lun;
-		host->max_sectors = max_sectors_per_io;
-
-		adapter->dev = pdev;
-		adapter->host = host;
-
-		adapter->host->irq = irq;
-
-		if( flag & BOARD_MEMMAP ) {
-			adapter->host->base = tbase;
-		}
-		else {
-			adapter->host->io_port = tbase;
-			adapter->host->n_io_port = 16;
-		}
-
-		adapter->host->unique_id = (pci_bus << 8) | pci_dev_func;
-
-		/*
-		 * Allocate buffer to issue internal commands.
-		 */
-		adapter->mega_buffer = pci_alloc_consistent(adapter->dev,
-			MEGA_BUFFER_SIZE, &adapter->buf_dma_handle);
-
-		if( !adapter->mega_buffer ) {
-			printk(KERN_WARNING "megaraid: out of RAM.\n");
-			goto fail_attach;
-		}
-		alloc_int_buf_f = 1;
-
-		adapter->scb_list = kmalloc(sizeof(scb_t)*MAX_COMMANDS,
-				GFP_KERNEL);
-
-		if(!adapter->scb_list) {
-			printk(KERN_WARNING "megaraid: out of RAM.\n");
-			goto fail_attach;
-		}
-
-		alloc_scb_f = 1;
-
-		/* Request our IRQ */
-		if( adapter->flag & BOARD_MEMMAP ) {
-			if(request_irq(irq, megaraid_isr_memmapped, SA_SHIRQ,
-						"megaraid", adapter)) {
-				printk(KERN_WARNING
-					"megaraid: Couldn't register IRQ %d!\n",
-					irq);
-				goto fail_attach;
-			}
-		}
-		else {
-			if(request_irq(irq, megaraid_isr_iomapped, SA_SHIRQ,
-						"megaraid", adapter)) {
-				printk(KERN_WARNING
-					"megaraid: Couldn't register IRQ %d!\n",
-					irq);
-				goto fail_attach;
-			}
-		}
-		got_irq_f = 1;
-
-		if( mega_setup_mailbox(adapter) != 0 )
-			goto fail_attach;
-
-		did_setup_mbox_f = 1;
-
-		if( mega_query_adapter(adapter) != 0 )
-			goto fail_attach;
-
-		/*
-		 * Have checks for some buggy f/w
-		 */
-		if((subsysid == 0x1111) && (subsysvid == 0x1111)) {
-			/*
-			 * Which firmware
-			 */
-			if (!strcmp(adapter->fw_version, "3.00") ||
-					!strcmp(adapter->fw_version, "3.01")) {
-
-				printk( KERN_WARNING
-					"megaraid: Your  card is a Dell PERC "
-					"2/SC RAID controller with  "
-					"firmware\nmegaraid: 3.00 or 3.01.  "
-					"This driver is known to have "
-					"corruption issues\nmegaraid: with "
-					"those firmware versions on this "
-					"specific card.  In order\nmegaraid: "
-					"to protect your data, please upgrade "
-					"your firmware to version\nmegaraid: "
-					"3.10 or later, available from the "
-					"Dell Technical Support web\n"
-					"megaraid: site at\nhttp://support."
-					"dell.com/us/en/filelib/download/"
-					"index.asp?fileid=2940\n"
-				);
-			}
-		}
-
-		/*
-		 * If we have a HP 1M(0x60E7)/2M(0x60E8) controller with
-		 * firmware H.01.07, H.01.08, and H.01.09 disable 64 bit
-		 * support, since this firmware cannot handle 64 bit
-		 * addressing
-		 */
-
-		if((subsysvid == HP_SUBSYS_VID) &&
-				((subsysid == 0x60E7)||(subsysid == 0x60E8))) {
-
-			/*
-			 * which firmware
-			 */
-			if( !strcmp(adapter->fw_version, "H01.07") ||
-				!strcmp(adapter->fw_version, "H01.08") ||
-				!strcmp(adapter->fw_version, "H01.09") ) {
-
-				printk(KERN_WARNING
-					"megaraid: Firmware H.01.07, "
-					"H.01.08, and H.01.09 on 1M/2M "
-					"controllers\n"
-					"megaraid: do not support 64 bit "
-					"addressing.\nmegaraid: DISABLING "
-					"64 bit support.\n");
-				adapter->flag &= ~BOARD_64BIT;
-			}
-		}
-
-
-		if(mega_is_bios_enabled(adapter)) {
-			mega_hbas[hba_count].is_bios_enabled = 1;
-		}
-		mega_hbas[hba_count].hostdata_addr = adapter;
-
-		/*
-		 * Find out which channel is raid and which is scsi. This is
-		 * for ROMB support.
-		 */
-		mega_enum_raid_scsi(adapter);
-
-		/*
-		 * Find out if a logical drive is set as the boot drive. If
-		 * there is one, will make that as the first logical drive.
-		 * ROMB: Do we have to boot from a physical drive. Then all
-		 * the physical drives would appear before the logical disks.
-		 * Else, all the physical drives would be exported to the mid
-		 * layer after logical drives.
-		 */
-		mega_get_boot_drv(adapter);
-
-		if( ! adapter->boot_pdrv_enabled ) {
-			for( i = 0; i < NVIRT_CHAN; i++ )
-				adapter->logdrv_chan[i] = 1;
-
-			for( i = NVIRT_CHAN; i<MAX_CHANNELS+NVIRT_CHAN; i++ )
-				adapter->logdrv_chan[i] = 0;
-
-			adapter->mega_ch_class <<= NVIRT_CHAN;
-		}
-		else {
-			j = adapter->product_info.nchannels;
-			for( i = 0; i < j; i++ )
-				adapter->logdrv_chan[i] = 0;
-
-			for( i = j; i < NVIRT_CHAN + j; i++ )
-				adapter->logdrv_chan[i] = 1;
-		}
-
-
-		/*
-		 * Do we support random deletion and addition of logical
-		 * drives
-		 */
-		adapter->read_ldidmap = 0;	/* set it after first logdrv
-						   delete cmd */
-		adapter->support_random_del = mega_support_random_del(adapter);
-
-		/* Initialize SCBs */
-		if(mega_init_scb(adapter)) {
-			goto fail_attach;
-		}
-
-		/*
-		 * Reset the pending commands counter
-		 */
-		atomic_set(&adapter->pend_cmds, 0);
-
-		/*
-		 * Reset the adapter quiescent flag
-		 */
-		atomic_set(&adapter->quiescent, 0);
-
-		hba_soft_state[hba_count] = adapter;
-
-		/*
-		 * Fill in the structure which needs to be passed back to the
-		 * application when it does an ioctl() for controller related
-		 * information.
-		 */
-		i = hba_count;
-
-		mcontroller[i].base = mega_baseport;
-		mcontroller[i].irq = irq;
-		mcontroller[i].numldrv = adapter->numldrv;
-		mcontroller[i].pcibus = pci_bus;
-		mcontroller[i].pcidev = pci_device;
-		mcontroller[i].pcifun = PCI_FUNC (pci_dev_func);
-		mcontroller[i].pciid = -1;
-		mcontroller[i].pcivendor = pci_vendor;
-		mcontroller[i].pcislot = PCI_SLOT (pci_dev_func);
-		mcontroller[i].uid = (pci_bus << 8) | pci_dev_func;
-
-
-		/* Set the Mode of addressing to 64 bit if we can */
-		if((adapter->flag & BOARD_64BIT)&&(sizeof(dma_addr_t) == 8)) {
-			pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
-			adapter->has_64bit_addr = 1;
-		}
-		else  {
-			pci_set_dma_mask(pdev, 0xffffffff);
-			adapter->has_64bit_addr = 0;
-		}
-		
-		init_MUTEX(&adapter->int_mtx);
-		init_waitqueue_head(&adapter->int_waitq);
-
-		adapter->this_id = DEFAULT_INITIATOR_ID;
-		adapter->host->this_id = DEFAULT_INITIATOR_ID;
-
-#if MEGA_HAVE_CLUSTERING
-		/*
-		 * Is cluster support enabled on this controller
-		 * Note: In a cluster the HBAs ( the initiators ) will have
-		 * different target IDs and we cannot assume it to be 7. Call
-		 * to mega_support_cluster() will get the target ids also if
-		 * the cluster support is available
-		 */
-		adapter->has_cluster = mega_support_cluster(adapter);
-
-		if( adapter->has_cluster ) {
-			printk(KERN_NOTICE
-				"megaraid: Cluster driver, initiator id:%d\n",
-				adapter->this_id);
-		}
-#endif
-
-		hba_count++;
-		continue;
-
-fail_attach:
-		if( did_setup_mbox_f ) {
-			pci_free_consistent(adapter->dev, sizeof(mbox64_t),
-					(void *)adapter->una_mbox64,
-					adapter->una_mbox64_dma);
-		}
-
-		if( got_irq_f ) {
-			irq_disable(adapter);
-			free_irq(adapter->host->irq, adapter);
-		}
-
-		if( alloc_scb_f ) {
-			kfree(adapter->scb_list);
-		}
-
-		if( alloc_int_buf_f ) {
-			pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE,
-					(void *)adapter->mega_buffer,
-					adapter->buf_dma_handle);
-		}
-
-		if( did_scsi_reg_f ) scsi_unregister(host);
-
-		if( did_ioremap_f ) {
-			iounmap((void *)mega_baseport);
-			release_mem_region(tbase, 128);
-		}
-
-		if( did_req_region_f )
-			release_region(mega_baseport, 16);
-	}
-
-	return;
-}
-
-
 /**
  * mega_setup_mailbox()
  * @adapter - pointer to our soft state
@@ -2396,126 +1854,6 @@
 		enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i];
 }
 
-/*
- * Release the controller's resources
- */
-static int
-megaraid_release(struct Scsi_Host *host)
-{
-	adapter_t	*adapter;
-	mbox_t	*mbox;
-	u_char	raw_mbox[sizeof(struct mbox_out)];
-	char	buf[12] = { 0 };
-
-	adapter = (adapter_t *)host->hostdata;
-	mbox = (mbox_t *)raw_mbox;
-
-	printk(KERN_NOTICE "megaraid: being unloaded...");
-
-	/* Flush adapter cache */
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
-	raw_mbox[0] = FLUSH_ADAPTER;
-
-	irq_disable(adapter);
-	free_irq(adapter->host->irq, adapter);
-
-	/* Issue a blocking (interrupts disabled) command to the card */
-	issue_scb_block(adapter, raw_mbox);
-
-	/* Flush disks cache */
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
-	raw_mbox[0] = FLUSH_SYSTEM;
-
-	/* Issue a blocking (interrupts disabled) command to the card */
-	issue_scb_block(adapter, raw_mbox);
-
-
-	/* Free our resources */
-	if( adapter->flag & BOARD_MEMMAP ) {
-		iounmap((void *)adapter->base);
-		release_mem_region(adapter->host->base, 128);
-	}
-	else {
-		release_region(adapter->base, 16);
-	}
-
-	mega_free_sgl(adapter);
-
-#ifdef CONFIG_PROC_FS
-	if( adapter->controller_proc_dir_entry ) {
-		remove_proc_entry("stat", adapter->controller_proc_dir_entry);
-		remove_proc_entry("config",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("mailbox",
-				adapter->controller_proc_dir_entry);
-#if MEGA_HAVE_ENH_PROC
-		remove_proc_entry("rebuild-rate",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("battery-status",
-				adapter->controller_proc_dir_entry);
-
-		remove_proc_entry("diskdrives-ch0",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("diskdrives-ch1",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("diskdrives-ch2",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("diskdrives-ch3",
-				adapter->controller_proc_dir_entry);
-
-		remove_proc_entry("raiddrives-0-9",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("raiddrives-10-19",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("raiddrives-20-29",
-				adapter->controller_proc_dir_entry);
-		remove_proc_entry("raiddrives-30-39",
-				adapter->controller_proc_dir_entry);
-#endif
-
-		sprintf(buf, "hba%d", adapter->host->host_no);
-		remove_proc_entry(buf, mega_proc_dir_entry);
-	}
-#endif
-
-	pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE,
-			adapter->mega_buffer, adapter->buf_dma_handle);
-	kfree(adapter->scb_list);
-	pci_free_consistent(adapter->dev, sizeof(mbox64_t),
-			(void *)adapter->una_mbox64, adapter->una_mbox64_dma);
-
-	hba_count--;
-
-	if( hba_count == 0 ) {
-
-		/*
-		 * Unregister the character device interface to the driver.
-		 */
-		unregister_chrdev(major, "megadev");
-
-		unregister_reboot_notifier(&mega_notifier);
-
-#ifdef CONFIG_PROC_FS
-		if( adapter->controller_proc_dir_entry ) {
-			remove_proc_entry ("megaraid", &proc_root);
-		}
-#endif
-
-	}
-
-	/*
-	 * Release the controller memory. A word of warning this frees
-	 * hostdata and that includes adapter-> so be careful what you
-	 * dereference beyond this point
-	 */
-	scsi_unregister(host);
-
-
-	printk("ok.\n");
-
-	return 0;
-}
-
 static inline void
 mega_free_sgl(adapter_t *adapter)
 {
@@ -3850,76 +3188,6 @@
 }
 
 /**
- * megaraid_reboot_notify()
- * @this - unused
- * @code - shutdown code
- * @unused - unused
- *
- * This routine will be called when the use has done a forced shutdown on the
- * system. Flush the Adapter and disks cache.
- */
-static int
-megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
-		void *unused)
-{
-	adapter_t *adapter;
-	struct Scsi_Host *host;
-	u8 raw_mbox[sizeof(struct mbox_out)];
-	mbox_t *mbox;
-	int i,j;
-
-	/*
-	 * Flush the controller's cache irrespective of the codes coming down.
-	 * SYS_DOWN, SYS_HALT, SYS_RESTART, SYS_POWER_OFF
-	 */
-	for( i = 0; i < hba_count; i++ ) {
-		printk(KERN_INFO "megaraid: flushing adapter %d..", i);
-		host = hba_soft_state[i]->host;
-
-		adapter = (adapter_t *)host->hostdata;
-		mbox = (mbox_t *)raw_mbox;
-
-		/* Flush adapter cache */
-		memset(&mbox->m_out, 0, sizeof(raw_mbox));
-		raw_mbox[0] = FLUSH_ADAPTER;
-
-		irq_disable(adapter);
-		free_irq(adapter->host->irq, adapter);
-
-		/*
-		 * Issue a blocking (interrupts disabled) command to
-		 * the card
-		 */
-		issue_scb_block(adapter, raw_mbox);
-
-		/* Flush disks cache */
-		memset(&mbox->m_out, 0, sizeof(raw_mbox));
-		raw_mbox[0] = FLUSH_SYSTEM;
-
-		issue_scb_block(adapter, raw_mbox);
-
-		printk("Done.\n");
-
-		if( atomic_read(&adapter->pend_cmds) > 0 ) {
-			printk(KERN_WARNING "megaraid: pending commands!!\n");
-		}
-	}
-
-	/*
-	 * Have a delibrate delay to make sure all the caches are
-	 * actually flushed.
-	 */
-	printk("megaraid: cache flush delay: ");
-	for( j = 10; j >= 0; j-- ) {
-		printk("[%d] ", j);
-		mdelay(1000);
-	}
-	printk("\n");
-
-	return NOTIFY_DONE;
-}
-
-/**
  * mega_init_scb()
  * @adapter - pointer to our soft state
  *
@@ -5345,24 +4613,553 @@
 	kfree(pdev);
 }
 
-static Scsi_Host_Template driver_template = {
-	.name =				"MegaRAID",
-	.detect =			megaraid_detect,
-	.release =			megaraid_release,
-	.info =				megaraid_info,
-	.queuecommand =			megaraid_queue,	
-	.bios_param =			megaraid_biosparam,
-	.max_sectors =			MAX_SECTORS_PER_IO,
-	.can_queue =			MAX_COMMANDS,
-	.this_id =			DEFAULT_INITIATOR_ID,
-	.sg_tablesize =			MAX_SGLIST,
-	.cmd_per_lun =			DEF_CMD_PER_LUN,
-	.use_clustering =		ENABLE_CLUSTERING,
-	.eh_abort_handler =		megaraid_abort,
-	.eh_device_reset_handler =	megaraid_reset,
-	.eh_bus_reset_handler =		megaraid_reset,
-	.eh_host_reset_handler =	megaraid_reset,
+static struct scsi_host_template megaraid_template = {
+	.name				= "MegaRAID",
+	.proc_name			= "megaraid",
+	.info				= megaraid_info,
+	.queuecommand			= megaraid_queue,	
+	.bios_param			= megaraid_biosparam,
+	.max_sectors			= MAX_SECTORS_PER_IO,
+	.can_queue			= MAX_COMMANDS,
+	.this_id			= DEFAULT_INITIATOR_ID,
+	.sg_tablesize			= MAX_SGLIST,
+	.cmd_per_lun			= DEF_CMD_PER_LUN,
+	.use_clustering			= ENABLE_CLUSTERING,
+	.eh_abort_handler		= megaraid_abort,
+	.eh_device_reset_handler	= megaraid_reset,
+	.eh_bus_reset_handler		= megaraid_reset,
+	.eh_host_reset_handler		= megaraid_reset,
 };
-#include "scsi_module.c"
+
+static int __devinit
+megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+	struct Scsi_Host *host;
+	adapter_t *adapter;
+	unsigned long mega_baseport, tbase, flag = 0;
+	u16 subsysid, subsysvid;
+	u8 pci_bus, pci_dev_func;
+	int irq, i, j;
+	int error = -ENODEV;
+
+	if (pci_enable_device(pdev))
+		goto out;
+
+	pci_bus = pdev->bus->number;
+	pci_dev_func = pdev->devfn;
+
+	/*
+	 * For these vendor and device ids, signature offsets are not
+	 * valid and 64 bit is implicit
+	 */
+	if (id->driver_data & BOARD_64BIT)
+		flag |= BOARD_64BIT;
+	else {
+		u32 magic64;
+
+		pci_read_config_dword(pdev, PCI_CONF_AMISIG64, &magic64);
+		if (magic64 == HBA_SIGNATURE_64BIT)
+			flag |= BOARD_64BIT;
+	}
+
+	subsysvid = pdev->subsystem_vendor;
+	subsysid = pdev->subsystem_device;
+
+	printk(KERN_NOTICE "megaraid: found 0x%4.04x:0x%4.04x:bus %d:",
+		id->vendor, id->device, pci_bus);
+
+	printk("slot %d:func %d\n",
+		PCI_SLOT(pci_dev_func), PCI_FUNC(pci_dev_func));
+
+	/* Read the base port and IRQ from PCI */
+	mega_baseport = pci_resource_start(pdev, 0);
+	irq = pdev->irq;
+
+	tbase = mega_baseport;
+	if (pci_resource_flags(pdev, 0) & IORESOURCE_MEM) {
+		flag |= BOARD_MEMMAP;
+
+		if (!request_mem_region(mega_baseport, 128, "megaraid")) {
+			printk(KERN_WARNING "megaraid: mem region busy!\n");
+			goto out_disable_device;
+		}
+
+		mega_baseport = (unsigned long)ioremap(mega_baseport, 128);
+		if (!mega_baseport) {
+			printk(KERN_WARNING
+			       "megaraid: could not map hba memory\n");
+			goto out_release_region;
+		}
+	} else {
+		flag |= BOARD_IOMAP;
+		mega_baseport += 0x10;
+
+		if (!request_region(mega_baseport, 16, "megaraid"))
+			goto out_disable_device;
+	}
+
+	/* Initialize SCSI Host structure */
+	host = scsi_host_alloc(&megaraid_template, sizeof(adapter_t));
+	if (!host)
+		goto out_iounmap;
+
+	adapter = (adapter_t *)host->hostdata;
+	memset(adapter, 0, sizeof(adapter_t));
+
+	printk(KERN_NOTICE
+		"scsi%d:Found MegaRAID controller at 0x%lx, IRQ:%d\n",
+		host->host_no, mega_baseport, irq);
+
+	adapter->base = mega_baseport;
+
+	INIT_LIST_HEAD(&adapter->free_list);
+	INIT_LIST_HEAD(&adapter->pending_list);
+	INIT_LIST_HEAD(&adapter->completed_list);
+
+	adapter->flag = flag;
+	spin_lock_init(&adapter->lock);
+	scsi_assign_lock(host, &adapter->lock);
+
+	host->cmd_per_lun = max_cmd_per_lun;
+	host->max_sectors = max_sectors_per_io;
+
+	adapter->dev = pdev;
+	adapter->host = host;
+
+	adapter->host->irq = irq;
+
+	if (flag & BOARD_MEMMAP)
+		adapter->host->base = tbase;
+	else {
+		adapter->host->io_port = tbase;
+		adapter->host->n_io_port = 16;
+	}
+
+	adapter->host->unique_id = (pci_bus << 8) | pci_dev_func;
+
+	/*
+	 * Allocate buffer to issue internal commands.
+	 */
+	adapter->mega_buffer = pci_alloc_consistent(adapter->dev,
+		MEGA_BUFFER_SIZE, &adapter->buf_dma_handle);
+	if (!adapter->mega_buffer) {
+		printk(KERN_WARNING "megaraid: out of RAM.\n");
+		goto out_host_put;
+	}
+
+	adapter->scb_list = kmalloc(sizeof(scb_t) * MAX_COMMANDS, GFP_KERNEL);
+	if (!adapter->scb_list) {
+		printk(KERN_WARNING "megaraid: out of RAM.\n");
+		goto out_free_cmd_buffer;
+	}
+
+	if (request_irq(irq, (adapter->flag & BOARD_MEMMAP) ?
+				megaraid_isr_memmapped : megaraid_isr_iomapped,
+					SA_SHIRQ, "megaraid", adapter)) {
+		printk(KERN_WARNING
+			"megaraid: Couldn't register IRQ %d!\n", irq);
+		goto out_free_scb_list;
+	}
+
+	if (mega_setup_mailbox(adapter))
+		goto out_free_irq;
+
+	if (mega_query_adapter(adapter))
+		goto out_free_mbox;
+
+	/*
+	 * Have checks for some buggy f/w
+	 */
+	if ((subsysid == 0x1111) && (subsysvid == 0x1111)) {
+		/*
+		 * Which firmware
+		 */
+		if (!strcmp(adapter->fw_version, "3.00") ||
+				!strcmp(adapter->fw_version, "3.01")) {
+
+			printk( KERN_WARNING
+				"megaraid: Your  card is a Dell PERC "
+				"2/SC RAID controller with  "
+				"firmware\nmegaraid: 3.00 or 3.01.  "
+				"This driver is known to have "
+				"corruption issues\nmegaraid: with "
+				"those firmware versions on this "
+				"specific card.  In order\nmegaraid: "
+				"to protect your data, please upgrade "
+				"your firmware to version\nmegaraid: "
+				"3.10 or later, available from the "
+				"Dell Technical Support web\n"
+				"megaraid: site at\nhttp://support."
+				"dell.com/us/en/filelib/download/"
+				"index.asp?fileid=2940\n"
+			);
+		}
+	}
+
+	/*
+	 * If we have a HP 1M(0x60E7)/2M(0x60E8) controller with
+	 * firmware H.01.07, H.01.08, and H.01.09 disable 64 bit
+	 * support, since this firmware cannot handle 64 bit
+	 * addressing
+	 */
+	if ((subsysvid == HP_SUBSYS_VID) &&
+	    ((subsysid == 0x60E7) || (subsysid == 0x60E8))) {
+		/*
+		 * which firmware
+		 */
+		if (!strcmp(adapter->fw_version, "H01.07") ||
+		    !strcmp(adapter->fw_version, "H01.08") ||
+		    !strcmp(adapter->fw_version, "H01.09") ) {
+			printk(KERN_WARNING
+				"megaraid: Firmware H.01.07, "
+				"H.01.08, and H.01.09 on 1M/2M "
+				"controllers\n"
+				"megaraid: do not support 64 bit "
+				"addressing.\nmegaraid: DISABLING "
+				"64 bit support.\n");
+			adapter->flag &= ~BOARD_64BIT;
+		}
+	}
+
+	if (mega_is_bios_enabled(adapter))
+		mega_hbas[hba_count].is_bios_enabled = 1;
+	mega_hbas[hba_count].hostdata_addr = adapter;
+
+	/*
+	 * Find out which channel is raid and which is scsi. This is
+	 * for ROMB support.
+	 */
+	mega_enum_raid_scsi(adapter);
+
+	/*
+	 * Find out if a logical drive is set as the boot drive. If
+	 * there is one, will make that as the first logical drive.
+	 * ROMB: Do we have to boot from a physical drive. Then all
+	 * the physical drives would appear before the logical disks.
+	 * Else, all the physical drives would be exported to the mid
+	 * layer after logical drives.
+	 */
+	mega_get_boot_drv(adapter);
+
+	if (adapter->boot_pdrv_enabled) {
+		j = adapter->product_info.nchannels;
+		for( i = 0; i < j; i++ )
+			adapter->logdrv_chan[i] = 0;
+		for( i = j; i < NVIRT_CHAN + j; i++ )
+			adapter->logdrv_chan[i] = 1;
+	} else {
+		for (i = 0; i < NVIRT_CHAN; i++)
+			adapter->logdrv_chan[i] = 1;
+		for (i = NVIRT_CHAN; i < MAX_CHANNELS+NVIRT_CHAN; i++)
+			adapter->logdrv_chan[i] = 0;
+		adapter->mega_ch_class <<= NVIRT_CHAN;
+	}
+
+	/*
+	 * Do we support random deletion and addition of logical
+	 * drives
+	 */
+	adapter->read_ldidmap = 0;	/* set it after first logdrv
+						   delete cmd */
+	adapter->support_random_del = mega_support_random_del(adapter);
+
+	/* Initialize SCBs */
+	if (mega_init_scb(adapter))
+		goto out_free_mbox;
+
+	/*
+	 * Reset the pending commands counter
+	 */
+	atomic_set(&adapter->pend_cmds, 0);
+
+	/*
+	 * Reset the adapter quiescent flag
+	 */
+	atomic_set(&adapter->quiescent, 0);
+
+	hba_soft_state[hba_count] = adapter;
+
+	/*
+	 * Fill in the structure which needs to be passed back to the
+	 * application when it does an ioctl() for controller related
+	 * information.
+	 */
+	i = hba_count;
+
+	mcontroller[i].base = mega_baseport;
+	mcontroller[i].irq = irq;
+	mcontroller[i].numldrv = adapter->numldrv;
+	mcontroller[i].pcibus = pci_bus;
+	mcontroller[i].pcidev = id->device;
+	mcontroller[i].pcifun = PCI_FUNC (pci_dev_func);
+	mcontroller[i].pciid = -1;
+	mcontroller[i].pcivendor = id->vendor;
+	mcontroller[i].pcislot = PCI_SLOT(pci_dev_func);
+	mcontroller[i].uid = (pci_bus << 8) | pci_dev_func;
+
+
+	/* Set the Mode of addressing to 64 bit if we can */
+	if ((adapter->flag & BOARD_64BIT) && (sizeof(dma_addr_t) == 8)) {
+		pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
+		adapter->has_64bit_addr = 1;
+	} else  {
+		pci_set_dma_mask(pdev, 0xffffffff);
+		adapter->has_64bit_addr = 0;
+	}
+		
+	init_MUTEX(&adapter->int_mtx);
+	init_waitqueue_head(&adapter->int_waitq);
+
+	adapter->this_id = DEFAULT_INITIATOR_ID;
+	adapter->host->this_id = DEFAULT_INITIATOR_ID;
+
+#if MEGA_HAVE_CLUSTERING
+	/*
+	 * Is cluster support enabled on this controller
+	 * Note: In a cluster the HBAs ( the initiators ) will have
+	 * different target IDs and we cannot assume it to be 7. Call
+	 * to mega_support_cluster() will get the target ids also if
+	 * the cluster support is available
+	 */
+	adapter->has_cluster = mega_support_cluster(adapter);
+	if (adapter->has_cluster) {
+		printk(KERN_NOTICE
+			"megaraid: Cluster driver, initiator id:%d\n",
+			adapter->this_id);
+	}
+#endif
+
+	pci_set_drvdata(pdev, host);
+
+	mega_create_proc_entry(hba_count, mega_proc_dir_entry);
+
+	error = scsi_add_host(host, &pdev->dev);
+	if (error)
+		goto out_free_mbox;
+
+	scsi_scan_host(host);
+	hba_count++;
+	return 0;
+
+ out_free_mbox:
+	pci_free_consistent(adapter->dev, sizeof(mbox64_t),
+			adapter->una_mbox64, adapter->una_mbox64_dma);
+ out_free_irq:
+	free_irq(adapter->host->irq, adapter);
+ out_free_scb_list:
+	kfree(adapter->scb_list);
+ out_free_cmd_buffer:
+	pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE,
+			adapter->mega_buffer, adapter->buf_dma_handle);
+ out_host_put:
+	scsi_host_put(host);
+ out_iounmap:
+	if (flag & BOARD_MEMMAP)
+		iounmap((void *)mega_baseport);
+ out_release_region:
+	if (flag & BOARD_MEMMAP)
+		release_mem_region(tbase, 128);
+	else
+		release_region(mega_baseport, 16);
+ out_disable_device:
+	pci_disable_device(pdev);
+ out:
+	return error;
+}
+
+static void
+__megaraid_shutdown(adapter_t *adapter)
+{
+	u_char	raw_mbox[sizeof(struct mbox_out)];
+	mbox_t	*mbox = (mbox_t *)raw_mbox;
+	int	i;
+
+	/* Flush adapter cache */
+	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	raw_mbox[0] = FLUSH_ADAPTER;
+
+	free_irq(adapter->host->irq, adapter);
+
+	/* Issue a blocking (interrupts disabled) command to the card */
+	issue_scb_block(adapter, raw_mbox);
+
+	/* Flush disks cache */
+	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	raw_mbox[0] = FLUSH_SYSTEM;
+
+	/* Issue a blocking (interrupts disabled) command to the card */
+	issue_scb_block(adapter, raw_mbox);
+	
+	if (atomic_read(&adapter->pend_cmds) > 0)
+		printk(KERN_WARNING "megaraid: pending commands!!\n");
+
+	/*
+	 * Have a delibrate delay to make sure all the caches are
+	 * actually flushed.
+	 */
+	for (i = 0; i <= 10; i++)
+		mdelay(1000);
+}
+
+static void
+megaraid_remove_one(struct pci_dev *pdev)
+{
+	struct Scsi_Host *host = pci_get_drvdata(pdev);
+	adapter_t *adapter = (adapter_t *)host->hostdata;
+	char	buf[12] = { 0 };
+
+	scsi_remove_host(host);
+
+	__megaraid_shutdown(adapter);
+
+	/* Free our resources */
+	if (adapter->flag & BOARD_MEMMAP) {
+		iounmap((void *)adapter->base);
+		release_mem_region(adapter->host->base, 128);
+	} else
+		release_region(adapter->base, 16);
+
+	mega_free_sgl(adapter);
+
+#ifdef CONFIG_PROC_FS
+	if (adapter->controller_proc_dir_entry) {
+		remove_proc_entry("stat", adapter->controller_proc_dir_entry);
+		remove_proc_entry("config",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("mailbox",
+				adapter->controller_proc_dir_entry);
+#if MEGA_HAVE_ENH_PROC
+		remove_proc_entry("rebuild-rate",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("battery-status",
+				adapter->controller_proc_dir_entry);
+
+		remove_proc_entry("diskdrives-ch0",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("diskdrives-ch1",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("diskdrives-ch2",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("diskdrives-ch3",
+				adapter->controller_proc_dir_entry);
+
+		remove_proc_entry("raiddrives-0-9",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("raiddrives-10-19",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("raiddrives-20-29",
+				adapter->controller_proc_dir_entry);
+		remove_proc_entry("raiddrives-30-39",
+				adapter->controller_proc_dir_entry);
+#endif
+		sprintf(buf, "hba%d", adapter->host->host_no);
+		remove_proc_entry(buf, mega_proc_dir_entry);
+	}
+#endif
+
+	pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE,
+			adapter->mega_buffer, adapter->buf_dma_handle);
+	kfree(adapter->scb_list);
+	pci_free_consistent(adapter->dev, sizeof(mbox64_t),
+			adapter->una_mbox64, adapter->una_mbox64_dma);
+
+	scsi_host_put(host);
+	pci_disable_device(pdev);
+
+	hba_count--;
+}
+
+static void
+megaraid_shutdown(struct device *dev)
+{
+	struct Scsi_Host *host = pci_get_drvdata(to_pci_dev(dev));
+	adapter_t *adapter = (adapter_t *)host->hostdata;
+
+	__megaraid_shutdown(adapter);
+}
+
+static struct pci_device_id megaraid_pci_tbl[] = {
+	{PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
+	{PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4_QC_VERDE,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
+	{PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{0,}
+};
+MODULE_DEVICE_TABLE(pci, megaraid_pci_tbl);
+
+static struct pci_driver megaraid_pci_driver = {
+	.name		= "megaraid",
+	.id_table	= megaraid_pci_tbl,
+	.probe		= megaraid_probe_one,
+	.remove		= __devexit_p(megaraid_remove_one),
+	.driver		= {
+		.shutdown = megaraid_shutdown,
+	},
+};
+
+static int __init megaraid_init(void)
+{
+	int error;
+
+	if ((max_cmd_per_lun <= 0) || (max_cmd_per_lun > MAX_CMD_PER_LUN))
+		max_cmd_per_lun = MAX_CMD_PER_LUN;
+	if (max_mbox_busy_wait > MBOX_BUSY_WAIT)
+		max_mbox_busy_wait = MBOX_BUSY_WAIT;
+
+	error = pci_module_init(&megaraid_pci_driver);
+	if (error) 
+		return error;
+	
+#ifdef CONFIG_PROC_FS
+	mega_proc_dir_entry = proc_mkdir("megaraid", &proc_root);
+	if (!mega_proc_dir_entry) {
+		printk(KERN_WARNING
+				"megaraid: failed to create megaraid root\n");
+	}
+#endif
+
+	/*
+	 * Register the driver as a character device, for applications
+	 * to access it for ioctls.
+	 * First argument (major) to register_chrdev implies a dynamic
+	 * major number allocation.
+	 */
+	major = register_chrdev(0, "megadev", &megadev_fops);
+	if (!major) {
+		printk(KERN_WARNING
+				"megaraid: failed to register char device\n");
+	}
+
+	return 0;
+}
+
+static void __exit megaraid_exit(void)
+{
+	/*
+	 * Unregister the character device interface to the driver.
+	 */
+	unregister_chrdev(major, "megadev");
+
+#ifdef CONFIG_PROC_FS
+	remove_proc_entry("megaraid", &proc_root);
+#endif
+
+	pci_unregister_driver(&megaraid_pci_driver);
+}
+
+module_init(megaraid_init);
+module_exit(megaraid_exit);
 
 /* vi: set ts=8 sw=8 tw=78: */
diff -Nru a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h
--- a/drivers/scsi/megaraid.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/megaraid.h	Thu Jan  8 23:00:24 2004
@@ -989,8 +989,6 @@
 
 const char *megaraid_info (struct Scsi_Host *);
 
-static int megaraid_detect(Scsi_Host_Template *);
-static void mega_find_card(Scsi_Host_Template *, u16, u16);
 static int mega_query_adapter(adapter_t *);
 static inline int issue_scb(adapter_t *, scb_t *);
 static int mega_setup_mailbox(adapter_t *);
@@ -1007,7 +1005,6 @@
 
 static void mega_free_scb(adapter_t *, scb_t *);
 
-static int megaraid_release (struct Scsi_Host *);
 static int megaraid_abort(Scsi_Cmnd *);
 static int megaraid_reset(Scsi_Cmnd *);
 static int megaraid_abort_and_reset(adapter_t *, Scsi_Cmnd *, int);
@@ -1025,8 +1022,6 @@
 static void mega_8_to_40ld (mraid_inquiry *inquiry,
 		mega_inquiry3 *enquiry3, mega_product_info *);
 
-static int megaraid_reboot_notify (struct notifier_block *,
-				   unsigned long, void *);
 static int megadev_open (struct inode *, struct file *);
 static int megadev_ioctl (struct inode *, struct file *, unsigned int,
 		unsigned long);
diff -Nru a/drivers/scsi/osst.c b/drivers/scsi/osst.c
--- a/drivers/scsi/osst.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/osst.c	Thu Jan  8 23:00:24 2004
@@ -16,15 +16,15 @@
   Copyright 1992 - 2002 Kai Makisara / Willem Riede
 	 email Kai.Makisara@metla.fi / osst@riede.org
 
-  $Header: /home/cvsroot/Driver/osst.c,v 1.68 2002/12/23 16:33:36 riede Exp $
+  $Header: /cvsroot/osst/Driver/osst.c,v 1.70 2003/12/23 14:22:12 wriede Exp $
 
   Microscopic alterations - Rik Ling, 2000/12/21
   Last st.c sync: Tue Oct 15 22:01:04 2002 by makisara
   Some small formal changes - aeb, 950809
 */
 
-static const char * cvsid = "$Id: osst.c,v 1.68 2002/12/23 16:33:36 riede Exp $";
-const char * osst_version = "0.99.0";
+static const char * cvsid = "$Id: osst.c,v 1.70 2003/12/23 14:22:12 wriede Exp $";
+const char * osst_version = "0.99.1";
 
 /* The "failure to reconnect" firmware bug */
 #define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/
@@ -846,9 +846,6 @@
 	/* TODO: Error handling */
 	if (STp->poll)
 		retval = osst_wait_frame (STp, aSRpnt, STp->first_frame_position, 0, timeout);
-#if 0// DEBUG
-	printk ("osst_read: wait for frame returned %i\n", retval);
-#endif
 	
 	memset(cmd, 0, MAX_COMMAND_SIZE);
 	cmd[0] = READ_6;
@@ -1279,14 +1276,14 @@
 	Scsi_Request  * SRpnt = * aSRpnt;
 	unsigned char * buffer, * p;
 	unsigned char	cmd[MAX_COMMAND_SIZE];
-	int             flag, new_frame, i;
-	int             nframes          = STp->cur_frames;
-	int             blks_per_frame   = ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt);
-	int             frame_seq_number = ntohl(STp->buffer->aux->frame_seq_num)
+	int		flag, new_frame, i;
+	int		nframes          = STp->cur_frames;
+	int		blks_per_frame   = ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt);
+	int		frame_seq_number = ntohl(STp->buffer->aux->frame_seq_num)
 						- (nframes + pending - 1);
-	int             logical_blk_num  = ntohl(STp->buffer->aux->logical_blk_num) 
+	int		logical_blk_num  = ntohl(STp->buffer->aux->logical_blk_num) 
 						- (nframes + pending - 1) * blks_per_frame;
-	char          * name             = tape_name(STp);
+	char	      * name             = tape_name(STp);
 	unsigned long	startwait        = jiffies;
 #if DEBUG
 	int		dbg              = debugging;
@@ -1472,7 +1469,7 @@
 {
 	unsigned char	cmd[MAX_COMMAND_SIZE];
 	Scsi_Request  * SRpnt;
-	char          * name      = tape_name(STp);
+	char	      * name      = tape_name(STp);
 	int		expected  = 0;
 	int		attempts  = 1000 / skip;
 	int		flag      = 1;
@@ -2189,6 +2186,7 @@
 	if (ppos == 5 || ppos == 0xbae || STp->buffer->syscall_result) {
 		if (osst_set_frame_position(STp, aSRpnt, ppos, 0))
 			printk(KERN_WARNING "%s:W: Couldn't position tape\n", name);
+		osst_wait_ready(STp, aSRpnt, 60 * 15, 0);
 		if (osst_initiate_read (STp, aSRpnt)) {
 			printk(KERN_WARNING "%s:W: Couldn't initiate read\n", name);
 			return 0;
@@ -2817,7 +2815,29 @@
 	return result;
 }
 
+static int osst_write_trailer(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt, int leave_at_EOT)
+{
+	ST_partstat * STps = &(STp->ps[STp->partition]);
+	int result = 0;
+
+	if (STp->write_type != OS_WRITE_NEW_MARK) {
+		/* true unless the user wrote the filemark for us */
+		result = osst_flush_drive_buffer(STp, aSRpnt);
+		if (result < 0) goto out;
+		result = osst_write_filemark(STp, aSRpnt);
+		if (result < 0) goto out;
+
+		if (STps->drv_file >= 0)
+			STps->drv_file++ ;
+		STps->drv_block = 0;
+	}
+	result = osst_write_eod(STp, aSRpnt);
+	osst_write_header(STp, aSRpnt, leave_at_EOT);
 
+	STps->eof = ST_FM;
+out:
+	return result;
+}
 
 /* osst versions of st functions - augmented and stripped to suit OnStream only */
 
@@ -2935,7 +2955,7 @@
 					result = (-EIO);
 				}
 			}
-			STps->drv_block = (-1);
+			STps->drv_block = (-1);		/* FIXME - even if write recovery succeeds? */
 		}
 		else {
 			STp->first_frame_position++;
@@ -3628,7 +3648,7 @@
 	/* Change the eof state if no data from tape or buffer */
 	if (total == 0) {
 		if (STps->eof == ST_FM_HIT) {
-			STps->eof = (STp->first_frame_position >= STp->eod_frame_ppos)?ST_EOD:ST_FM;
+			STps->eof = (STp->first_frame_position >= STp->eod_frame_ppos)?ST_EOD_2:ST_FM;
 			STps->drv_block = 0;
 			if (STps->drv_file >= 0)
 				STps->drv_file++;
@@ -4037,8 +4057,8 @@
 		if (debugging)
 		   printk(OSST_DEB_MSG "%s:D: Spacing to end of recorded medium.\n", name);
 #endif
-		osst_set_frame_position(STp, &SRpnt, STp->eod_frame_ppos, 0);
-	if (osst_get_logical_frame(STp, &SRpnt, -1, 0) < 0) {
+		if ((osst_position_tape_and_confirm(STp, &SRpnt, STp->eod_frame_ppos) < 0) ||
+			    (osst_get_logical_frame(STp, &SRpnt, -1, 0)               < 0)) {
 		   ioctl_result = -EIO;
 		   goto os_bypass;
 		}
@@ -4076,6 +4096,23 @@
 		break;
 
 	 case MTSETBLK:           /* Set block length */
+		 if ((STps->drv_block == 0 )			  &&
+		     !STp->dirty				  &&
+		     ((STp->buffer)->buffer_bytes == 0)		  &&
+		     ((arg & MT_ST_BLKSIZE_MASK) >= 512 )	  && 
+		     ((arg & MT_ST_BLKSIZE_MASK) <= OS_DATA_SIZE) &&
+		     !(OS_DATA_SIZE % (arg & MT_ST_BLKSIZE_MASK))  ) {
+			 /*
+			  * Only allowed to change the block size if you opened the
+			  * device at the beginning of a file before writing anything.
+			  * Note, that when reading, changing block_size is futile,
+			  * as the size used when writing overrides it.
+			  */
+			 STp->block_size = (arg & MT_ST_BLKSIZE_MASK);
+			 printk(KERN_INFO "%s:I: Block size set to %d bytes.\n",
+					   name, STp->block_size);
+			 return 0;
+		 }
 	 case MTSETDENSITY:       /* Set tape density */
 	 case MTSETDRVBUFFER:     /* Set drive buffering */
 	 case SET_DENS_AND_BLK:   /* Set density and block size */
@@ -4083,11 +4120,11 @@
 		 if (STp->dirty || (STp->buffer)->buffer_bytes != 0)
 			 return (-EIO);       /* Not allowed if data in buffer */
 		 if ((cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) &&
-		   (arg & MT_ST_BLKSIZE_MASK) != 0 &&
-		   ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block ||
-		    (arg & MT_ST_BLKSIZE_MASK) > STp->max_block ||
-		    (arg & MT_ST_BLKSIZE_MASK) > osst_buffer_size)) {
-			 printk(KERN_WARNING "%s:W: Illegal block size.\n", name);
+		     (arg & MT_ST_BLKSIZE_MASK) != 0                    &&
+		     (arg & MT_ST_BLKSIZE_MASK) != STp->block_size       ) {
+			 printk(KERN_WARNING "%s:W: Illegal to set block size to %d%s.\n",
+						name, (int)(arg & MT_ST_BLKSIZE_MASK),
+						(OS_DATA_SIZE % (arg & MT_ST_BLKSIZE_MASK))?"":" now");
 			 return (-EINVAL);
 		 }
 		 return 0;  /* FIXME silently ignore if block size didn't change */
@@ -4592,22 +4629,7 @@
 					       name, STp->nbr_waits, STp->nbr_finished);
 		}
 #endif
-		if (STp->write_type != OS_WRITE_NEW_MARK) {
-			/* true unless the user wrote the filemark for us */
-			result = osst_flush_drive_buffer(STp, &SRpnt);
-			if (result < 0) goto out;
-			result = osst_write_filemark(STp, &SRpnt);
-			if (result < 0) goto out;
-
-			if (STps->drv_file >= 0)
-				STps->drv_file++ ;
-			STps->drv_block = 0;
-		}
-		result = osst_write_eod(STp, &SRpnt);
-		osst_write_header(STp, &SRpnt, !(STp->rew_at_close));
-
-		STps->eof = ST_FM;
-
+		result = osst_write_trailer(STp, &SRpnt, !(STp->rew_at_close));
 #if DEBUG
 		if (debugging)
 			printk(OSST_DEB_MSG "%s:D: Buffer flushed, %d EOF(s) written\n",
@@ -4618,7 +4640,7 @@
 		STps = &(STp->ps[STp->partition]);
 		if (!STm->sysv || STps->rw != ST_READING) {
 			if (STp->can_bsr)
-		result = osst_flush_buffer(STp, &SRpnt, 0);	/* this is the default path */
+				result = osst_flush_buffer(STp, &SRpnt, 0); /* this is the default path */
 			else if (STps->eof == ST_FM_HIT) {
 				result = cross_eof(STp, &SRpnt, FALSE);
 					if (result) {
@@ -4633,7 +4655,7 @@
 		}
 		else if ((STps->eof == ST_NOEOF &&
 			  !(result = cross_eof(STp, &SRpnt, TRUE))) ||
-			  STps->eof == ST_FM_HIT) {
+			 STps->eof == ST_FM_HIT) {
 			if (STps->drv_file >= 0)
 				STps->drv_file++;
 			STps->drv_block = 0;
@@ -4736,6 +4758,7 @@
 #endif
 	if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
 		struct mtop mtc;
+		int    auto_weof = 0;
 
 		if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
 			retval = (-EINVAL);
@@ -4812,10 +4835,41 @@
 			STp->device->was_reset = 0;
 		}
 
-		if (mtc.mt_op != MTNOP && mtc.mt_op != MTWEOF && mtc.mt_op != MTWSM &&
-		    mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTSETBLK &&
-		    mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
-			STps->rw = ST_IDLE;  /* Prevent automatic WEOF and fsf */
+		if (mtc.mt_op != MTCOMPRESSION  && mtc.mt_op != MTLOCK         &&
+		    mtc.mt_op != MTNOP          && mtc.mt_op != MTSETBLK       &&
+		    mtc.mt_op != MTSETDENSITY   && mtc.mt_op != MTSETDRVBUFFER && 
+		    mtc.mt_op != MTMKPART       && mtc.mt_op != MTSETPART      &&
+		    mtc.mt_op != MTWEOF         && mtc.mt_op != MTWSM           ) {
+
+			/*
+			 * The user tells us to move to another position on the tape.
+			 * If we were appending to the tape content, that would leave
+			 * the tape without proper end, in that case write EOD and
+			 * update the header to reflect its position.
+			 */
+#if DEBUG
+			printk(KERN_WARNING "%s:D: auto_weod %s at ffp=%d,efp=%d,fsn=%d,lbn=%d,fn=%d,bn=%d\n", name,
+					STps->rw >= ST_WRITING ? "write" : STps->rw == ST_READING ? "read" : "idle",
+					STp->first_frame_position, STp->eod_frame_ppos, STp->frame_seq_number,
+					STp->logical_blk_num, STps->drv_file, STps->drv_block );
+#endif
+			if (STps->rw >= ST_WRITING && STp->first_frame_position >= STp->eod_frame_ppos) {
+				auto_weof = ((STp->write_type != OS_WRITE_NEW_MARK) &&
+							!(mtc.mt_op == MTREW || mtc.mt_op == MTOFFL));
+				i = osst_write_trailer(STp, &SRpnt,
+							!(mtc.mt_op == MTREW || mtc.mt_op == MTOFFL));
+#if DEBUG
+				printk(KERN_WARNING "%s:D: post trailer xeof=%d,ffp=%d,efp=%d,fsn=%d,lbn=%d,fn=%d,bn=%d\n",
+						name, auto_weof, STp->first_frame_position, STp->eod_frame_ppos,
+						STp->frame_seq_number, STp->logical_blk_num, STps->drv_file, STps->drv_block );
+#endif
+				if (i < 0) {
+					retval = i;
+					goto out;
+				}
+			}
+			STps->rw = ST_IDLE;
+		}
 
 		if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
 			do_door_lock(STp, 0);  /* Ignore result! */
@@ -4873,11 +4927,15 @@
 			retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
 			goto out;
 		}
-			
+
+		if (auto_weof)
+			cross_eof(STp, &SRpnt, FALSE);
+
 		if (mtc.mt_op == MTCOMPRESSION)
-			retval = -EINVAL /*osst_compression(STp, (mtc.mt_count & 1))*/;
+			retval = -EINVAL;       /* OnStream drives don't have compression hardware */
 		else
-
+			/* MTBSF MTBSFM MTBSR MTBSS MTEOM MTERASE MTFSF MTFSFB MTFSR MTFSS
+			 * MTLOAD MTOFFL MTRESET MTRETEN MTREW MTUNLOAD MTWEOF MTWSM */
 			retval = osst_int_ioctl(STp, &SRpnt, mtc.mt_op, mtc.mt_count);
 		goto out;
 	}
@@ -5527,37 +5585,37 @@
 
 static int osst_remove(struct device *dev)
 {
-  Scsi_Device * SDp = to_scsi_device(dev);
-  OS_Scsi_Tape * tpnt;
-  int i, mode;
-
-  if ((SDp->type != TYPE_TAPE) || (osst_nr_dev <= 0))
-	  return 0;
-
-  write_lock(&os_scsi_tapes_lock);
-  for(i=0; i < osst_max_dev; i++) {
-	if((tpnt = os_scsi_tapes[i]) && (tpnt->device == SDp)) {
-		tpnt->device = NULL;
-		for (mode = 0; mode < ST_NBR_MODES; ++mode) {
-			devfs_remove("%s/ot%s", SDp->devfs_name, osst_formats[mode]);
-			devfs_remove("%s/ot%sn", SDp->devfs_name, osst_formats[mode]);
-		}
-		devfs_unregister_tape(tpnt->drive->number);
-		put_disk(tpnt->drive);
-		os_scsi_tapes[i] = NULL;
-		osst_nr_dev--;
-		write_unlock(&os_scsi_tapes_lock);
-		if (tpnt->header_cache != NULL) vfree(tpnt->header_cache);
-		if (tpnt->buffer) {
-			normalize_buffer(tpnt->buffer);
-			kfree(tpnt->buffer);
-		}
-		kfree(tpnt);
+	Scsi_Device  * SDp = to_scsi_device(dev);
+	OS_Scsi_Tape * tpnt;
+	int i, mode;
+
+	if ((SDp->type != TYPE_TAPE) || (osst_nr_dev <= 0))
 		return 0;
+
+	write_lock(&os_scsi_tapes_lock);
+	for(i=0; i < osst_max_dev; i++) {
+		if((tpnt = os_scsi_tapes[i]) && (tpnt->device == SDp)) {
+			tpnt->device = NULL;
+			for (mode = 0; mode < ST_NBR_MODES; ++mode) {
+				devfs_remove("%s/ot%s", SDp->devfs_name, osst_formats[mode]);
+				devfs_remove("%s/ot%sn", SDp->devfs_name, osst_formats[mode]);
+			}
+			devfs_unregister_tape(tpnt->drive->number);
+			put_disk(tpnt->drive);
+			os_scsi_tapes[i] = NULL;
+			osst_nr_dev--;
+			write_unlock(&os_scsi_tapes_lock);
+			if (tpnt->header_cache != NULL) vfree(tpnt->header_cache);
+			if (tpnt->buffer) {
+				normalize_buffer(tpnt->buffer);
+				kfree(tpnt->buffer);
+			}
+			kfree(tpnt);
+			return 0;
+		}
 	}
-  }
-  write_unlock(&os_scsi_tapes_lock);
-  return 0;
+	write_unlock(&os_scsi_tapes_lock);
+	return 0;
 }
 
 static int __init init_osst(void) 
diff -Nru a/drivers/scsi/osst.h b/drivers/scsi/osst.h
--- a/drivers/scsi/osst.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/osst.h	Thu Jan  8 23:00:24 2004
@@ -1,11 +1,10 @@
 /*
- *	$Header: /home/cvsroot/Driver/osst.h,v 1.12 2001/10/11 00:30:15 riede Exp $
+ *	$Header: /cvsroot/osst/Driver/osst.h,v 1.14 2003/12/14 14:34:38 wriede Exp $
  */
 
 #include <asm/byteorder.h>
 #include <linux/config.h>
 #include <linux/completion.h>
-
 
 /*	FIXME - rename and use the following two types or delete them!
  *              and the types really should go to st.h anyway...
diff -Nru a/drivers/scsi/osst_options.h b/drivers/scsi/osst_options.h
--- a/drivers/scsi/osst_options.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/osst_options.h	Thu Jan  8 23:00:24 2004
@@ -8,7 +8,7 @@
    Changed (and renamed) for OnStream SCSI drives garloff@suse.de
    2000-06-21
 
-   $Header: /home/cvsroot/Driver/osst_options.h,v 1.5 2001/01/07 22:19:15 riede Exp $
+   $Header: /cvsroot/osst/Driver/osst_options.h,v 1.6 2003/12/23 14:22:12 wriede Exp $
 */
 
 #ifndef _OSST_OPTIONS_H
diff -Nru a/drivers/scsi/pcmcia/Kconfig b/drivers/scsi/pcmcia/Kconfig
--- a/drivers/scsi/pcmcia/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/pcmcia/Kconfig	Thu Jan  8 23:00:24 2004
@@ -7,7 +7,7 @@
 
 config PCMCIA_AHA152X
 	tristate "Adaptec AHA152X PCMCIA support"
-	depends on m
+	depends on m && !64BIT
 	help
 	  Say Y here if you intend to attach this type of PCMCIA SCSI host
 	  adapter to your computer.
@@ -27,7 +27,7 @@
 
 config PCMCIA_NINJA_SCSI
 	tristate "NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support"
-	depends on m
+	depends on m && !64BIT
 	help
 	  If you intend to attach this type of PCMCIA SCSI host adapter to
 	  your computer, say Y here and read
diff -Nru a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c
--- a/drivers/scsi/pluto.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/pluto.c	Thu Jan  8 23:00:23 2004
@@ -360,3 +360,5 @@
 
 #include "scsi_module.c"
 
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c
--- a/drivers/scsi/qlogicpti.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/qlogicpti.c	Thu Jan  8 23:00:24 2004
@@ -1554,3 +1554,6 @@
 
 
 #include "scsi_module.c"
+
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sata_promise.c	Thu Jan  8 23:00:24 2004
@@ -34,10 +34,8 @@
 #include <linux/libata.h>
 #include <asm/io.h>
 
-#undef DIRECT_HDMA
-
 #define DRV_NAME	"sata_promise"
-#define DRV_VERSION	"0.86"
+#define DRV_VERSION	"0.89"
 
 
 enum {
@@ -82,6 +80,42 @@
 
 	PDC_FLAG_20621		= (1 << 30), /* we have a 20621 */
 	PDC_HDMA_RESET		= (1 << 11), /* HDMA reset */
+
+	PDC_MAX_HDMA		= 32,
+	PDC_HDMA_Q_MASK		= (PDC_MAX_HDMA - 1),
+
+	PDC_DIMM0_SPD_DEV_ADDRESS     = 0x50,
+	PDC_DIMM1_SPD_DEV_ADDRESS     = 0x51,
+	PDC_MAX_DIMM_MODULE           = 0x02,
+	PDC_I2C_CONTROL_OFFSET        = 0x48,
+	PDC_I2C_ADDR_DATA_OFFSET      = 0x4C,
+	PDC_DIMM0_CONTROL_OFFSET      = 0x80,
+	PDC_DIMM1_CONTROL_OFFSET      = 0x84,
+	PDC_SDRAM_CONTROL_OFFSET      = 0x88,
+	PDC_I2C_WRITE                 = 0x00000000,
+	PDC_I2C_READ                  = 0x00000040,	
+	PDC_I2C_START                 = 0x00000080,
+	PDC_I2C_MASK_INT              = 0x00000020,
+	PDC_I2C_COMPLETE              = 0x00010000,
+	PDC_I2C_NO_ACK                = 0x00100000,
+	PDC_DIMM_SPD_SUBADDRESS_START = 0x00,
+	PDC_DIMM_SPD_SUBADDRESS_END   = 0x7F,
+	PDC_DIMM_SPD_ROW_NUM          = 3,
+	PDC_DIMM_SPD_COLUMN_NUM       = 4,
+	PDC_DIMM_SPD_MODULE_ROW       = 5,
+	PDC_DIMM_SPD_TYPE             = 11,
+	PDC_DIMM_SPD_FRESH_RATE       = 12,         
+	PDC_DIMM_SPD_BANK_NUM         = 17,	
+	PDC_DIMM_SPD_CAS_LATENCY      = 18,
+	PDC_DIMM_SPD_ATTRIBUTE        = 21,    
+	PDC_DIMM_SPD_ROW_PRE_CHARGE   = 27,
+	PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28,      
+	PDC_DIMM_SPD_RAS_CAS_DELAY    = 29,
+	PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30,
+	PDC_DIMM_SPD_SYSTEM_FREQ      = 126,
+	PDC_CTL_STATUS		      = 0x08,	
+	PDC_DIMM_WINDOW_CTLR	      = 0x0C,
+	PDC_GENERAL_CTLR	      = 0x484,
 };
 
 
@@ -91,6 +125,19 @@
 	dma_addr_t		pkt_dma;
 };
 
+struct pdc_host_priv {
+	void			*dimm_mmio;
+
+	unsigned int		doing_hdma;
+	unsigned int		hdma_prod;
+	unsigned int		hdma_cons;
+	struct {
+		struct ata_queued_cmd *qc;
+		unsigned int	seq;
+		unsigned long	pkt_ofs;
+	} hdma[32];
+};
+
 
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
@@ -114,6 +161,18 @@
 static void pdc20621_host_stop(struct ata_host_set *host_set);
 static inline void pdc_dma_complete (struct ata_port *ap,
                                      struct ata_queued_cmd *qc);
+static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
+static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
+static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, 
+				      u32 device, u32 subaddr, u32 *pdata);
+static int pdc20621_prog_dimm0(struct ata_probe_ent *pe);
+static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe);
+#ifdef ATA_VERBOSE_DEBUG
+static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, 
+				   void *psource, u32 offset, u32 size);
+#endif
+static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, 
+				 void *psource, u32 offset, u32 size);
 
 
 static Scsi_Host_Template pdc_sata_sht = {
@@ -131,6 +190,7 @@
 	.proc_name		= DRV_NAME,
 	.dma_boundary		= ATA_DMA_BOUNDARY,
 	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
 };
 
 static struct ata_port_operations pdc_sata_ops = {
@@ -235,10 +295,11 @@
 
 static void pdc20621_host_stop(struct ata_host_set *host_set)
 {
-	void *mmio = host_set->private_data;
+	struct pdc_host_priv *hpriv = host_set->private_data;
+	void *dimm_mmio = hpriv->dimm_mmio;
 
-	assert(mmio != NULL);
-	iounmap(mmio);
+	iounmap(dimm_mmio);
+	kfree(hpriv);
 }
 
 static int pdc_port_start(struct ata_port *ap)
@@ -256,6 +317,7 @@
 		rc = -ENOMEM;
 		goto err_out;
 	}
+	memset(pp, 0, sizeof(*pp));
 
 	pp->pkt = pci_alloc_consistent(pdev, 128, &pp->pkt_dma);
 	if (!pp->pkt) {
@@ -589,7 +651,8 @@
 	struct ata_port *ap = qc->ap;
 	struct pdc_port_priv *pp = ap->private_data;
 	void *mmio = ap->host_set->mmio_base;
-	void *dimm_mmio = ap->host_set->private_data;
+	struct pdc_host_priv *hpriv = ap->host_set->private_data;
+	void *dimm_mmio = hpriv->dimm_mmio;
 	unsigned int portno = ap->port_no;
 	unsigned int i, last, idx, total_len = 0, sgt_len;
 	u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ];
@@ -605,8 +668,8 @@
 	last = qc->n_elem;
 	idx = 0;
 	for (i = 0; i < last; i++) {
-		buf[idx++] = cpu_to_le32(sg[i].dma_address);
-		buf[idx++] = cpu_to_le32(sg[i].length);
+		buf[idx++] = cpu_to_le32(sg_dma_address(&sg[i]));
+		buf[idx++] = cpu_to_le32(sg_dma_len(&sg[i]));
 		total_len += sg[i].length;
 	}
 	buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT);
@@ -643,49 +706,68 @@
 	VPRINTK("ata pkt buf ofs %u, prd size %u, mmio copied\n", i, sgt_len);
 }
 
-#ifdef DIRECT_HDMA
-static void pdc20621_push_hdma(struct ata_queued_cmd *qc)
+static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
+				 unsigned int seq,
+				 u32 pkt_ofs)
 {
 	struct ata_port *ap = qc->ap;
 	struct ata_host_set *host_set = ap->host_set;
-	unsigned int port_no = ap->port_no;
 	void *mmio = host_set->mmio_base;
-	unsigned int rw = (qc->flags & ATA_QCFLAG_WRITE);
-	u32 tmp;
-
-	unsigned int host_sg = PDC_20621_DIMM_BASE +
-			       (PDC_DIMM_WINDOW_STEP * port_no) +
-			       PDC_DIMM_HOST_PRD;
-	unsigned int dimm_sg = PDC_20621_DIMM_BASE +
-			       (PDC_DIMM_WINDOW_STEP * port_no) +
-			       PDC_DIMM_HPKT_PRD;
 
 	/* hard-code chip #0 */
 	mmio += PDC_CHIP0_OFS;
 
-	tmp = readl(mmio + PDC_HDMA_CTLSTAT) & 0xffffff00;
-	tmp |= port_no + 1 + 4;		/* seq. ID */
-	if (!rw)
-		tmp |= (1 << 6);	/* hdma data direction */
-	writel(tmp, mmio + PDC_HDMA_CTLSTAT); /* note: stops DMA, if active */
-	readl(mmio + PDC_HDMA_CTLSTAT);	/* flush */
-
-	writel(host_sg, mmio + 0x108);
-	writel(dimm_sg, mmio + 0x10C);
-	writel(0, mmio + 0x128);
+	writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
+	readl(mmio + PDC_20621_SEQCTL + (seq * 4));	/* flush */
 
-	tmp |= (1 << 7);
-	writel(tmp, mmio + PDC_HDMA_CTLSTAT);
-	readl(mmio + PDC_HDMA_CTLSTAT);	/* flush */
+	writel(pkt_ofs, mmio + PDC_HDMA_PKT_SUBMIT);
+	readl(mmio + PDC_HDMA_PKT_SUBMIT);	/* flush */
+}
+
+static void pdc20621_push_hdma(struct ata_queued_cmd *qc,
+				unsigned int seq,
+				u32 pkt_ofs)
+{
+	struct ata_port *ap = qc->ap;
+	struct pdc_host_priv *pp = ap->host_set->private_data;
+	unsigned int idx = pp->hdma_prod & PDC_HDMA_Q_MASK;
+
+	if (!pp->doing_hdma) {
+		__pdc20621_push_hdma(qc, seq, pkt_ofs);
+		pp->doing_hdma = 1;
+		return;
+	}
+
+	pp->hdma[idx].qc = qc;
+	pp->hdma[idx].seq = seq;
+	pp->hdma[idx].pkt_ofs = pkt_ofs;
+	pp->hdma_prod++;
+}
+
+static void pdc20621_pop_hdma(struct ata_queued_cmd *qc)
+{
+	struct ata_port *ap = qc->ap;
+	struct pdc_host_priv *pp = ap->host_set->private_data;
+	unsigned int idx = pp->hdma_cons & PDC_HDMA_Q_MASK;
+
+	/* if nothing on queue, we're done */
+	if (pp->hdma_prod == pp->hdma_cons) {
+		pp->doing_hdma = 0;
+		return;
+	}
+
+	__pdc20621_push_hdma(pp->hdma[idx].qc, pp->hdma[idx].seq,
+			     pp->hdma[idx].pkt_ofs);
+	pp->hdma_cons++;
 }
-#endif
 
 #ifdef ATA_VERBOSE_DEBUG
 static void pdc20621_dump_hdma(struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
 	unsigned int port_no = ap->port_no;
-	void *dimm_mmio = ap->host_set->private_data;
+	struct pdc_host_priv *hpriv = ap->host_set->private_data;
+	void *dimm_mmio = hpriv->dimm_mmio;
 
 	dimm_mmio += (port_no * PDC_DIMM_WINDOW_STEP);
 	dimm_mmio += PDC_DIMM_HOST_PKT;
@@ -724,23 +806,17 @@
 
 	wmb();			/* flush PRD, pkt writes */
 
-	writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
-	readl(mmio + PDC_20621_SEQCTL + (seq * 4));	/* flush */
-
 	if (doing_hdma) {
 		pdc20621_dump_hdma(qc);
-#ifdef DIRECT_HDMA
-		pdc20621_push_hdma(qc);
-#else
-		writel(port_ofs + PDC_DIMM_HOST_PKT,
-		       mmio + PDC_HDMA_PKT_SUBMIT);
-		readl(mmio + PDC_HDMA_PKT_SUBMIT);	/* flush */
-#endif
-		VPRINTK("submitted ofs 0x%x (%u), seq %u\n",
-		port_ofs + PDC_DIMM_HOST_PKT,
-		port_ofs + PDC_DIMM_HOST_PKT,
-		seq);
+		pdc20621_push_hdma(qc, seq, port_ofs + PDC_DIMM_HOST_PKT);
+		VPRINTK("queued ofs 0x%x (%u), seq %u\n",
+			port_ofs + PDC_DIMM_HOST_PKT,
+			port_ofs + PDC_DIMM_HOST_PKT,
+			seq);
 	} else {
+		writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
+		readl(mmio + PDC_20621_SEQCTL + (seq * 4));	/* flush */
+
 		writel(port_ofs + PDC_DIMM_ATA_PKT,
 		       (void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
 		readl((void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
@@ -771,6 +847,7 @@
 			VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->id,
 				readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
 			pdc_dma_complete(ap, qc);
+			pdc20621_pop_hdma(qc);
 		}
 
 		/* step one - exec ATA command */
@@ -781,15 +858,8 @@
 
 			/* submit hdma pkt */
 			pdc20621_dump_hdma(qc);
-			writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
-			readl(mmio + PDC_20621_SEQCTL + (seq * 4));
-#ifdef DIRECT_HDMA
-			pdc20621_push_hdma(qc);
-#else
-			writel(port_ofs + PDC_DIMM_HOST_PKT,
-			       mmio + PDC_HDMA_PKT_SUBMIT);
-			readl(mmio + PDC_HDMA_PKT_SUBMIT);
-#endif
+			pdc20621_push_hdma(qc, seq,
+					   port_ofs + PDC_DIMM_HOST_PKT);
 		}
 		handled = 1;
 		break;
@@ -814,6 +884,7 @@
 			VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->id,
 				readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
 			pdc_dma_complete(ap, qc);
+			pdc20621_pop_hdma(qc);
 		}
 		handled = 1;
 		break;
@@ -1098,11 +1169,373 @@
 	port->ctl_addr		= base + 0x38;
 }
 
+
+#ifdef ATA_VERBOSE_DEBUG
+static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, 
+				   u32 offset, u32 size)
+{
+	u32 window_size;
+	u16 idx;
+	u8 page_mask;
+	long dist;
+	void *mmio = pe->mmio_base;
+	struct pdc_host_priv *hpriv = pe->private_data;
+	void *dimm_mmio = hpriv->dimm_mmio;
+
+	/* hard-code chip #0 */
+	mmio += PDC_CHIP0_OFS;
+
+	page_mask = 0x00;	
+   	window_size = 0x2000 * 4; /* 32K byte uchar size */  
+	idx = (u16) (offset / window_size); 
+
+	writel(0x01, mmio + PDC_GENERAL_CTLR);
+	readl(mmio + PDC_GENERAL_CTLR);
+	writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+	readl(mmio + PDC_DIMM_WINDOW_CTLR);
+
+	offset -= (idx * window_size);
+	idx++;
+	dist = ((long) (window_size - (offset + size))) >= 0 ? size : 
+		(long) (window_size - offset);
+	memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4), 
+		      dist);
+
+	psource += dist;    
+	size -= dist;
+	for (; (long) size >= (long) window_size ;) {
+		writel(0x01, mmio + PDC_GENERAL_CTLR);
+		readl(mmio + PDC_GENERAL_CTLR);
+		writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+		readl(mmio + PDC_DIMM_WINDOW_CTLR);
+		memcpy_fromio((char *) psource, (char *) (dimm_mmio), 
+			      window_size / 4);
+		psource += window_size;
+		size -= window_size;
+		idx ++;
+	}
+
+	if (size) {
+		writel(0x01, mmio + PDC_GENERAL_CTLR);
+		readl(mmio + PDC_GENERAL_CTLR);
+		writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+		readl(mmio + PDC_DIMM_WINDOW_CTLR);
+		memcpy_fromio((char *) psource, (char *) (dimm_mmio), 
+			      size / 4);
+	}
+}
+#endif
+
+
+static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, 
+				 u32 offset, u32 size)
+{
+	u32 window_size;
+	u16 idx;
+	u8 page_mask;
+	long dist;
+	void *mmio = pe->mmio_base;
+	struct pdc_host_priv *hpriv = pe->private_data;
+	void *dimm_mmio = hpriv->dimm_mmio;
+
+	/* hard-code chip #0 */   
+	mmio += PDC_CHIP0_OFS;
+
+	page_mask = 0x00;	
+   	window_size = 0x2000 * 4;       /* 32K byte uchar size */  
+	idx = (u16) (offset / window_size);
+
+	writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+	readl(mmio + PDC_DIMM_WINDOW_CTLR);
+	offset -= (idx * window_size); 
+	idx++;
+	dist = ((long) (window_size - (offset + size))) >= 0 ? size : 
+		(long) (window_size - offset);
+	memcpy_toio((char *) (dimm_mmio + offset / 4), (char *) psource, dist);
+	writel(0x01, mmio + PDC_GENERAL_CTLR);
+	readl(mmio + PDC_GENERAL_CTLR);
+
+	psource += dist;    
+	size -= dist;
+	for (; (long) size >= (long) window_size ;) {
+		writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+		readl(mmio + PDC_DIMM_WINDOW_CTLR);
+		memcpy_toio((char *) (dimm_mmio), (char *) psource, 
+			    window_size / 4);
+		writel(0x01, mmio + PDC_GENERAL_CTLR);
+		readl(mmio + PDC_GENERAL_CTLR);
+		psource += window_size;
+		size -= window_size;
+		idx ++;
+	}
+    
+	if (size) {
+		writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR);
+		readl(mmio + PDC_DIMM_WINDOW_CTLR);
+		memcpy_toio((char *) (dimm_mmio), (char *) psource, size / 4);
+		writel(0x01, mmio + PDC_GENERAL_CTLR);
+		readl(mmio + PDC_GENERAL_CTLR);
+	}
+}
+
+
+static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, 
+				      u32 subaddr, u32 *pdata)
+{
+	void *mmio = pe->mmio_base;
+	u32 i2creg  = 0;
+	u32 status;     
+	u32 count =0;
+
+	/* hard-code chip #0 */
+	mmio += PDC_CHIP0_OFS;
+
+	i2creg |= device << 24;
+	i2creg |= subaddr << 16;
+
+	/* Set the device and subaddress */
+	writel(i2creg, mmio + PDC_I2C_ADDR_DATA_OFFSET);
+	readl(mmio + PDC_I2C_ADDR_DATA_OFFSET);
+
+	/* Write Control to perform read operation, mask int */
+	writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, 
+	       mmio + PDC_I2C_CONTROL_OFFSET);
+
+	for (count = 0; count <= 1000; count ++) {
+		status = readl(mmio + PDC_I2C_CONTROL_OFFSET);
+		if (status & PDC_I2C_COMPLETE) {
+			status = readl(mmio + PDC_I2C_ADDR_DATA_OFFSET);
+			break;
+		} else if (count == 1000)
+			return 0;
+	}
+
+	*pdata = (status >> 8) & 0x000000ff;
+	return 1;           
+}
+
+
+static int pdc20621_detect_dimm(struct ata_probe_ent *pe)
+{
+	u32 data=0 ;
+  	if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 
+			     PDC_DIMM_SPD_SYSTEM_FREQ, &data)) {
+   		if (data == 100)
+			return 100;
+  	} else
+		return 0;
+ 	
+   	if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 9, &data)) {
+		if(data <= 0x75) 
+			return 133;
+   	} else
+		return 0;
+   	
+   	return 0;
+}
+
+
+static int pdc20621_prog_dimm0(struct ata_probe_ent *pe)
+{
+	u32 spd0[50];
+	u32 data = 0;
+   	int size, i;
+   	u8 bdimmsize; 
+   	void *mmio = pe->mmio_base;
+	static const struct {
+		unsigned int reg;
+		unsigned int ofs;
+	} pdc_i2c_read_data [] = {
+		{ PDC_DIMM_SPD_TYPE, 11 },		
+		{ PDC_DIMM_SPD_FRESH_RATE, 12 },
+		{ PDC_DIMM_SPD_COLUMN_NUM, 4 }, 
+		{ PDC_DIMM_SPD_ATTRIBUTE, 21 },
+		{ PDC_DIMM_SPD_ROW_NUM, 3 },
+		{ PDC_DIMM_SPD_BANK_NUM, 17 },
+		{ PDC_DIMM_SPD_MODULE_ROW, 5 },
+		{ PDC_DIMM_SPD_ROW_PRE_CHARGE, 27 },
+		{ PDC_DIMM_SPD_ROW_ACTIVE_DELAY, 28 },
+		{ PDC_DIMM_SPD_RAS_CAS_DELAY, 29 },
+		{ PDC_DIMM_SPD_ACTIVE_PRECHARGE, 30 },
+		{ PDC_DIMM_SPD_CAS_LATENCY, 18 },       
+	};
+
+	/* hard-code chip #0 */
+	mmio += PDC_CHIP0_OFS;
+
+	for(i=0; i<ARRAY_SIZE(pdc_i2c_read_data); i++)
+		pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS,
+				  pdc_i2c_read_data[i].reg, 
+				  &spd0[pdc_i2c_read_data[i].ofs]);
+  
+   	data |= (spd0[4] - 8) | ((spd0[21] != 0) << 3) | ((spd0[3]-11) << 4);
+   	data |= ((spd0[17] / 4) << 6) | ((spd0[5] / 2) << 7) | 
+		((((spd0[27] + 9) / 10) - 1) << 8) ;
+   	data |= (((((spd0[29] > spd0[28]) 
+		    ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10; 
+   	data |= ((spd0[30] - spd0[29] + 9) / 10 - 2) << 12;
+   
+   	if (spd0[18] & 0x08) 
+		data |= ((0x03) << 14);
+   	else if (spd0[18] & 0x04)
+		data |= ((0x02) << 14);
+   	else if (spd0[18] & 0x01)
+		data |= ((0x01) << 14);
+   	else
+		data |= (0 << 14);
+
+  	/* 
+	   Calculate the size of bDIMMSize (power of 2) and
+	   merge the DIMM size by program start/end address.
+	*/
+
+   	bdimmsize = spd0[4] + (spd0[5] / 2) + spd0[3] + (spd0[17] / 2) + 3;
+   	size = (1 << bdimmsize) >> 20;	/* size = xxx(MB) */
+   	data |= (((size / 16) - 1) << 16);
+   	data |= (0 << 23);
+	data |= 8;
+   	writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); 
+	readl(mmio + PDC_DIMM0_CONTROL_OFFSET);
+   	return size;                          
+}
+
+
+static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe)
+{
+	u32 data, spd0;
+   	int error, i;
+   	void *mmio = pe->mmio_base;
+
+	/* hard-code chip #0 */
+   	mmio += PDC_CHIP0_OFS;
+
+   	/*
+	  Set To Default : DIMM Module Global Control Register (0x022259F1)
+	  DIMM Arbitration Disable (bit 20)
+	  DIMM Data/Control Output Driving Selection (bit12 - bit15)
+	  Refresh Enable (bit 17)
+	*/
+
+	data = 0x022259F1;   
+	writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET);
+	readl(mmio + PDC_SDRAM_CONTROL_OFFSET);
+
+	/* Turn on for ECC */
+	pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 
+			  PDC_DIMM_SPD_TYPE, &spd0);
+	if (spd0 == 0x02) {
+		data |= (0x01 << 16);
+		writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET);
+		readl(mmio + PDC_SDRAM_CONTROL_OFFSET);
+		printk(KERN_ERR "Local DIMM ECC Enabled\n");
+   	}
+
+   	/* DIMM Initialization Select/Enable (bit 18/19) */
+   	data &= (~(1<<18));
+   	data |= (1<<19);
+   	writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET);
+
+   	error = 1;                     
+   	for (i = 1; i <= 10; i++) {   /* polling ~5 secs */
+		data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET);
+		if (!(data & (1<<19))) {
+	   		error = 0;
+	   		break;     
+		}
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout((i * 100) * HZ / 1000);
+   	}
+   	return error;
+}
+	
+
+static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe)
+{
+	int speed, size, length; 
+	u32 addr,spd0,pci_status;
+	u32 tmp=0;
+   	void *mmio = pe->mmio_base;
+
+	/* hard-code chip #0 */
+   	mmio += PDC_CHIP0_OFS;
+
+	/* Initialize PLL. */
+	pci_status = 0x8a531824;
+	writel(pci_status, mmio + PDC_CTL_STATUS);
+	readl(mmio + PDC_CTL_STATUS);
+
+	/* 
+	   Read SPD of DIMM by I2C interface,
+	   and program the DIMM Module Controller.
+	*/
+ 	if (!(speed = pdc20621_detect_dimm(pe))) {
+		printk(KERN_ERR "Detect Local DIMM Fail\n");  
+		return 1;	/* DIMM error */
+   	}
+   	VPRINTK("Local DIMM Speed = %d\n", speed);
+
+   	/* Programming DIMM0 Module Control Register (index_CID0:80h) */ 
+   	size = pdc20621_prog_dimm0(pe);
+   	VPRINTK("Local DIMM Size = %dMB\n",size);
+
+   	/* Programming DIMM Module Global Control Register (index_CID0:88h) */ 
+   	if (pdc20621_prog_dimm_global(pe)) {
+		printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n");
+		return 1;
+   	}
+
+#ifdef ATA_VERBOSE_DEBUG
+	{
+		u8 test_parttern1[40] = {0x55,0xAA,'P','r','o','m','i','s','e',' ',
+  				'N','o','t',' ','Y','e','t',' ','D','e','f','i','n','e','d',' ',
+ 				 '1','.','1','0',
+  				'9','8','0','3','1','6','1','2',0,0};
+		u8 test_parttern2[40] = {0};
+
+		pdc20621_put_to_dimm(pe, (void *) test_parttern2, 0x10040, 40);
+		pdc20621_put_to_dimm(pe, (void *) test_parttern2, 0x40, 40);
+
+		pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x10040, 40);
+		pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40);
+		printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], 
+		       test_parttern2[1], &(test_parttern2[2]));
+		pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x10040, 
+				       40);
+		printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], 
+		       test_parttern2[1], &(test_parttern2[2]));
+
+		pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x40, 40);
+		pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40);
+		printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], 
+		       test_parttern2[1], &(test_parttern2[2]));
+	}
+#endif
+
+	/* ECC initiliazation. */
+
+	pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 
+			  PDC_DIMM_SPD_TYPE, &spd0);
+	if (spd0 == 0x02) {
+		VPRINTK("Start ECC initialization\n");
+		addr = 0;
+		length = size * 1024 * 1024;
+		while (addr < length) {
+			pdc20621_put_to_dimm(pe, (void *) &tmp, addr, 
+					     sizeof(u32));
+			addr += sizeof(u32);
+		}
+		VPRINTK("Finish ECC initialization\n");
+	}
+	return 0;
+}
+
+
 static void pdc_20621_init(struct ata_probe_ent *pe)
 {
 	u32 tmp;
 	void *mmio = pe->mmio_base;
 
+	/* hard-code chip #0 */
 	mmio += PDC_CHIP0_OFS;
 
 	/*
@@ -1170,6 +1603,7 @@
 	struct ata_probe_ent *probe_ent = NULL;
 	unsigned long base;
 	void *mmio_base, *dimm_mmio = NULL;
+	struct pdc_host_priv *hpriv = NULL;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
 	unsigned int have_20621 = (board_idx == board_20621);
 	int rc;
@@ -1212,12 +1646,22 @@
 	base = (unsigned long) mmio_base;
 
 	if (have_20621) {
+		hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
+		if (!hpriv) {
+			rc = -ENOMEM;
+			goto err_out_iounmap;
+		}
+		memset(hpriv, 0, sizeof(*hpriv));
+
 		dimm_mmio = ioremap(pci_resource_start(pdev, 4),
 				    pci_resource_len(pdev, 4));
 		if (!dimm_mmio) {
+			kfree(hpriv);
 			rc = -ENOMEM;
 			goto err_out_iounmap;
 		}
+
+		hpriv->dimm_mmio = dimm_mmio;
 	}
 
 	probe_ent->sht		= pdc_port_info[board_idx].sht;
@@ -1231,7 +1675,7 @@
 	probe_ent->mmio_base = mmio_base;
 
 	if (have_20621) {
-		probe_ent->private_data = dimm_mmio;
+		probe_ent->private_data = hpriv;
 		base += PDC_CHIP0_OFS;
 	}
 
@@ -1268,9 +1712,14 @@
 	pci_set_master(pdev);
 
 	/* initialize adapter */
-	if (have_20621)
+	if (have_20621) {
+		/* initialize local dimm */
+		if (pdc20621_dimm_init(probe_ent)) {
+			rc = -ENOMEM;
+			goto err_out_iounmap_dimm;
+		}
 		pdc_20621_init(probe_ent);
-	else
+	} else
 		pdc_host_init(board_idx, probe_ent);
 
 	/* FIXME: check ata_device_add return value */
@@ -1279,6 +1728,9 @@
 
 	return 0;
 
+err_out_iounmap_dimm:		/* only get to this label if 20621 */
+	kfree(hpriv);
+	iounmap(dimm_mmio);
 err_out_iounmap:
 	iounmap(mmio_base);
 err_out_free_ent:
diff -Nru a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
--- a/drivers/scsi/sata_sil.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/sata_sil.c	Thu Jan  8 23:00:23 2004
@@ -87,6 +87,7 @@
 	.proc_name		= DRV_NAME,
 	.dma_boundary		= ATA_DMA_BOUNDARY,
 	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
 };
 
 static struct ata_port_operations sil_ops = {
diff -Nru a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c
--- a/drivers/scsi/sata_svw.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sata_svw.c	Thu Jan  8 23:00:24 2004
@@ -219,6 +219,7 @@
 #ifdef CONFIG_ALL_PPC
 	.proc_info		= k2_sata_proc_info
 #endif
+	.bios_param		= ata_std_bios_param,
 };
 
 
diff -Nru a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c
--- a/drivers/scsi/sata_via.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/sata_via.c	Thu Jan  8 23:00:23 2004
@@ -78,6 +78,7 @@
 	.proc_name		= DRV_NAME,
 	.dma_boundary		= ATA_DMA_BOUNDARY,
 	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
 };
 
 static struct ata_port_operations svia_sata_ops = {
diff -Nru a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
--- a/drivers/scsi/scsi.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/scsi.c	Thu Jan  8 23:00:24 2004
@@ -351,6 +351,124 @@
 	up(&host_cmd_pool_mutex);
 }
 
+#ifdef CONFIG_SCSI_LOGGING
+void scsi_log_send(struct scsi_cmnd *cmd)
+{
+	unsigned int level;
+	struct scsi_device *sdev;
+
+	/*
+	 * If ML QUEUE log level is greater than or equal to:
+	 *
+	 * 1: nothing (match completion)
+	 *
+	 * 2: log opcode + command of all commands
+	 *
+	 * 3: same as 2 plus dump cmd address
+	 *
+	 * 4: same as 3 plus dump extra junk
+	 */
+	if (unlikely(scsi_logging_level)) {
+		level = SCSI_LOG_LEVEL(SCSI_LOG_MLQUEUE_SHIFT,
+				       SCSI_LOG_MLQUEUE_BITS);
+		if (level > 1) {
+			sdev = cmd->device;
+			printk(KERN_INFO "scsi <%d:%d:%d:%d> send ",
+			       sdev->host->host_no, sdev->channel, sdev->id,
+			       sdev->lun);
+			if (level > 2)
+				printk("0x%p ", cmd);
+			/*
+			 * spaces to match disposition and cmd->result
+			 * output in scsi_log_completion.
+			 */
+			printk("                 ");
+			print_command(cmd->cmnd);
+			if (level > 3) {
+				printk(KERN_INFO "buffer = 0x%p, bufflen = %d,"
+				       " done = 0x%p, queuecommand 0x%p\n",
+					cmd->buffer, cmd->bufflen,
+					cmd->done,
+					sdev->host->hostt->queuecommand);
+
+			}
+		}
+	}
+}
+
+void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
+{
+	unsigned int level;
+	struct scsi_device *sdev;
+
+	/*
+	 * If ML COMPLETE log level is greater than or equal to:
+	 *
+	 * 1: log disposition, result, opcode + command, and conditionally
+	 * sense data for failures or non SUCCESS dispositions.
+	 *
+	 * 2: same as 1 but for all command completions.
+	 *
+	 * 3: same as 2 plus dump cmd address
+	 *
+	 * 4: same as 3 plus dump extra junk
+	 */
+	if (unlikely(scsi_logging_level)) {
+		level = SCSI_LOG_LEVEL(SCSI_LOG_MLCOMPLETE_SHIFT,
+				       SCSI_LOG_MLCOMPLETE_BITS);
+		if (((level > 0) && (cmd->result || disposition != SUCCESS)) ||
+		    (level > 1)) {
+			sdev = cmd->device;
+			printk(KERN_INFO "scsi <%d:%d:%d:%d> done ",
+			       sdev->host->host_no, sdev->channel, sdev->id,
+			       sdev->lun);
+			if (level > 2)
+				printk("0x%p ", cmd);
+			/*
+			 * Dump truncated values, so we usually fit within
+			 * 80 chars.
+			 */
+			switch (disposition) {
+			case SUCCESS:
+				printk("SUCCESS");
+				break;
+			case NEEDS_RETRY:
+				printk("RETRY  ");
+				break;
+			case ADD_TO_MLQUEUE:
+				printk("MLQUEUE");
+				break;
+			case FAILED:
+				printk("FAILED ");
+				break;
+			case TIMEOUT:
+				/* 
+				 * If called via scsi_times_out.
+				 */
+				printk("TIMEOUT");
+				break;
+			default:
+				printk("UNKNOWN");
+			}
+			printk(" %8x ", cmd->result);
+			print_command(cmd->cmnd);
+			if (status_byte(cmd->result) & CHECK_CONDITION) {
+				/*
+				 * XXX The print_sense formatting/prefix
+				 * doesn't match this function.
+				 */
+				print_sense("", cmd);
+			}
+			if (level > 3) {
+				printk(KERN_INFO "scsi host busy %d failed %d\n",
+				       sdev->host->host_busy,
+				       sdev->host->host_failed);
+			}
+		}
+	}
+}
+#endif
+
 /*
  * Function:    scsi_dispatch_command
  *
@@ -416,16 +534,12 @@
 
 	scsi_add_timer(cmd, cmd->timeout_per_command, scsi_times_out);
 
+	scsi_log_send(cmd);
+
 	/*
 	 * We will use a queued command if possible, otherwise we will
 	 * emulate the queuing and calling of completion function ourselves.
 	 */
-	SCSI_LOG_MLQUEUE(3, printk("scsi_dispatch_cmnd (host = %d, "
-				"channel = %d, target = %d, command = %p, "
-				"buffer = %p, \nbufflen = %d, done = %p)\n",
-				host->host_no, cmd->device->channel,
-				cmd->device->id, cmd->cmnd, cmd->buffer,
-				cmd->bufflen, cmd->done));
 
 	cmd->state = SCSI_STATE_QUEUED;
 	cmd->owner = SCSI_OWNER_LOWLEVEL;
@@ -445,9 +559,6 @@
 		goto out;
 	}
 
-	SCSI_LOG_MLQUEUE(3, printk("queuecommand : routine at %p\n",
-				   host->hostt->queuecommand));
-
 	spin_lock_irqsave(host->host_lock, flags);
 	if (unlikely(test_bit(SHOST_CANCEL, &host->shost_state))) {
 		cmd->result = (DID_NO_CONNECT << 16);
@@ -604,6 +715,7 @@
  */
 static void scsi_softirq(struct softirq_action *h)
 {
+	int disposition;
 	LIST_HEAD(local_q);
 
 	local_irq_disable();
@@ -615,75 +727,19 @@
 						   struct scsi_cmnd, eh_entry);
 		list_del_init(&cmd->eh_entry);
 
-		switch (scsi_decide_disposition(cmd)) {
+		disposition = scsi_decide_disposition(cmd);
+		scsi_log_completion(cmd, disposition);
+		switch (disposition) {
 		case SUCCESS:
-			/*
-			 * Add to BH queue.
-			 */
-			SCSI_LOG_MLCOMPLETE(3,
-					    printk("Command finished %d %d "
-						   "0x%x\n",
-					   cmd->device->host->host_busy,
-					   cmd->device->host->host_failed,
-						   cmd->result));
-
 			scsi_finish_command(cmd);
 			break;
 		case NEEDS_RETRY:
-			/*
-			 * We only come in here if we want to retry a
-			 * command.  The test to see whether the
-			 * command should be retried should be keeping
-			 * track of the number of tries, so we don't
-			 * end up looping, of course.
-			 */
-			SCSI_LOG_MLCOMPLETE(3, printk("Command needs retry "
-						      "%d %d 0x%x\n",
-					      cmd->device->host->host_busy,
-					      cmd->device->host->host_failed,
-						      cmd->result));
-
 			scsi_retry_command(cmd);
 			break;
 		case ADD_TO_MLQUEUE:
-			/* 
-			 * This typically happens for a QUEUE_FULL
-			 * message - typically only when the queue
-			 * depth is only approximate for a given
-			 * device.  Adding a command to the queue for
-			 * the device will prevent further commands
-			 * from being sent to the device, so we
-			 * shouldn't end up with tons of things being
-			 * sent down that shouldn't be.
-			 */
-			SCSI_LOG_MLCOMPLETE(3, printk("Command rejected as "
-						      "device queue full, "
-						      "put on ml queue %p\n",
-						      cmd));
 			scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
 			break;
 		default:
-			/*
-			 * Here we have a fatal error of some sort.
-			 * Turn it over to the error handler.
-			 */
-			SCSI_LOG_MLCOMPLETE(3,
-					    printk("Command failed %p %x "
-						   "busy=%d failed=%d\n",
-						   cmd, cmd->result,
-					   cmd->device->host->host_busy,
-					   cmd->device->host->host_failed));
-
-			/*
-			 * Dump the sense information too.
-			 */
-			if (status_byte(cmd->result) & CHECK_CONDITION)
-				SCSI_LOG_MLCOMPLETE(3, print_sense("bh", cmd));
-
-			/*
-			 * We only fail here if the error recovery thread
-			 * has died.
-			 */
 			if (!scsi_eh_scmd_add(cmd, 0))
 				scsi_finish_command(cmd);
 		}
@@ -749,7 +805,7 @@
 	if (SCSI_SENSE_VALID(cmd))
 		cmd->result |= (DRIVER_SENSE << 24);
 
-	SCSI_LOG_MLCOMPLETE(3, printk("Notifying upper driver of completion "
+	SCSI_LOG_MLCOMPLETE(4, printk("Notifying upper driver of completion "
 				"for device %d %x\n", sdev->id, cmd->result));
 
 	cmd->owner = SCSI_OWNER_HIGHLEVEL;
diff -Nru a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
--- a/drivers/scsi/scsi_debug.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/scsi_debug.c	Thu Jan  8 23:00:24 2004
@@ -55,7 +55,7 @@
 #include "scsi_logging.h"
 #include "scsi_debug.h"
 
-static const char * scsi_debug_version_str = "Version: 1.70 (20030507)";
+static const char * scsi_debug_version_str = "Version: 1.71 (20031007)";
 
 /* Additional Sense Code (ASC) used */
 #define NO_ADDED_SENSE 0x0
@@ -1541,7 +1541,7 @@
         }
 
 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
-		printk(KERN_INFO "scsi_debug: ... built %d host(s)\n",
+		printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
 		       scsi_debug_add_host);
 	}
 	return 0;
@@ -1565,8 +1565,15 @@
 device_initcall(scsi_debug_init);
 module_exit(scsi_debug_exit);
 
+void pseudo_0_release(struct device * dev)
+{
+	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
+		printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
+}
+
 static struct device pseudo_primary = {
 	.bus_id		= "pseudo_0",
+	.release	= pseudo_0_release,
 };
 
 static int pseudo_lld_bus_match(struct device *dev, 
diff -Nru a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
--- a/drivers/scsi/scsi_error.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/scsi_error.c	Thu Jan  8 23:00:23 2004
@@ -164,14 +164,11 @@
  **/
 void scsi_times_out(struct scsi_cmnd *scmd)
 {
+	scsi_log_completion(scmd, TIMEOUT);
 	if (unlikely(!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) {
 		panic("Error handler thread not present at %p %p %s %d",
 		      scmd, scmd->device->host, __FILE__, __LINE__);
 	}
-
-	SCSI_LOG_TIMEOUT(3, printk("Command timed out busy=%d failed=%d\n",
-				   scmd->device->host->host_busy,
-				   scmd->device->host->host_failed));
 }
 
 /**
@@ -446,10 +443,12 @@
 	scmd->request->rq_status = RQ_SCSI_BUSY;
 
 	spin_lock_irqsave(scmd->device->host->host_lock, flags);
+	scsi_log_send(scmd);
 	host->hostt->queuecommand(scmd, scsi_eh_done);
 	spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 
 	down(&sem);
+	scsi_log_completion(scmd, SUCCESS);
 
 	scmd->device->host->eh_action = NULL;
 
diff -Nru a/drivers/scsi/scsi_logging.h b/drivers/scsi/scsi_logging.h
--- a/drivers/scsi/scsi_logging.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/scsi_logging.h	Thu Jan  8 23:00:23 2004
@@ -40,10 +40,13 @@
 extern unsigned int scsi_logging_level;
 
 #ifdef CONFIG_SCSI_LOGGING
+
+#define SCSI_LOG_LEVEL(SHIFT, BITS)				\
+        ((scsi_logging_level >> (SHIFT)) & ((1 << (BITS)) - 1))
+
 #define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD)		\
 {								\
-        unsigned int mask = (1 << (BITS)) - 1;			\
-        if (((scsi_logging_level >> (SHIFT)) & mask) > (LEVEL))	\
+        if ((SCSI_LOG_LEVEL(SHIFT, BITS)) > (LEVEL))		\
 		(CMD);						\
 }
 #else
diff -Nru a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
--- a/drivers/scsi/scsi_priv.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/scsi_priv.h	Thu Jan  8 23:00:24 2004
@@ -83,6 +83,15 @@
 extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd,
 		struct scsi_request *sreq);
 extern void __scsi_release_request(struct scsi_request *sreq);
+#ifdef CONFIG_SCSI_LOGGING
+void scsi_log_send(struct scsi_cmnd *cmd);
+void scsi_log_completion(struct scsi_cmnd *cmd, int disposition);
+#else
+static inline void scsi_log_send(struct scsi_cmnd *cmd) 
+	{ };
+static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
+	{ };
+#endif
 
 /* scsi_devinfo.c */
 extern int scsi_get_device_flags(struct scsi_device *sdev,
diff -Nru a/drivers/scsi/scsiiom.c b/drivers/scsi/scsiiom.c
--- a/drivers/scsi/scsiiom.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/scsiiom.c	Thu Jan  8 23:00:23 2004
@@ -5,9 +5,6 @@
  *		     Bus Master Host Adapter			       *
  ***********************************************************************/
 /* $Id: scsiiom.c,v 2.55.2.17 2000/12/20 00:39:37 garloff Exp $ */
-
-#error Please convert me to Documentation/DMA-mapping.txt
-
 static void __inline__
 dc390_freetag (PDCB pDCB, PSRB pSRB)
 {
@@ -36,9 +33,12 @@
     }
     if (time_before (jiffies, pACB->pScsiHost->last_reset))
     {
-	DEBUG0(printk ("DC390: We were just reset and don't accept commands yet!\n");)
+	DEBUG0(printk ("DC390: We were just reset and don't accept commands yet!\n"));
 	return 1;
     }
+    /* KG: Moved pci mapping here */
+    dc390_pci_map(pSRB);
+    /* TODO: error handling */
     DC390_write8 (Scsi_Dest_ID, pDCB->TargetID);
     DC390_write8 (Sync_Period, pDCB->SyncPeriod);
     DC390_write8 (Sync_Offset, pDCB->SyncOffset);
@@ -47,8 +47,9 @@
     DC390_write8 (CtrlReg4, pDCB->CtrlR4);
     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);		/* Flush FIFO */
     DEBUG1(printk (KERN_INFO "DC390: Start SCSI command: %02x (Sync:%02x)\n",\
-	    pSRB->pcmd->cmnd[0], pDCB->SyncMode);)
-    disc_allowed = pDCB->DevMode & EN_DISCONNECT_; try_sync_nego = 0;
+	    pSRB->pcmd->cmnd[0], pDCB->SyncMode));
+    disc_allowed = pDCB->DevMode & EN_DISCONNECT_;
+    try_sync_nego = 0;
     /* Don't disconnect on AUTO_REQSENSE, cause it might be an
      * Contingent Allegiance Condition (6.6), where no tags should be used.
      * All other have to be allowed to disconnect to prevent Incorrect 
@@ -78,13 +79,13 @@
 	DC390_write8 (ScsiFifo, SIMPLE_QUEUE_TAG);
 	pDCB->TagMask |= (1 << tag_no); pSRB->TagNumber = tag_no;
 	DC390_write8 (ScsiFifo, tag_no);
-	DEBUG1(printk (KERN_DEBUG "DC390: Select w/DisCn for Cmd %li (SRB %p), Using Tag %02x\n", pSRB->pcmd->pid, pSRB, tag_no);)
+	DEBUG1(printk (KERN_DEBUG "DC390: Select w/DisCn for Cmd %li (SRB %p), Using Tag %02x\n", pSRB->pcmd->pid, pSRB, tag_no));
 	cmd = SEL_W_ATN3;
       }
     else	/* No TagQ */
       {
 //      no_tag:
-	DEBUG1(printk (KERN_DEBUG "DC390: Select w%s/DisCn for Cmd %li (SRB %p), No TagQ\n", (disc_allowed?"":"o"), pSRB->pcmd->pid, pSRB);) 
+	DEBUG1(printk (KERN_DEBUG "DC390: Select w%s/DisCn for Cmd %li (SRB %p), No TagQ\n", (disc_allowed?"":"o"), pSRB->pcmd->pid, pSRB));
       };
 
     pSRB->SRBState = SRB_START_;
@@ -92,7 +93,7 @@
     if (try_sync_nego)
       { 
 	UCHAR Sync_Off = pDCB->SyncOffset;
-        DEBUG0(printk (KERN_INFO "DC390: NEW Sync Nego code triggered (%i %i)\n", pDCB->TargetID, pDCB->TargetLUN);)
+        DEBUG0(printk (KERN_INFO "DC390: NEW Sync Nego code triggered (%i %i)\n", pDCB->TargetID, pDCB->TargetLUN));
 	pSRB->MsgOutBuf[0] = EXTENDED_MESSAGE;
 	pSRB->MsgOutBuf[1] = 3;
 	pSRB->MsgOutBuf[2] = EXTENDED_SDTR;
@@ -116,7 +117,7 @@
 	    DC390_write8 (ScsiFifo, 0);
 	    DC390_write8 (ScsiFifo, sizeof(pSRB->pcmd->sense_buffer));
 	    DC390_write8 (ScsiFifo, 0);
-	    DEBUG1(printk (KERN_DEBUG "DC390: AutoReqSense !\n");)
+	    DEBUG1(printk (KERN_DEBUG "DC390: AutoReqSense !\n"));
 	  }
 	else	/* write cmnd to bus */ 
 	  {
@@ -127,15 +128,15 @@
 	  };
       }
     DEBUG0(if (pACB->pActiveDCB)	\
-	   printk (KERN_WARNING "DC390: ActiveDCB != 0\n");)
+	   printk (KERN_WARNING "DC390: ActiveDCB != 0\n"));
     DEBUG0(if (pDCB->pActiveSRB)	\
-	   printk (KERN_WARNING "DC390: ActiveSRB != 0\n");)
+	   printk (KERN_WARNING "DC390: ActiveSRB != 0\n"));
     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
     if (DC390_read8 (Scsi_Status) & INTERRUPT)
     {
 	dc390_freetag (pDCB, pSRB);
 	DEBUG0(printk ("DC390: Interrupt during Start SCSI (pid %li, target %02i-%02i)\n",
-		pSRB->pcmd->pid, pSRB->pcmd->target, pSRB->pcmd->lun);)
+		pSRB->pcmd->pid, pSRB->pcmd->device->id, pSRB->pcmd->device->lun));
 	pSRB->SRBState = SRB_READY;
 	//DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
 	pACB->SelLost++;
@@ -158,13 +159,13 @@
 {
   PSRB pSRB;
   UCHAR dstate;
-  DEBUG0(USHORT pstate;PDEVDECL1;)
+  DEBUG0(USHORT pstate;PDEVDECL1);
   
-  DEBUG0(PDEVSET1;)
-  DEBUG0(PCI_READ_CONFIG_WORD (PDEV, PCI_STATUS, &pstate);)
+  DEBUG0(PDEVSET1);
+  DEBUG0(PCI_READ_CONFIG_WORD (PDEV, PCI_STATUS, &pstate));
   DEBUG0(if (pstate & (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY))\
 	{ printk(KERN_WARNING "DC390: PCI state = %04x!\n", pstate); \
-	  PCI_WRITE_CONFIG_WORD (PDEV, PCI_STATUS, (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY));};)
+	  PCI_WRITE_CONFIG_WORD (PDEV, PCI_STATUS, (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY));});
 
   dstate = DC390_read8 (DMA_Status); 
 
@@ -183,7 +184,7 @@
 	  {
 	    do
 	      {
-		DEBUG1(printk (KERN_DEBUG "DC390: read residual bytes ... \n");)
+		DEBUG1(printk (KERN_DEBUG "DC390: read residual bytes ... \n"));
 		dstate = DC390_read8 (DMA_Status);
 		residual = DC390_read8 (CtcReg_Low) | DC390_read8 (CtcReg_Mid) << 8 |
 		  DC390_read8 (CtcReg_High) << 16;
@@ -210,10 +211,10 @@
     }
   dc390_laststatus &= ~0xff000000; dc390_laststatus |= dstate << 24;
   return dstate;
-};
+}
 #endif
 
-void __inline__
+static irqreturn_t __inline__
 DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
 {
     PACB   pACB, pACB2;
@@ -226,37 +227,37 @@
 #if DMA_INT
     UCHAR  dstatus;
 #endif
-    DC390_AFLAGS DC390_IFLAGS //DC390_DFLAGS
+    DC390_AFLAGS DC390_IFLAGS; //DC390_DFLAGS
 
     pACB = (PACB)dev_id;
     for (pACB2 = dc390_pACB_start; (pACB2 && pACB2 != pACB); pACB2 = pACB2->pNextACB);
     if (!pACB2)
     {
 	printk ("DC390: IRQ called with foreign dev_id %p!\n", pACB);
-	return;
+	return IRQ_NONE;
     }
     
     //DC390_LOCK_DRV;
 
     sstatus = DC390_read8 (Scsi_Status);
     if( !(sstatus & INTERRUPT) )
-	{ /*DC390_UNLOCK_DRV;*/ return; };
+	{ /*DC390_UNLOCK_DRV;*/ return IRQ_NONE; };
 
-    DEBUG1(printk (KERN_DEBUG "sstatus=%02x,", sstatus);)
+    DEBUG1(printk (KERN_DEBUG "sstatus=%02x,", sstatus));
 
 #if DMA_INT
-    DC390_LOCK_IO;
+    DC390_LOCK_IO(pACB->pScsiHost);
     DC390_LOCK_ACB;
     dstatus = dc390_dma_intr (pACB);
     DC390_UNLOCK_ACB;
-    DC390_UNLOCK_IO;
+    DC390_UNLOCK_IO(pACB->pScsiHost);
 
-    DEBUG1(printk (KERN_DEBUG "dstatus=%02x,", dstatus);)
+    DEBUG1(printk (KERN_DEBUG "dstatus=%02x,", dstatus));
     if (! (dstatus & SCSI_INTERRUPT))
       {
-	DEBUG0(printk (KERN_WARNING "DC390 Int w/o SCSI actions (only DMA?)\n");)
+	DEBUG0(printk (KERN_WARNING "DC390 Int w/o SCSI actions (only DMA?)\n"));
 	//DC390_UNLOCK_DRV;
-	return;
+	return IRQ_NONE;
       };
 #else
     //DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT);
@@ -264,14 +265,14 @@
     //DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT);
 #endif
 
-    DC390_LOCK_IO;
+    DC390_LOCK_IO(pACB->pScsiHost);
     DC390_LOCK_ACB;
     //DC390_UNLOCK_DRV_NI; /* Allow _other_ CPUs to process IRQ (useful for shared IRQs) */
 
     istate = DC390_read8 (Intern_State);
     istatus = DC390_read8 (INT_Status); /* This clears Scsi_Status, Intern_State and INT_Status ! */
 
-    DEBUG1(printk (KERN_INFO "Istatus(Res,Inv,Dis,Serv,Succ,ReS,SelA,Sel)=%02x,",istatus);)
+    DEBUG1(printk (KERN_INFO "Istatus(Res,Inv,Dis,Serv,Succ,ReS,SelA,Sel)=%02x,",istatus));
     dc390_laststatus &= ~0x00ffffff;
     dc390_laststatus |= /* dstatus<<24 | */ sstatus<<16 | istate<<8 | istatus;
 
@@ -325,13 +326,13 @@
 	  dc390_EnableMsgOut_Abort (pACB, pSRB);
 
 	phase = pSRB->ScsiPhase;
-	DEBUG1(printk (KERN_INFO "DC390: [%i]%s(0) (%02x)\n", phase, dc390_p0_str[phase], sstatus);)
+	DEBUG1(printk (KERN_INFO "DC390: [%i]%s(0) (%02x)\n", phase, dc390_p0_str[phase], sstatus));
 	stateV = (void *) dc390_phase0[phase];
 	( *stateV )( pACB, pSRB, &sstatus );
 
 	pSRB->ScsiPhase = sstatus & 7;
 	phase = (UCHAR) sstatus & 7;
-	DEBUG1(printk (KERN_INFO "DC390: [%i]%s(1) (%02x)\n", phase, dc390_p1_str[phase], sstatus);)
+	DEBUG1(printk (KERN_INFO "DC390: [%i]%s(1) (%02x)\n", phase, dc390_p1_str[phase], sstatus));
 	stateV = (void *) dc390_phase1[phase];
 	( *stateV )( pACB, pSRB, &sstatus );
 	goto unlock;
@@ -340,17 +341,19 @@
  unlock:
     //DC390_LOCK_DRV_NI;
     DC390_UNLOCK_ACB;
-    DC390_UNLOCK_IO;
+    DC390_UNLOCK_IO(pACB->pScsiHost);
     //DC390_UNLOCK_DRV; /* Restore initial flags */
+    return IRQ_HANDLED;
 }
 
-void
-do_DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t do_DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
 {
-    DEBUG1(printk (KERN_INFO "DC390: Irq (%i) caught: ", irq);)
+    irqreturn_t ret;
+    DEBUG1(printk (KERN_INFO "DC390: Irq (%i) caught: ", irq));
     /* Locking is done in DC390_Interrupt */
-    DC390_Interrupt(irq, dev_id, regs);
-    DEBUG1(printk (".. IRQ returned\n");)
+    ret = DC390_Interrupt(irq, dev_id, regs);
+    DEBUG1(printk (".. IRQ returned\n"));
+    return ret;
 }
 
 void
@@ -381,8 +384,8 @@
 		pSRB->pSegmentList++;
 		psgl = pSRB->pSegmentList;
 
-		pSRB->SGBusAddr = virt_to_bus( psgl->address );
-		pSRB->SGToBeXferLen = (ULONG) psgl->length;
+		pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
+		pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
 	    }
 	    else
 		pSRB->SGToBeXferLen = 0;
@@ -433,8 +436,8 @@
 	    dc390_laststatus &= ~0xff000000; dc390_laststatus |= dstate << 24;
 	    DEBUG1(ResidCnt = ((ULONG) DC390_read8 (CtcReg_High) << 16)	\
 		+ ((ULONG) DC390_read8 (CtcReg_Mid) << 8)		\
-		+ ((ULONG) DC390_read8 (CtcReg_Low));)
-	    DEBUG1(printk (KERN_DEBUG "Count_2_Zero (ResidCnt=%i,ToBeXfer=%li),", ResidCnt, pSRB->SGToBeXferLen);)
+		+ ((ULONG) DC390_read8 (CtcReg_Low)));
+	    DEBUG1(printk (KERN_DEBUG "Count_2_Zero (ResidCnt=%i,ToBeXfer=%li),", ResidCnt, pSRB->SGToBeXferLen));
 
 	    DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
 
@@ -445,8 +448,8 @@
 		pSRB->pSegmentList++;
 		psgl = pSRB->pSegmentList;
 
-		pSRB->SGBusAddr = virt_to_bus( psgl->address );
-		pSRB->SGToBeXferLen = (ULONG) psgl->length;
+		pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
+		pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
 	    }
 	    else
 		pSRB->SGToBeXferLen = 0;
@@ -457,7 +460,7 @@
 	    bval = DC390_read8 (Current_Fifo);
 	    while( bval & 0x1f )
 	    {
-		DEBUG1(printk (KERN_DEBUG "Check for residuals,");)
+		DEBUG1(printk (KERN_DEBUG "Check for residuals,"));
 		if( (bval & 0x1f) == 1 )
 		{
 		    for(i=0; i < 0x100; i++)
@@ -488,7 +491,7 @@
 	    //DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
 	    dc390_laststatus &= ~0xff000000; dc390_laststatus |= bval << 24;
 
-	    DEBUG1(printk (KERN_DEBUG "Blast: Read %i times DMA_Status %02x", 0xa000-i, bval);)
+	    DEBUG1(printk (KERN_DEBUG "Blast: Read %i times DMA_Status %02x", 0xa000-i, bval));
 	    ResidCnt = (UINT) DC390_read8 (CtcReg_High);
 	    ResidCnt <<= 8;
 	    ResidCnt |= (UINT) DC390_read8 (CtcReg_Mid);
@@ -510,7 +513,7 @@
 		pSRB->SGToBeXferLen--;
 	    }
 	    DEBUG1(printk (KERN_DEBUG "Xfered: %li, Total: %li, Remaining: %li\n", xferCnt,\
-			   pSRB->TotalXferredLen, pSRB->SGToBeXferLen);)
+			   pSRB->TotalXferredLen, pSRB->SGToBeXferLen));
 
 	}
     }
@@ -579,7 +582,7 @@
 {
   pSRB->MsgOutBuf[0] = MESSAGE_REJECT;
   pSRB->MsgCnt = 1; DC390_ENABLE_MSGOUT;
-  DEBUG0 (printk (KERN_INFO "DC390: Reject message\n");)
+  DEBUG0 (printk (KERN_INFO "DC390: Reject message\n"));
 }
 
 /* abort command */
@@ -724,57 +727,55 @@
 
 
 /* handle RESTORE_PTR */
+/* I presume, this command is already mapped, so, have to remap. */
 static void 
 dc390_restore_ptr (PACB pACB, PSRB pSRB)
 {
-  PSGL psgl;
-  pSRB->TotalXferredLen = 0;
-  pSRB->SGIndex = 0;
-  if( pSRB->pcmd->use_sg )
-    {
-      pSRB->SGcount = (UCHAR) pSRB->pcmd->use_sg;
-      pSRB->pSegmentList = (PSGL) pSRB->pcmd->request_buffer;
-      psgl = pSRB->pSegmentList;
-      while (pSRB->TotalXferredLen + (ULONG) psgl->length < pSRB->Saved_Ptr)
-	{
-	  pSRB->TotalXferredLen += (ULONG) psgl->length;
-	  pSRB->SGIndex++;
-	  if( pSRB->SGIndex < pSRB->SGcount )
+    Scsi_Cmnd* pcmd = pSRB->pcmd;
+    PSGL psgl;
+    pSRB->TotalXferredLen = 0;
+    pSRB->SGIndex = 0;
+    if (pcmd->use_sg) {
+	pSRB->pSegmentList = (PSGL) pcmd->request_buffer;
+	psgl = pSRB->pSegmentList;
+	//dc390_pci_sync(pSRB);
+
+	while (pSRB->TotalXferredLen + (ULONG) psgl->length < pSRB->Saved_Ptr)
+	{
+	    pSRB->TotalXferredLen += (ULONG) psgl->length;
+	    pSRB->SGIndex++;
+	    if( pSRB->SGIndex < pSRB->SGcount )
 	    {
-	      pSRB->pSegmentList++;
-	      psgl = pSRB->pSegmentList;
-	      
-	      pSRB->SGBusAddr = virt_to_bus( psgl->address );
-	      pSRB->SGToBeXferLen = (ULONG) psgl->length;
+		pSRB->pSegmentList++;
+		psgl = pSRB->pSegmentList;
+		pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
+		pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
 	    }
-	  else
-	    pSRB->SGToBeXferLen = 0;
+	    else
+		pSRB->SGToBeXferLen = 0;
 	}
-      pSRB->SGToBeXferLen -= (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
-      pSRB->SGBusAddr += (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
-      printk (KERN_INFO "DC390: Pointer restored. Segment %i, Total %li, Bus %08lx\n", pSRB->SGIndex, pSRB->Saved_Ptr, pSRB->SGBusAddr);
-    }
-    else if( pSRB->pcmd->request_buffer )
-    {
+	pSRB->SGToBeXferLen -= (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
+	pSRB->SGBusAddr += (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
+	printk (KERN_INFO "DC390: Pointer restored. Segment %i, Total %li, Bus %08lx\n",
+		pSRB->SGIndex, pSRB->Saved_Ptr, pSRB->SGBusAddr);
+
+    } else if(pcmd->request_buffer) {
+	//dc390_pci_sync(pSRB);
+
+	pSRB->Segmentx.length = pcmd->request_bufflen - pSRB->Saved_Ptr;
 	pSRB->SGcount = 1;
 	pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
-	pSRB->Segmentx.address = (PUCHAR) pSRB->pcmd->request_buffer + pSRB->Saved_Ptr;
-	pSRB->Segmentx.length = pSRB->pcmd->request_bufflen - pSRB->Saved_Ptr;
-	printk (KERN_INFO "DC390: Pointer restored. Total %li, Bus %p\n",
-		pSRB->Saved_Ptr, pSRB->Segmentx.address);
-    }
-     else
-       {
+    } else {
 	 pSRB->SGcount = 0;
 	 printk (KERN_INFO "DC390: RESTORE_PTR message for Transfer without Scatter-Gather ??\n");
-       };
+    }
 
   pSRB->TotalXferredLen = pSRB->Saved_Ptr;
 };
 
 
 /* According to the docs, the AM53C974 reads the message and 
- * generates a Succesful Operation IRQ before asserting ACK for
+ * generates a Successful Operation IRQ before asserting ACK for
  * the last byte (how does it know whether it's the last ?) */
 /* The old code handled it in another way, indicating, that on
  * every message byte an IRQ is generated and every byte has to
@@ -811,7 +812,7 @@
     /* Msg complete ? */
     if (dc390_MsgIn_complete (pSRB->MsgInBuf, pACB->MsgLen))
       {
-	DEBUG0 (printk (KERN_INFO "DC390: MsgIn:"); dc390_printMsg (pSRB->MsgInBuf, pACB->MsgLen);)
+	DEBUG0 (printk (KERN_INFO "DC390: MsgIn:"); dc390_printMsg (pSRB->MsgInBuf, pACB->MsgLen));
 	/* Now eval the msg */
 	switch (pSRB->MsgInBuf[0]) 
 	  {
@@ -853,7 +854,7 @@
 	    break;
 	    // The device might want to restart transfer with a RESTORE
 	  case RESTORE_POINTERS:
-	    DEBUG0(printk ("DC390: RESTORE POINTER message received ... try to handle\n");)
+	    DEBUG0(printk ("DC390: RESTORE POINTER message received ... try to handle\n"));
 	    dc390_restore_ptr (pACB, pSRB);
 	    break;
 
@@ -864,7 +865,7 @@
 	/* Clear counter and MsgIn state */
 	pSRB->SRBState &= ~SRB_MSGIN;
 	pACB->MsgLen = 0;
-      };
+      }
 
     *psstatus = SCSI_NOP0;
     DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD);
@@ -895,12 +896,12 @@
 	if( !pSRB->SGToBeXferLen )
 	{
 	    psgl = pSRB->pSegmentList;
-	    pSRB->SGBusAddr = virt_to_bus( psgl->address );
-	    pSRB->SGToBeXferLen = (ULONG) psgl->length;
-	    DEBUG1(printk (KERN_DEBUG " DC390: Next SG segment.");)
+	    pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
+	    pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
+	    DEBUG1(printk (KERN_DEBUG " DC390: Next SG segment."));
 	}
 	lval = pSRB->SGToBeXferLen;
-	DEBUG1(printk (KERN_DEBUG " DC390: Start transfer: %li bytes (address %08lx)\n", lval, pSRB->SGBusAddr);)
+	DEBUG1(printk (KERN_DEBUG " DC390: Start transfer: %li bytes (address %08lx)\n", lval, pSRB->SGBusAddr));
 	DC390_write8 (CtcReg_Low, (UCHAR) lval);
 	lval >>= 8;
 	DC390_write8 (CtcReg_Mid, (UCHAR) lval);
@@ -916,9 +917,9 @@
 	DC390_write8 (ScsiCmd, DMA_COMMAND+INFO_XFER_CMD);
 
 	DC390_write8 (DMA_Cmd, DMA_START_CMD | ioDir | DMA_INT);
-	//DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT);)
-	//DEBUG1(printk (KERN_DEBUG "DC390: DMA_Status: %02x\n", DC390_read8 (DMA_Status));)
-	//DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT);)
+	//DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT));
+	//DEBUG1(printk (KERN_DEBUG "DC390: DMA_Status: %02x\n", DC390_read8 (DMA_Status)));
+	//DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT));
     }
     else    /* xfer pad */
     {
@@ -926,9 +927,9 @@
 	{
 	    pSRB->AdaptStatus = H_OVER_UNDER_RUN;
 	    pSRB->SRBStatus |= OVER_RUN;
-	    DEBUG0(printk (KERN_WARNING " DC390: Overrun -");)
+	    DEBUG0(printk (KERN_WARNING " DC390: Overrun -"));
 	}
-	DEBUG0(printk (KERN_WARNING " Clear transfer pad \n");)
+	DEBUG0(printk (KERN_WARNING " Clear transfer pad \n"));
 	DC390_write8 (CtcReg_Low, 0);
 	DC390_write8 (CtcReg_Mid, 0);
 	DC390_write8 (CtcReg_High, 0);
@@ -981,7 +982,7 @@
 	DC390_write8 (ScsiFifo, bval);
 	DC390_write8 (ScsiFifo, sizeof(pSRB->pcmd->sense_buffer));
 	DC390_write8 (ScsiFifo, bval);
-	DEBUG0(printk(KERN_DEBUG "DC390: AutoReqSense (CmndPhase)!\n");)
+	DEBUG0(printk(KERN_DEBUG "DC390: AutoReqSense (CmndPhase)!\n"));
     }
     pSRB->SRBState = SRB_COMMAND;
     DC390_write8 (ScsiCmd, INFO_XFER_CMD);
@@ -1111,7 +1112,7 @@
     PSRB   pSRB, psrb;
     UCHAR  i, cnt;
 
-    DEBUG0(printk(KERN_INFO "DISC,");)
+    DEBUG0(printk(KERN_INFO "DISC,"));
 
     if (!pACB->Connected) printk(KERN_ERR "DC390: Disconnect not-connected bus?\n");
     pACB->Connected = 0;
@@ -1120,7 +1121,7 @@
      {
 	int j = 400;
 	DEBUG0(printk(KERN_ERR "ACB:%p->ActiveDCB:%p IOPort:%04x IRQ:%02x !\n",\
-	       pACB, pDCB, pACB->IOPortBase, pACB->IRQLevel);)
+	       pACB, pDCB, pACB->IOPortBase, pACB->IRQLevel));
 	while (--j) udelay (1000);
 	DC390_read8 (INT_Status);	/* Reset Pending INT */
 	DC390_write8 (ScsiCmd, EN_SEL_RESEL);
@@ -1194,12 +1195,12 @@
     PSRB   pSRB;
     UCHAR  id, lun;
 
-    DEBUG0(printk(KERN_INFO "RSEL,");)
+    DEBUG0(printk(KERN_INFO "RSEL,"));
     pACB->Connected = 1;
     pDCB = pACB->pActiveDCB;
     if( pDCB )
     {	/* Arbitration lost but Reselection won */
-	DEBUG0(printk ("DC390: (ActiveDCB != 0: Arb. lost but resel. won)!\n");)
+	DEBUG0(printk ("DC390: (ActiveDCB != 0: Arb. lost but resel. won)!\n"));
 	pSRB = pDCB->pActiveSRB;
 	if( !( pACB->scan_devices ) )
 	{
@@ -1211,7 +1212,7 @@
     }
     /* Get ID */
     lun = DC390_read8 (ScsiFifo);
-    DEBUG0(printk ("Dev %02x,", lun);)
+    DEBUG0(printk ("Dev %02x,", lun));
     if (!(lun & (1 << pACB->pScsiHost->this_id)))
       printk (KERN_ERR "DC390: Reselection must select host adapter: %02x!\n", lun);
     else
@@ -1221,7 +1222,7 @@
     lun = DC390_read8 (ScsiFifo);
     if (!(lun & IDENTIFY_BASE)) printk (KERN_ERR "DC390: Resel: Expect identify message!\n");
     lun &= 7;
-    DEBUG0(printk ("(%02i-%i),", id, lun);)
+    DEBUG0(printk ("(%02i-%i),", id, lun));
     pDCB = dc390_findDCB (pACB, id, lun);
     if (!pDCB)
     {
@@ -1262,7 +1263,7 @@
 	}
     }
 
-    DEBUG1(printk (KERN_DEBUG "Resel SRB(%p): TagNum (%02x)\n", pSRB, pSRB->TagNumber);)
+    DEBUG1(printk (KERN_DEBUG "Resel SRB(%p): TagNum (%02x)\n", pSRB, pSRB->TagNumber));
     pSRB->ScsiPhase = SCSI_NOP0;
     DC390_write8 (Scsi_Dest_ID, pDCB->TargetID);
     DC390_write8 (Sync_Period, pDCB->SyncPeriod);
@@ -1282,7 +1283,7 @@
    if (pDCB->GoingSRBCnt > 1)
      {
 	DCBDEBUG(printk (KERN_INFO "DC390: Driver won't free DCB (ID %i, LUN %i): 0x%08x because of SRBCnt %i\n",\
-		pDCB->TargetID, pDCB->TargetLUN, (int)pDCB, pDCB->GoingSRBCnt);)
+		pDCB->TargetID, pDCB->TargetLUN, (int)pDCB, pDCB->GoingSRBCnt));
 	return;
      };
    pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN);
@@ -1304,7 +1305,7 @@
    }
 
    DCBDEBUG(printk (KERN_INFO "DC390: Driver about to free DCB (ID %i, LUN %i): %p\n",\
-	   pDCB->TargetID, pDCB->TargetLUN, pDCB);)
+	   pDCB->TargetID, pDCB->TargetLUN, pDCB));
    if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0;
    if (pDCB == pACB->pLinkDCB) pACB->pLinkDCB = pDCB->pNextDCB;
    if (pDCB == pACB->pDCBRunRobin) pACB->pDCBRunRobin = pDCB->pNextDCB;
@@ -1366,14 +1367,18 @@
     PSGL   ptr2;
     ULONG  swlval;
 
-    pcmd = pSRB->pcmd; DCB_removed = 0;
+    pcmd = pSRB->pcmd;
+    /* KG: Moved pci_unmap here */
+    dc390_pci_unmap(pSRB);
+
+    DCB_removed = 0;
     status = pSRB->TargetStatus;
     ptr = (PSCSI_INQDATA) (pcmd->request_buffer);
     if( pcmd->use_sg )
-	ptr = (PSCSI_INQDATA) (((PSGL) ptr)->address);
+	ptr = (PSCSI_INQDATA) sg_dma_address((PSGL) ptr);
 	
     DEBUG0(printk (" SRBdone (%02x,%08x), SRB %p, pid %li\n", status, pcmd->result,\
-		pSRB, pcmd->pid);)
+		pSRB, pcmd->pid));
     if(pSRB->SRBFlag & AUTO_REQSENSE)
     {	/* Last command was a Request Sense */
 	pSRB->SRBFlag &= ~AUTO_REQSENSE;
@@ -1415,7 +1420,7 @@
 	    else
 		  pcmd->result = MK_RES_LNX(DRIVER_SENSE,DID_OK,0,CHECK_CONDITION);
 		  REMOVABLEDEBUG(printk(KERN_INFO "Cmd=%02x,Result=%08x,XferL=%08x\n",pSRB->pcmd->cmnd[0],\
-			(UINT) pcmd->result, (UINT) pSRB->TotalXferredLen);)
+			(UINT) pcmd->result, (UINT) pSRB->TotalXferredLen));
 	    goto ckc_e;
 	}
 	else /* Retry */
@@ -1430,24 +1435,17 @@
 	    {
 		pcmd->result = MK_RES_LNX(DRIVER_SENSE,DID_OK,0,CHECK_CONDITION);
 		REMOVABLEDEBUG(printk(KERN_INFO "Cmd=%02x, Result=%08x, XferL=%08x\n",pSRB->pcmd->cmnd[0],\
-		       (UINT) pcmd->result, (UINT) pSRB->TotalXferredLen);)
+		       (UINT) pcmd->result, (UINT) pSRB->TotalXferredLen));
 		goto ckc_e;
 	    }
 	    SET_RES_DRV(pcmd->result,DRIVER_SENSE);
-	    pSRB->SGcount	 = (UCHAR) pSRB->SavedSGCount;
+	    pcmd->use_sg	 = pSRB->SavedSGCount;
 	    //pSRB->ScsiCmdLen	 = (UCHAR) (pSRB->Segment1[0] >> 8);
-	    DEBUG0 (printk ("DC390: RETRY pid %li (%02x), target %02i-%02i\n", pcmd->pid, pcmd->cmnd[0], pcmd->target, pcmd->lun);)
+	    DEBUG0 (printk ("DC390: RETRY pid %li (%02x), target %02i-%02i\n", pcmd->pid, pcmd->cmnd[0], pcmd->device->id, pcmd->device->lun));
 	    pSRB->SGIndex = 0;
 	    pSRB->TotalXferredLen = 0;
 	    pSRB->SGToBeXferLen = 0;
-	    if( pcmd->use_sg )
-		pSRB->pSegmentList = (PSGL) pcmd->request_buffer;
-	    else if( pcmd->request_buffer )
-	    {
-		pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
-		pSRB->Segmentx.address = (PUCHAR) pcmd->request_buffer;
-		pSRB->Segmentx.length = pcmd->request_bufflen;
-	    }
+
 	    if( dc390_StartSCSI( pACB, pDCB, pSRB ) ) {
 		dc390_Going_to_Waiting ( pDCB, pSRB );
 		dc390_waiting_timer (pACB, HZ/5);
@@ -1460,7 +1458,7 @@
 	if( status_byte(status) == CHECK_CONDITION )
 	{
 	    REMOVABLEDEBUG(printk (KERN_INFO "DC390: Check_Condition (Cmd %02x, Id %02x, LUN %02x)\n",\
-		    pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN);)
+		    pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN));
 	    if( (pSRB->SGIndex < pSRB->SGcount) && (pSRB->SGcount) && (pSRB->SGToBeXferLen) )
 	    {
 		bval = pSRB->SGcount;
@@ -1472,7 +1470,7 @@
 		    ptr2++;
 		}
 		REMOVABLEDEBUG(printk(KERN_INFO "XferredLen=%08x,NotXferLen=%08x\n",\
-			(UINT) pSRB->TotalXferredLen, (UINT) swlval);)
+			(UINT) pSRB->TotalXferredLen, (UINT) swlval));
 	    }
 	    dc390_RequestSense( pACB, pDCB, pSRB );
 	    return;
@@ -1515,14 +1513,6 @@
 		pSRB->SGIndex = 0;
 		pSRB->TotalXferredLen = 0;
 		pSRB->SGToBeXferLen = 0;
-		if( pcmd->use_sg )
-		    pSRB->pSegmentList = (PSGL) pcmd->request_buffer;
-		else if( pcmd->request_buffer )
-		{
-		    pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
-		    pSRB->Segmentx.address = (PUCHAR) pcmd->request_buffer;
-		    pSRB->Segmentx.length = pcmd->request_bufflen;
-		}
 		if( dc390_StartSCSI( pACB, pDCB, pSRB ) ) {
 		    dc390_Going_to_Waiting ( pDCB, pSRB );
 		    dc390_waiting_timer (pACB, HZ/5);
@@ -1637,7 +1627,7 @@
     /* Add to free list */
     dc390_Free_insert (pACB, pSRB);
 
-    DEBUG0(printk (KERN_DEBUG "DC390: SRBdone: done pid %li\n", pcmd->pid);)
+    DEBUG0(printk (KERN_DEBUG "DC390: SRBdone: done pid %li\n", pcmd->pid));
     DC390_UNLOCK_ACB_NI;
     pcmd->scsi_done (pcmd);
     DC390_LOCK_ACB_NI;
@@ -1677,7 +1667,7 @@
 
 /*	    ReleaseSRB( pDCB, pSRB ); */
 
-	    DEBUG0(printk (KERN_DEBUG "DC390: DoingSRB_Done: done pid %li\n", pcmd->pid);)
+	    DEBUG0(printk (KERN_DEBUG "DC390: DoingSRB_Done: done pid %li\n", pcmd->pid));
 	    DC390_UNLOCK_ACB_NI;
 	    pcmd->scsi_done( pcmd );
 	    DC390_LOCK_ACB_NI;
@@ -1712,7 +1702,7 @@
 dc390_ScsiRstDetect( PACB pACB )
 {
     printk ("DC390: Rst_Detect: laststat = %08x\n", dc390_laststatus);
-    //DEBUG0(printk(KERN_INFO "RST_DETECT,");)
+    //DEBUG0(printk(KERN_INFO "RST_DETECT,"));
 
     if (timer_pending (&pACB->Waiting_Timer)) del_timer (&pACB->Waiting_Timer);
     DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
@@ -1746,25 +1736,23 @@
 {
     PSCSICMD  pcmd;
 
+    pcmd = pSRB->pcmd;
+
     REMOVABLEDEBUG(printk (KERN_INFO "DC390: RequestSense (Cmd %02x, Id %02x, LUN %02x)\n",\
-	    pSRB->pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN);)
+	    pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN));
 
     pSRB->SRBFlag |= AUTO_REQSENSE;
     //pSRB->Segment0[0] = (UINT) pSRB->CmdBlock[0];
     //pSRB->Segment0[1] = (UINT) pSRB->CmdBlock[4];
-    //pSRB->Segment1[0] = ((UINT)(pSRB->pcmd->cmd_len) << 8) + pSRB->SGcount;
+    //pSRB->Segment1[0] = ((UINT)(pcmd->cmd_len) << 8) + pSRB->SGcount;
     //pSRB->Segment1[1] = pSRB->TotalXferredLen;
-    pSRB->SavedSGCount = pSRB->SGcount;
+    pSRB->SavedSGCount = pcmd->use_sg;
     pSRB->SavedTotXLen = pSRB->TotalXferredLen;
     pSRB->AdaptStatus = 0;
     pSRB->TargetStatus = 0; /* CHECK_CONDITION<<1; */
 
-    pcmd = pSRB->pcmd;
-
-    pSRB->Segmentx.address = (PUCHAR) &(pcmd->sense_buffer);
-    pSRB->Segmentx.length = sizeof(pcmd->sense_buffer);
-    pSRB->pSegmentList = &pSRB->Segmentx;
-    pSRB->SGcount = 1;
+    /* We are called from SRBdone, original PCI mapping has been removed
+     * already, new one is set up from StartSCSI */
     pSRB->SGIndex = 0;
 
     //pSRB->CmdBlock[0] = REQUEST_SENSE;
diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c
--- a/drivers/scsi/sg.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sg.c	Thu Jan  8 23:00:24 2004
@@ -18,8 +18,7 @@
  *
  */
 #include <linux/config.h>
-static char *sg_version_str = "3.5.29 [20030529]";
-static int sg_version_num = 30529;	/* 2 digits for each component */
+static int sg_version_num = 30530;	/* 2 digits for each component */
 /*
  *  D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
  *      - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
@@ -56,6 +55,8 @@
 #include <linux/smp_lock.h>
 #include <linux/moduleparam.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/cdev.h>
+#include <linux/seq_file.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -72,6 +73,8 @@
 
 #ifdef CONFIG_SCSI_PROC_FS
 #include <linux/proc_fs.h>
+static char *sg_version_str = "3.5.30 [20031010]";
+
 static int sg_proc_init(void);
 static void sg_proc_cleanup(void);
 #endif
@@ -83,7 +86,7 @@
 #define SG_ALLOW_DIO_DEF 0
 #define SG_ALLOW_DIO_CODE /* compile out by commenting this define */
 
-#define SG_MAX_DEVS_MASK (256 - 1)
+#define SG_MAX_DEVS 8192
 
 /*
  * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
@@ -182,6 +185,7 @@
 	volatile char exclude;	/* opened for exclusive access */
 	char sgdebug;		/* 0->off, 1->sense, 9->dump dev, 10-> all devs */
 	struct gendisk *disk;
+	struct cdev * cdev;	/* char_dev [sysfs: /sys/cdev/major/sg<n>] */
 } Sg_device;
 
 static int sg_fasync(int fd, struct file *filp, int mode);
@@ -219,7 +223,6 @@
 static inline unsigned sg_jif_to_ms(int jifs);
 static int sg_allow_access(unsigned char opcode, char dev_type);
 static int sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len);
-// static void sg_unmap_and(Sg_scatter_hold * schp, int free_also);
 static Sg_device *sg_get_dev(int dev);
 static inline unsigned char *sg_scatg2virt(const struct scatterlist *sclp);
 #ifdef CONFIG_SCSI_PROC_FS
@@ -243,7 +246,7 @@
 	Sg_device *sdp;
 	Sg_fd *sfp;
 	int res;
-	int retval = -EBUSY;
+	int retval;
 
 	SCSI_LOG_TIMEOUT(3, printk("sg_open: dev=%d, flags=0x%x\n", dev, flags));
 	sdp = sg_get_dev(dev);
@@ -270,8 +273,10 @@
 			retval = -EPERM; /* Can't lock it with read only access */
 			goto error_out;
 		}
-		if (sdp->headfp && (flags & O_NONBLOCK))
+		if (sdp->headfp && (flags & O_NONBLOCK)) {
+			retval = -EBUSY;
 			goto error_out;
+		}
 		res = 0;
 		__wait_event_interruptible(sdp->o_excl_wait,
 			((sdp->headfp || sdp->exclude) ? 0 : (sdp->exclude = 1)), res);
@@ -280,8 +285,10 @@
 			goto error_out;
 		}
 	} else if (sdp->exclude) {	/* some other fd has an exclusive lock on dev */
-		if (flags & O_NONBLOCK)
+		if (flags & O_NONBLOCK) {
+			retval = -EBUSY;
 			goto error_out;
+		}
 		res = 0;
 		__wait_event_interruptible(sdp->o_excl_wait, (!sdp->exclude),
 					   res);
@@ -877,8 +884,8 @@
 		result = get_user(val, (int *) arg);
 		if (result)
 			return result;
-		if (val < 0)
-			return -EINVAL;
+                if (val < 0)
+                        return -EINVAL;
 		if (val != sfp->reserve.bufflen) {
 			if (sg_res_in_use(sfp) || sfp->mmap_called)
 				return -EBUSY;
@@ -1118,7 +1125,7 @@
 }
 
 static struct page *
-sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int unused)
+sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type)
 {
 	Sg_fd *sfp;
 	struct page *page = NOPAGE_SIGBUS;
@@ -1158,6 +1165,8 @@
 		page = virt_to_page(page_ptr);
 		get_page(page);	/* increment page count */
 	}
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -1325,18 +1334,22 @@
 };
 
 static int
-sg_add(struct class_device *cdev)
+sg_add(struct class_device *cl_dev)
 {
-	struct scsi_device *scsidp = to_scsi_device(cdev->dev);
+	struct scsi_device *scsidp = to_scsi_device(cl_dev->dev);
 	struct gendisk *disk;
 	Sg_device *sdp = NULL;
 	unsigned long iflags;
+	struct cdev * cdev = NULL;
 	int k, error;
 
 	disk = alloc_disk(1);
 	if (!disk)
 		return -ENOMEM;
 
+	cdev = cdev_alloc();
+	if (! cdev)
+		return -ENOMEM;
 	write_lock_irqsave(&sg_dev_arr_lock, iflags);
 	if (sg_nr_dev >= sg_dev_max) {	/* try to resize */
 		Sg_device **tmp_da;
@@ -1364,13 +1377,13 @@
 	for (k = 0; k < sg_dev_max; k++)
 		if (!sg_dev_arr[k])
 			break;
-	if (k > SG_MAX_DEVS_MASK) {
+	if (k >= SG_MAX_DEVS) {
 		write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
 		printk(KERN_WARNING
 		       "Unable to attach sg device <%d, %d, %d, %d>"
-		       " type=%d, minor number exceed %d\n",
+		       " type=%d, minor number exceeds %d\n",
 		       scsidp->host->host_no, scsidp->channel, scsidp->id,
-		       scsidp->lun, scsidp->type, SG_MAX_DEVS_MASK);
+		       scsidp->lun, scsidp->type, SG_MAX_DEVS - 1);
 		if (NULL != sdp)
 			vfree((char *) sdp);
 		error = -ENODEV;
@@ -1396,15 +1409,14 @@
 	SCSI_LOG_TIMEOUT(3, printk("sg_attach: dev=%d \n", k));
 	memset(sdp, 0, sizeof(*sdp));
 	sprintf(disk->disk_name, "sg%d", k);
+	strncpy(cdev->kobj.name, disk->disk_name, KOBJ_NAME_LEN);
+	cdev->owner = THIS_MODULE;
+	cdev->ops = &sg_fops;
 	disk->major = SCSI_GENERIC_MAJOR;
 	disk->first_minor = k;
 	sdp->disk = disk;
 	sdp->device = scsidp;
 	init_waitqueue_head(&sdp->o_excl_wait);
-	sdp->headfp = NULL;
-	sdp->exclude = 0;
-	sdp->sgdebug = 0;
-	sdp->detached = 0;
 	sdp->sg_tablesize = scsidp->host ? scsidp->host->sg_tablesize : 0;
 
 	sg_nr_dev++;
@@ -1414,6 +1426,22 @@
 	devfs_mk_cdev(MKDEV(SCSI_GENERIC_MAJOR, k),
 			S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
 			"%s/generic", scsidp->devfs_name);
+	error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, k), 1);
+	if (error) {
+		devfs_remove("%s/generic", scsidp->devfs_name);
+		goto out;
+	}
+	sdp->cdev = cdev;
+	error = sysfs_create_link(&cdev->kobj, &scsidp->sdev_gendev.kobj, 
+				  "device");
+	if (error)
+		printk(KERN_ERR "sg_attach: unable to make symlink 'device'"
+		       " for sg%d\n", k);
+	error = sysfs_create_link(&scsidp->sdev_gendev.kobj, &cdev->kobj, 
+				  "generic");
+	if (error)
+		printk(KERN_ERR "sg_attach: unable to make symlink 'generic'"
+		       " back to sg%d\n", k);
 
 	printk(KERN_NOTICE
 	       "Attached scsi generic sg%d at scsi%d, channel"
@@ -1425,13 +1453,15 @@
 
 out:
 	put_disk(disk);
+	if (cdev)
+		kobject_put(&cdev->kobj);
 	return error;
 }
 
 static void
-sg_remove(struct class_device *cdev)
+sg_remove(struct class_device *cl_dev)
 {
-	struct scsi_device *scsidp = to_scsi_device(cdev->dev);
+	struct scsi_device *scsidp = to_scsi_device(cl_dev->dev);
 	Sg_device *sdp = NULL;
 	unsigned long iflags;
 	Sg_fd *sfp;
@@ -1481,6 +1511,10 @@
 	write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
 
 	if (sdp) {
+		sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic");
+		sysfs_remove_link(&sdp->cdev->kobj, "device");
+		cdev_del(sdp->cdev);
+		sdp->cdev = NULL;
 		devfs_remove("%s/generic", scsidp->devfs_name);
 		put_disk(sdp->disk);
 		sdp->disk = NULL;
@@ -1513,12 +1547,14 @@
 	if (def_reserved_size >= 0)
 		sg_big_buff = def_reserved_size;
 
-	rc = register_chrdev(SCSI_GENERIC_MAJOR, "sg", &sg_fops);
+	rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), 
+				    SG_MAX_DEVS, "sg");
 	if (rc)
 		return rc;
 	rc = scsi_register_interface(&sg_interface);
 	if (rc) {
-		unregister_chrdev(SCSI_GENERIC_MAJOR, "sg");
+		unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
+				         SG_MAX_DEVS);
 		return rc;
 	}
 #ifdef CONFIG_SCSI_PROC_FS
@@ -1534,7 +1570,8 @@
 	sg_proc_cleanup();
 #endif				/* CONFIG_SCSI_PROC_FS */
 	scsi_unregister_interface(&sg_interface);
-	unregister_chrdev(SCSI_GENERIC_MAJOR, "sg");
+	unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
+				 SG_MAX_DEVS);
 	if (sg_dev_arr != NULL) {
 		vfree((char *) sg_dev_arr);
 		sg_dev_arr = NULL;
@@ -1582,7 +1619,6 @@
 	Sg_scatter_hold *req_schp = &srp->data;
 
 	SCSI_LOG_TIMEOUT(4, printk("sg_finish_rem_req: res_used=%d\n", (int) srp->res_used));
-	// sg_unmap_and(&srp->data, 1);
 	if (srp->res_used)
 		sg_unlink_reserve(sfp, srp);
 	else
@@ -2590,78 +2626,99 @@
 
 static char sg_proc_sg_dirname[] = "scsi/sg";
 
-static int sg_proc_adio_read(char *buffer, char **start, off_t offset,
-			     int size, int *eof, void *data);
-static int sg_proc_adio_info(char *buffer, int *len, off_t * begin,
-			     off_t offset, int size);
-static int sg_proc_adio_write(struct file *filp, const char *buffer,
-			      unsigned long count, void *data);
-static int sg_proc_dressz_read(char *buffer, char **start, off_t offset,
-			       int size, int *eof, void *data);
-static int sg_proc_dressz_info(char *buffer, int *len, off_t * begin,
-			       off_t offset, int size);
-static int sg_proc_dressz_write(struct file *filp, const char *buffer,
-				unsigned long count, void *data);
-static int sg_proc_debug_read(char *buffer, char **start, off_t offset,
-			      int size, int *eof, void *data);
-static int sg_proc_debug_info(char *buffer, int *len, off_t * begin,
-			      off_t offset, int size);
-static int sg_proc_dev_read(char *buffer, char **start, off_t offset,
-			    int size, int *eof, void *data);
-static int sg_proc_dev_info(char *buffer, int *len, off_t * begin,
-			    off_t offset, int size);
-static int sg_proc_devhdr_read(char *buffer, char **start, off_t offset,
-			       int size, int *eof, void *data);
-static int sg_proc_devhdr_info(char *buffer, int *len, off_t * begin,
-			       off_t offset, int size);
-static int sg_proc_devstrs_read(char *buffer, char **start, off_t offset,
-				int size, int *eof, void *data);
-static int sg_proc_devstrs_info(char *buffer, int *len, off_t * begin,
-				off_t offset, int size);
-static int sg_proc_version_read(char *buffer, char **start, off_t offset,
-				int size, int *eof, void *data);
-static int sg_proc_version_info(char *buffer, int *len, off_t * begin,
-				off_t offset, int size);
+static int sg_proc_seq_show_int(struct seq_file *s, void *v);
+
+static int sg_proc_single_open_adio(struct inode *inode, struct file *file);
+static ssize_t sg_proc_write_adio(struct file *filp, const char __user *buffer,
+			          size_t count, loff_t *off);
+static struct file_operations adio_fops = {
+	/* .owner, .read and .llseek added in sg_proc_init() */
+	.open = sg_proc_single_open_adio,
+	.write = sg_proc_write_adio,
+	.release = single_release,
+};
+
+static int sg_proc_single_open_dressz(struct inode *inode, struct file *file);
+static ssize_t sg_proc_write_dressz(struct file *filp, 
+		const char __user *buffer, size_t count, loff_t *off);
+static struct file_operations dressz_fops = {
+	.open = sg_proc_single_open_dressz,
+	.write = sg_proc_write_dressz,
+	.release = single_release,
+};
+
+static int sg_proc_seq_show_version(struct seq_file *s, void *v);
+static int sg_proc_single_open_version(struct inode *inode, struct file *file);
+static struct file_operations version_fops = {
+	.open = sg_proc_single_open_version,
+	.release = single_release,
+};
+
+static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v);
+static int sg_proc_single_open_devhdr(struct inode *inode, struct file *file);
+static struct file_operations devhdr_fops = {
+	.open = sg_proc_single_open_devhdr,
+	.release = single_release,
+};
+
+static int sg_proc_seq_show_dev(struct seq_file *s, void *v);
+static int sg_proc_open_dev(struct inode *inode, struct file *file);
+static void * dev_seq_start(struct seq_file *s, loff_t *pos);
+static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos);
+static void dev_seq_stop(struct seq_file *s, void *v);
+static struct file_operations dev_fops = {
+	.open = sg_proc_open_dev,
+	.release = seq_release,
+};
+static struct seq_operations dev_seq_ops = {
+	.start = dev_seq_start,
+	.next  = dev_seq_next,
+	.stop  = dev_seq_stop,
+	.show  = sg_proc_seq_show_dev,
+};
+
+static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v);
+static int sg_proc_open_devstrs(struct inode *inode, struct file *file);
+static struct file_operations devstrs_fops = {
+	.open = sg_proc_open_devstrs,
+	.release = seq_release,
+};
+static struct seq_operations devstrs_seq_ops = {
+	.start = dev_seq_start,
+	.next  = dev_seq_next,
+	.stop  = dev_seq_stop,
+	.show  = sg_proc_seq_show_devstrs,
+};
+
+static int sg_proc_seq_show_debug(struct seq_file *s, void *v);
+static int sg_proc_open_debug(struct inode *inode, struct file *file);
+static struct file_operations debug_fops = {
+	.open = sg_proc_open_debug,
+	.release = seq_release,
+};
+static struct seq_operations debug_seq_ops = {
+	.start = dev_seq_start,
+	.next  = dev_seq_next,
+	.stop  = dev_seq_stop,
+	.show  = sg_proc_seq_show_debug,
+};
+
 
 struct sg_proc_leaf {
 	const char * name;
-	read_proc_t * rf;
-	write_proc_t * wf;
+	struct file_operations * fops;
 };
 
 static struct sg_proc_leaf sg_proc_leaf_arr[] = {
-	{"allow_dio", sg_proc_adio_read, sg_proc_adio_write},
-	{"def_reserved_size", sg_proc_dressz_read, sg_proc_dressz_write},
-	{"debug", sg_proc_debug_read, NULL},
-	{"devices", sg_proc_dev_read, NULL},
-	{"device_hdr", sg_proc_devhdr_read, NULL},
-	{"device_strs", sg_proc_devstrs_read, NULL},
-	{"version", sg_proc_version_read, NULL}
+	{"allow_dio", &adio_fops},
+	{"debug", &debug_fops},
+	{"def_reserved_size", &dressz_fops},
+	{"device_hdr", &devhdr_fops},
+	{"devices", &dev_fops},
+	{"device_strs", &devstrs_fops},
+	{"version", &version_fops}
 };
 
-#define PRINT_PROC(fmt,args...)                                 \
-    do {                                                        \
-	*len += sprintf(buffer + *len, fmt, ##args);            \
-	if (*begin + *len > offset + size)                      \
-	    return 0;                                           \
-	if (*begin + *len < offset) {                           \
-	    *begin += *len;                                     \
-	    *len = 0;                                           \
-	}                                                       \
-    } while(0)
-
-#define SG_PROC_READ_FN(infofp)                                 \
-    do {                                                        \
-	int len = 0;                                            \
-	off_t begin = 0;                                        \
-	*eof = infofp(buffer, &len, &begin, offset, size);      \
-	if (offset >= (begin + len))                            \
-	    return 0;                                           \
-	*start = buffer + offset - begin;			\
-	return (size < (begin + len - offset)) ?                \
-				size : begin + len - offset;    \
-    } while(0)
-
 static int
 sg_proc_init(void)
 {
@@ -2677,12 +2734,13 @@
 		return 1;
 	for (k = 0; k < num_leaves; ++k) {
 		leaf = &sg_proc_leaf_arr[k];
-		mask = leaf->wf ? S_IRUGO | S_IWUSR : S_IRUGO;
+		mask = leaf->fops->write ? S_IRUGO | S_IWUSR : S_IRUGO;
 		pdep = create_proc_entry(leaf->name, mask, sg_proc_sgp);
 		if (pdep) {
-			pdep->read_proc = leaf->rf;
-			if (leaf->wf)
-				pdep->write_proc = leaf->wf;
+			leaf->fops->owner = THIS_MODULE,
+			leaf->fops->read = seq_read,
+			leaf->fops->llseek = seq_lseek,
+			pdep->proc_fops = leaf->fops;
 		}
 	}
 	return 0;
@@ -2702,23 +2760,21 @@
 	remove_proc_entry(sg_proc_sg_dirname, NULL);
 }
 
-static int
-sg_proc_adio_read(char *buffer, char **start, off_t offset,
-		  int size, int *eof, void *data)
+
+static int sg_proc_seq_show_int(struct seq_file *s, void *v)
 {
-	SG_PROC_READ_FN(sg_proc_adio_info);
+	seq_printf(s, "%d\n", *((int *)s->private));
+	return 0;
 }
 
-static int
-sg_proc_adio_info(char *buffer, int *len, off_t * begin, off_t offset, int size)
+static int sg_proc_single_open_adio(struct inode *inode, struct file *file)
 {
-	PRINT_PROC("%d\n", sg_allow_dio);
-	return 1;
+	return single_open(file, sg_proc_seq_show_int, &sg_allow_dio);
 }
 
-static int
-sg_proc_adio_write(struct file *filp, const char *buffer,
-		   unsigned long count, void *data)
+static ssize_t 
+sg_proc_write_adio(struct file *filp, const char __user *buffer,
+		   size_t count, loff_t *off)
 {
 	int num;
 	char buff[11];
@@ -2733,24 +2789,14 @@
 	return count;
 }
 
-static int
-sg_proc_dressz_read(char *buffer, char **start, off_t offset,
-		    int size, int *eof, void *data)
-{
-	SG_PROC_READ_FN(sg_proc_dressz_info);
-}
-
-static int
-sg_proc_dressz_info(char *buffer, int *len, off_t * begin,
-		    off_t offset, int size)
+static int sg_proc_single_open_dressz(struct inode *inode, struct file *file)
 {
-	PRINT_PROC("%d\n", sg_big_buff);
-	return 1;
+	return single_open(file, sg_proc_seq_show_int, &sg_big_buff);
 }
 
-static int
-sg_proc_dressz_write(struct file *filp, const char *buffer,
-		     unsigned long count, void *data)
+static ssize_t 
+sg_proc_write_dressz(struct file *filp, const char __user *buffer,
+		     size_t count, loff_t *off)
 {
 	int num;
 	unsigned long k = ULONG_MAX;
@@ -2770,15 +2816,111 @@
 	return -ERANGE;
 }
 
-static int
-sg_proc_debug_read(char *buffer, char **start, off_t offset,
-		   int size, int *eof, void *data)
+static int sg_proc_seq_show_version(struct seq_file *s, void *v)
+{
+	seq_printf(s, "%d\t%s\n", sg_version_num, sg_version_str);
+	return 0;
+}
+
+static int sg_proc_single_open_version(struct inode *inode, struct file *file)
 {
-	SG_PROC_READ_FN(sg_proc_debug_info);
+	return single_open(file, sg_proc_seq_show_version, NULL);
 }
 
-static int sg_proc_debug_helper(char *buffer, int *len, off_t * begin,
-				off_t offset, int size, Sg_device * sdp)
+static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v)
+{
+	seq_printf(s, "host\tchan\tid\tlun\ttype\topens\tqdepth\tbusy\t"
+		   "online\n");
+	return 0;
+}
+
+static int sg_proc_single_open_devhdr(struct inode *inode, struct file *file)
+{
+	return single_open(file, sg_proc_seq_show_devhdr, NULL);
+}
+
+struct sg_proc_deviter {
+	loff_t	index;
+	size_t	max;
+};
+
+static void * dev_seq_start(struct seq_file *s, loff_t *pos)
+{
+	struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);
+
+	if (! it)
+		return NULL;
+	if (NULL == sg_dev_arr)
+		goto err1;
+	it->index = *pos;
+	it->max = sg_last_dev();
+	if (it->index >= it->max)
+		goto err1;
+	return it;
+err1:
+	kfree(it);
+	return NULL;
+}
+
+static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)
+{
+	struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
+
+	*pos = ++it->index;
+	return (it->index < it->max) ? it : NULL;
+}
+
+static void dev_seq_stop(struct seq_file *s, void *v)
+{
+	kfree (v);
+}
+
+static int sg_proc_open_dev(struct inode *inode, struct file *file)
+{
+        return seq_open(file, &dev_seq_ops);
+}
+
+static int sg_proc_seq_show_dev(struct seq_file *s, void *v)
+{
+	struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
+	Sg_device *sdp;
+	struct scsi_device *scsidp;
+
+	sdp = it ? sg_get_dev(it->index) : NULL;
+	if (sdp && (scsidp = sdp->device) && (!sdp->detached))
+		seq_printf(s, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
+			      scsidp->host->host_no, scsidp->channel,
+			      scsidp->id, scsidp->lun, (int) scsidp->type,
+			      1,
+			      (int) scsidp->queue_depth,
+			      (int) scsidp->device_busy,
+			      (int) scsidp->online);
+	else
+		seq_printf(s, "-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
+	return 0;
+}
+
+static int sg_proc_open_devstrs(struct inode *inode, struct file *file)
+{
+        return seq_open(file, &devstrs_seq_ops);
+}
+
+static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v)
+{
+	struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
+	Sg_device *sdp;
+	struct scsi_device *scsidp;
+
+	sdp = it ? sg_get_dev(it->index) : NULL;
+	if (sdp && (scsidp = sdp->device) && (!sdp->detached))
+		seq_printf(s, "%8.8s\t%16.16s\t%4.4s\n",
+			   scsidp->vendor, scsidp->model, scsidp->rev);
+	else
+		seq_printf(s, "<no active device>\n");
+	return 0;
+}
+
+static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
 {
 	int k, m, new_interface, blen, usg;
 	Sg_request *srp;
@@ -2787,13 +2929,13 @@
 	const char * cp;
 
 	for (k = 0; (fp = sg_get_nth_sfp(sdp, k)); ++k) {
-		PRINT_PROC("   FD(%d): timeout=%dms bufflen=%d "
+		seq_printf(s, "   FD(%d): timeout=%dms bufflen=%d "
 			   "(res)sgat=%d low_dma=%d\n", k + 1,
 			   sg_jif_to_ms(fp->timeout),
 			   fp->reserve.bufflen,
 			   (int) fp->reserve.k_use_sg,
 			   (int) fp->low_dma);
-		PRINT_PROC("   cmd_q=%d f_packid=%d k_orphan=%d closed=%d\n",
+		seq_printf(s, "   cmd_q=%d f_packid=%d k_orphan=%d closed=%d\n",
 			   (int) fp->cmd_q, (int) fp->force_packid,
 			   (int) fp->keep_orphan, (int) fp->closed);
 		for (m = 0; (srp = sg_get_nth_request(fp, m)); ++m) {
@@ -2811,166 +2953,77 @@
 				else
 					cp = "     ";
 			}
-			PRINT_PROC(cp);
+			seq_printf(s, cp);
 			blen = srp->my_cmdp ? 
 				srp->my_cmdp->sr_bufflen : srp->data.bufflen;
 			usg = srp->my_cmdp ? 
 				srp->my_cmdp->sr_use_sg : srp->data.k_use_sg;
-			PRINT_PROC(srp->done ? 
+			seq_printf(s, srp->done ? 
 				   ((1 == srp->done) ?  "rcv:" : "fin:")
 				   : (srp->my_cmdp ? "act:" : "prior:"));
-			PRINT_PROC(" id=%d blen=%d",
+			seq_printf(s, " id=%d blen=%d",
 				   srp->header.pack_id, blen);
 			if (srp->done)
-				PRINT_PROC(" dur=%d", hp->duration);
+				seq_printf(s, " dur=%d", hp->duration);
 			else
-				PRINT_PROC(" t_o/elap=%d/%d",
+				seq_printf(s, " t_o/elap=%d/%d",
 				  new_interface ? hp->timeout : sg_jif_to_ms(fp->timeout),
 				  sg_jif_to_ms(hp->duration ? (jiffies - hp->duration) : 0));
-			PRINT_PROC("ms sgat=%d op=0x%02x\n", usg,
+			seq_printf(s, "ms sgat=%d op=0x%02x\n", usg,
 				   (int) srp->data.cmd_opcode);
 		}
 		if (0 == m)
-			PRINT_PROC("     No requests active\n");
+			seq_printf(s, "     No requests active\n");
 	}
-	return 1;
 }
 
-static int
-sg_proc_debug_info(char *buffer, int *len, off_t * begin,
-		   off_t offset, int size)
+static int sg_proc_open_debug(struct inode *inode, struct file *file)
 {
-	Sg_device *sdp;
-	int j, max_dev;
-
-	if (NULL == sg_dev_arr) {
-		PRINT_PROC("sg_dev_arr NULL, driver not initialized\n");
-		return 1;
-	}
-	max_dev = sg_last_dev();
-	PRINT_PROC("dev_max(currently)=%d max_active_device=%d (origin 1)\n",
-		   sg_dev_max, max_dev);
-	PRINT_PROC(" def_reserved_size=%d\n", sg_big_buff);
-	for (j = 0; j < max_dev; ++j) {
-		if ((sdp = sg_get_dev(j))) {
-			struct scsi_device *scsidp = sdp->device;
-
-			if (NULL == scsidp) {
-				PRINT_PROC("device %d detached ??\n", j);
-				continue;
-			}
-
-			if (sg_get_nth_sfp(sdp, 0)) {
-				PRINT_PROC(" >>> device=%s ",
-					sdp->disk->disk_name);
-				if (sdp->detached)
-					PRINT_PROC("detached pending close ");
-				else
-					PRINT_PROC
-					    ("scsi%d chan=%d id=%d lun=%d   em=%d",
-					     scsidp->host->host_no,
-					     scsidp->channel, scsidp->id,
-					     scsidp->lun,
-					     scsidp->host->hostt->emulated);
-				PRINT_PROC(" sg_tablesize=%d excl=%d\n",
-					   sdp->sg_tablesize, sdp->exclude);
-			}
-			if (0 == sg_proc_debug_helper(buffer, len, begin,
-						      offset, size, sdp))
-				return 0;
-		}
-	}
-	return 1;
+        return seq_open(file, &debug_seq_ops);
 }
 
-static int
-sg_proc_dev_read(char *buffer, char **start, off_t offset,
-		 int size, int *eof, void *data)
-{
-	SG_PROC_READ_FN(sg_proc_dev_info);
-}
-
-static int
-sg_proc_dev_info(char *buffer, int *len, off_t * begin, off_t offset, int size)
+static int sg_proc_seq_show_debug(struct seq_file *s, void *v)
 {
+	struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
 	Sg_device *sdp;
-	int j, max_dev;
-	struct scsi_device *scsidp;
 
-	max_dev = sg_last_dev();
-	for (j = 0; j < max_dev; ++j) {
-		sdp = sg_get_dev(j);
-		if (sdp && (scsidp = sdp->device) && (!sdp->detached))
-			PRINT_PROC("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
-				   scsidp->host->host_no, scsidp->channel,
-				   scsidp->id, scsidp->lun, (int) scsidp->type,
-				   1,
-				   (int) scsidp->queue_depth,
-				   (int) scsidp->device_busy,
-				   (int) scsidp->online);
-		else
-			PRINT_PROC("-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
+	if (it && (0 == it->index)) {
+		seq_printf(s, "dev_max(currently)=%d max_active_device=%d "
+			   "(origin 1)\n", sg_dev_max, (int)it->max);
+		seq_printf(s, " def_reserved_size=%d\n", sg_big_buff);
 	}
-	return 1;
-}
-
-static int
-sg_proc_devhdr_read(char *buffer, char **start, off_t offset,
-		    int size, int *eof, void *data)
-{
-	SG_PROC_READ_FN(sg_proc_devhdr_info);
-}
-
-static int
-sg_proc_devhdr_info(char *buffer, int *len, off_t * begin,
-		    off_t offset, int size)
-{
-	PRINT_PROC("host\tchan\tid\tlun\ttype\topens\tqdepth\tbusy\tonline\n");
-	return 1;
-}
-
-static int
-sg_proc_devstrs_read(char *buffer, char **start, off_t offset,
-		     int size, int *eof, void *data)
-{
-	SG_PROC_READ_FN(sg_proc_devstrs_info);
-}
+	sdp = it ? sg_get_dev(it->index) : NULL;
+	if (sdp) {
+		struct scsi_device *scsidp = sdp->device;
 
-static int
-sg_proc_devstrs_info(char *buffer, int *len, off_t * begin,
-		     off_t offset, int size)
-{
-	Sg_device *sdp;
-	int j, max_dev;
-	struct scsi_device *scsidp;
+		if (NULL == scsidp) {
+			seq_printf(s, "device %d detached ??\n", 
+				   (int)it->index);
+			return 0;
+		}
 
-	max_dev = sg_last_dev();
-	for (j = 0; j < max_dev; ++j) {
-		sdp = sg_get_dev(j);
-		if (sdp && (scsidp = sdp->device) && (!sdp->detached))
-			PRINT_PROC("%8.8s\t%16.16s\t%4.4s\n",
-				   scsidp->vendor, scsidp->model, scsidp->rev);
-		else
-			PRINT_PROC("<no active device>\n");
+		if (sg_get_nth_sfp(sdp, 0)) {
+			seq_printf(s, " >>> device=%s ",
+				sdp->disk->disk_name);
+			if (sdp->detached)
+				seq_printf(s, "detached pending close ");
+			else
+				seq_printf
+				    (s, "scsi%d chan=%d id=%d lun=%d   em=%d",
+				     scsidp->host->host_no,
+				     scsidp->channel, scsidp->id,
+				     scsidp->lun,
+				     scsidp->host->hostt->emulated);
+			seq_printf(s, " sg_tablesize=%d excl=%d\n",
+				   sdp->sg_tablesize, sdp->exclude);
+		}
+		sg_proc_debug_helper(s, sdp);
 	}
-	return 1;
-}
-
-static int
-sg_proc_version_read(char *buffer, char **start, off_t offset,
-		     int size, int *eof, void *data)
-{
-	SG_PROC_READ_FN(sg_proc_version_info);
+	return 0;
 }
 
-static int
-sg_proc_version_info(char *buffer, int *len, off_t * begin,
-		     off_t offset, int size)
-{
-	PRINT_PROC("%d\t%s\n", sg_version_num, sg_version_str);
-	return 1;
-}
 #endif				/* CONFIG_SCSI_PROC_FS */
 
 module_init(init_sg);
 module_exit(exit_sg);
+MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
diff -Nru a/drivers/scsi/st.c b/drivers/scsi/st.c
--- a/drivers/scsi/st.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/st.c	Thu Jan  8 23:00:24 2004
@@ -17,7 +17,7 @@
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static char *verstr = "20030811";
+static char *verstr = "20031228";
 
 #include <linux/module.h>
 
@@ -35,6 +35,7 @@
 #include <linux/blkdev.h>
 #include <linux/moduleparam.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/cdev.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
 #include <asm/system.h>
@@ -140,14 +141,19 @@
 #define ST_TIMEOUT (900 * HZ)
 #define ST_LONG_TIMEOUT (14000 * HZ)
 
-#define TAPE_NR(x) (iminor(x) & ~(-1 << ST_MODE_SHIFT))
+/* Remove mode bits and auto-rewind bit (7) */
+#define TAPE_NR(x) ( ((iminor(x) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
+    (iminor(x) & ~(-1 << ST_MODE_SHIFT)) )
 #define TAPE_MODE(x) ((iminor(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
 
+/* Construct the minor number from the device (d), mode (m), and non-rewind (n) data */
+#define TAPE_MINOR(d, m, n) (((d & ~(255 >> (ST_NBR_MODE_BITS + 1))) << (ST_NBR_MODE_BITS + 1)) | \
+  (d & (255 >> (ST_NBR_MODE_BITS + 1))) | (m << ST_MODE_SHIFT) | ((n != 0) << 7) )
+
 /* Internal ioctl to set both density (uppermost 8 bits) and blocksize (lower
    24 bits) */
 #define SET_DENS_AND_BLK 0x10001
 
-#define ST_DEV_ARR_LUMP  6
 static rwlock_t st_dev_arr_lock = RW_LOCK_UNLOCKED;
 
 static int st_fixed_buffer_size = ST_FIXED_BUFFER_SIZE;
@@ -1006,7 +1012,6 @@
 	write_unlock(&st_dev_arr_lock);
 	STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;
 
-
 	if (!scsi_block_when_processing_errors(STp->device)) {
 		retval = (-ENXIO);
 		goto err_out;
@@ -1970,10 +1975,13 @@
 	long code;
 	ST_mode *STm;
 	char *name = tape_name(STp);
+	struct cdev *cd0, *cd1;
 
 	STm = &(STp->modes[STp->current_mode]);
 	if (!STm->defined) {
+		cd0 = STm->cdevs[0]; cd1 = STm->cdevs[1];
 		memcpy(STm, &(STp->modes[0]), sizeof(ST_mode));
+		STm->cdevs[0] = cd0; STm->cdevs[1] = cd1;
 		modes_defined = TRUE;
                 DEBC(printk(ST_DEB_MSG
                             "%s: Initialized mode %d definition from mode 0\n",
@@ -3704,12 +3712,13 @@
 static int st_probe(struct device *dev)
 {
 	struct scsi_device *SDp = to_scsi_device(dev);
-	struct gendisk *disk;
-	Scsi_Tape *tpnt;
+	struct gendisk *disk = NULL;
+	struct cdev *cdev = NULL;
+	Scsi_Tape *tpnt = NULL;
 	ST_mode *STm;
 	ST_partstat *STps;
 	ST_buffer *buffer;
-	int i, mode, dev_num;
+	int i, j, mode, dev_num, error;
 	char *stp;
 	u64 bounce_limit;
 
@@ -3743,7 +3752,7 @@
 		Scsi_Tape **tmp_da;
 		int tmp_dev_max;
 
-		tmp_dev_max = st_nr_dev + ST_DEV_ARR_LUMP;
+		tmp_dev_max = max(st_nr_dev * 2, 8);
 		if (tmp_dev_max > ST_MAX_TAPES)
 			tmp_dev_max = ST_MAX_TAPES;
 		if (tmp_dev_max <= st_nr_dev) {
@@ -3837,6 +3846,42 @@
 		STm->default_compression = ST_DONT_TOUCH;
 		STm->default_blksize = (-1);	/* No forced size */
 		STm->default_density = (-1);	/* No forced density */
+
+		for (j=0; j < 2; j++) {
+			cdev = cdev_alloc();
+			if (!cdev) {
+				printk(KERN_ERR
+				       "st: out of memory. Device not attached.\n");
+				goto out_put_disk;
+			}
+			snprintf(cdev->kobj.name, KOBJ_NAME_LEN, "%sm%d%s", disk->disk_name,
+				 i, j ? "n" : "");
+			cdev->owner = THIS_MODULE;
+			cdev->ops = &st_fops;
+			STm->cdevs[j] = cdev;
+
+			error = cdev_add(STm->cdevs[j],
+					 MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, i, j)),
+					 1);
+			if (error) {
+				printk(KERN_ERR "st%d: Can't add %s-rewind mode %d\n",
+				       dev_num, j ? "non" : "auto", i);
+			}
+
+			error = sysfs_create_link(&STm->cdevs[j]->kobj, &SDp->sdev_gendev.kobj,
+						  "device");
+			if (error) {
+				printk(KERN_ERR
+				       "st%d: Can't create sysfs link from SCSI device.\n",
+				       dev_num);
+			}
+		}
+	}
+	error = sysfs_create_link(&SDp->sdev_gendev.kobj, &tpnt->modes[0].cdevs[0]->kobj,
+				  "tape");
+	if (error) {
+		printk(KERN_ERR "st%d: Can't create sysfs link from SCSI device.\n",
+		       dev_num);
 	}
 
 	for (i = 0; i < ST_NBR_PARTITIONS; i++) {
@@ -3881,17 +3926,28 @@
 
 out_put_disk:
 	put_disk(disk);
+	if (tpnt) {
+		for (i=0; i < ST_NBR_MODES; i++) {
+			STm = &(tpnt->modes[i]);
+			if (STm->cdevs[0])
+				kobject_put(&STm->cdevs[0]->kobj);
+			if (STm->cdevs[1])
+				kobject_put(&STm->cdevs[1]->kobj);
+		}
+		kfree(tpnt);
+	}
 out_buffer_free:
 	kfree(buffer);
 out:
 	return -ENODEV;
 };
 
+
 static int st_remove(struct device *dev)
 {
 	Scsi_Device *SDp = to_scsi_device(dev);
 	Scsi_Tape *tpnt;
-	int i, mode;
+	int i, j, mode;
 
 	write_lock(&st_dev_arr_lock);
 	for (i = 0; i < st_dev_max; i++) {
@@ -3901,9 +3957,16 @@
 			st_nr_dev--;
 			write_unlock(&st_dev_arr_lock);
 			devfs_unregister_tape(tpnt->disk->number);
+			sysfs_remove_link(&SDp->sdev_gendev.kobj, "tape");
 			for (mode = 0; mode < ST_NBR_MODES; ++mode) {
 				devfs_remove("%s/mt%s", SDp->devfs_name, st_formats[mode]);
 				devfs_remove("%s/mt%sn", SDp->devfs_name, st_formats[mode]);
+				for (j=0; j < 2; j++) {
+					sysfs_remove_link(&tpnt->modes[mode].cdevs[j]->kobj,
+							  "device");
+					cdev_del(tpnt->modes[mode].cdevs[j]);
+					tpnt->modes[mode].cdevs[j] = NULL;
+				}
 			}
 			tpnt->device = NULL;
 
@@ -3930,12 +3993,14 @@
 		"st: Version %s, fixed bufsize %d, s/g segs %d\n",
 		verstr, st_fixed_buffer_size, st_max_sg_segs);
 
-	if (register_chrdev(SCSI_TAPE_MAJOR, "st", &st_fops) >= 0) {
+	if (!register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
+				    ST_MAX_TAPE_ENTRIES, "st")) {
 		if (scsi_register_driver(&st_template.gendrv) == 0) {
 			do_create_driverfs_files();
 			return 0;
 		}
-		unregister_chrdev(SCSI_TAPE_MAJOR, "st");
+		unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
+					 ST_MAX_TAPE_ENTRIES);
 	}
 
 	printk(KERN_ERR "Unable to get major %d for SCSI tapes\n", SCSI_TAPE_MAJOR);
@@ -3946,7 +4011,8 @@
 {
 	do_remove_driverfs_files();
 	scsi_unregister_driver(&st_template.gendrv);
-	unregister_chrdev(SCSI_TAPE_MAJOR, "st");
+	unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
+				 ST_MAX_TAPE_ENTRIES);
 	kfree(scsi_tapes);
 	printk(KERN_INFO "st: Unloaded.\n");
 }
diff -Nru a/drivers/scsi/st.h b/drivers/scsi/st.h
--- a/drivers/scsi/st.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/st.h	Thu Jan  8 23:00:24 2004
@@ -47,13 +47,16 @@
 	unsigned char default_compression;	/* 0 = don't touch, etc */
 	short default_density;	/* Forced density, -1 = no value */
 	int default_blksize;	/* Forced blocksize, -1 = no value */
+	struct cdev *cdevs[2];  /* Auto-rewind and non-rewind devices */
 } ST_mode;
 
 #define ST_NBR_MODE_BITS 2
 #define ST_NBR_MODES (1 << ST_NBR_MODE_BITS)
 #define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS)
 #define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT)
-#define ST_MAX_TAPES (1 << ST_MODE_SHIFT)
+
+#define ST_MAX_TAPES 128
+#define ST_MAX_TAPE_ENTRIES  (ST_MAX_TAPES << (ST_NBR_MODE_BITS + 1))
 
 /* The status related to each partition */
 typedef struct {
diff -Nru a/drivers/scsi/sym53c8xx_2/sym53c8xx.h b/drivers/scsi/sym53c8xx_2/sym53c8xx.h
--- a/drivers/scsi/sym53c8xx_2/sym53c8xx.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym53c8xx.h	Thu Jan  8 23:00:24 2004
@@ -55,19 +55,7 @@
 
 #include <linux/config.h>
 
-/*
- *  Use normal IO if configured.
- *  Normal IO forced for alpha.
- *  Forced to MMIO for sparc.
- */
-#if defined(__alpha__)
-#define	SYM_CONF_IOMAPPED
-#elif defined(__sparc__)
-#undef SYM_CONF_IOMAPPED
-/* #elif defined(__powerpc__) */
-/* #define	SYM_CONF_IOMAPPED */
-/* #define SYM_OPT_NO_BUS_MEMORY_MAPPING */
-#elif defined(CONFIG_SCSI_SYM53C8XX_IOMAPPED)
+#ifdef CONFIG_SCSI_SYM53C8XX_IOMAPPED
 #define	SYM_CONF_IOMAPPED
 #endif
 
@@ -93,8 +81,6 @@
  */
 #if 1
 #define SYM_CONF_NVRAM_SUPPORT		(1)
-#define SYM_SETUP_SYMBIOS_NVRAM		(1)
-#define SYM_SETUP_TEKRAM_NVRAM		(1)
 #endif
 
 /*
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_fw.c b/drivers/scsi/sym53c8xx_2/sym_fw.c
--- a/drivers/scsi/sym53c8xx_2/sym_fw.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_fw.c	Thu Jan  8 23:00:24 2004
@@ -89,9 +89,6 @@
 };
 static struct sym_fwz_ofs sym_fw1z_ofs = {
 	SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
-#endif
 };
 #undef	SYM_FWA_SCR
 #undef	SYM_FWB_SCR
@@ -122,10 +119,6 @@
 };
 static struct sym_fwz_ofs sym_fw2z_ofs = {
 	SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
-	SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram64)
-#endif
 };
 #undef	SYM_FWA_SCR
 #undef	SYM_FWB_SCR
@@ -146,22 +139,10 @@
 {
 	struct sym_fw1a_scr *scripta0;
 	struct sym_fw1b_scr *scriptb0;
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	struct sym_fw1z_scr *scriptz0 = 
-		(struct sym_fw1z_scr *) np->scriptz0;
-#endif
 
 	scripta0 = (struct sym_fw1a_scr *) np->scripta0;
 	scriptb0 = (struct sym_fw1b_scr *) np->scriptb0;
 
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  Set up BUS physical address of SCRIPTS that is to 
-	 *  be copied to on-chip RAM by the SCRIPTS processor.
-	 */
-	scriptz0->scripta0_ba[0]	= cpu_to_scr(vtobus(scripta0));
-#endif
-
 	/*
 	 *  Remove LED support if not needed.
 	 */
@@ -199,24 +180,9 @@
 {
 	struct sym_fw2a_scr *scripta0;
 	struct sym_fw2b_scr *scriptb0;
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	struct sym_fw2z_scr *scriptz0 = 
-		(struct sym_fw2z_scr *) np->scriptz0;
-#endif
 
 	scripta0 = (struct sym_fw2a_scr *) np->scripta0;
 	scriptb0 = (struct sym_fw2b_scr *) np->scriptb0;
-
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  Set up BUS physical address of SCRIPTS that is to 
-	 *  be copied to on-chip RAM by the SCRIPTS processor.
-	 */
-	scriptz0->scripta0_ba64[0]	= /* Nothing is missing here */
-	scriptz0->scripta0_ba[0]	= cpu_to_scr(vtobus(scripta0));
-	scriptz0->scriptb0_ba64[0]	= cpu_to_scr(vtobus(scriptb0));
-	scriptz0->ram_seg64[0]		= np->scr_ram_seg;
-#endif
 
 	/*
 	 *  Remove LED support if not needed.
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_fw.h b/drivers/scsi/sym53c8xx_2/sym_fw.h
--- a/drivers/scsi/sym53c8xx_2/sym_fw.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_fw.h	Thu Jan  8 23:00:24 2004
@@ -113,10 +113,6 @@
 };
 struct sym_fwz_ofs {
 	SYM_GEN_FW_Z(u_short)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(u_short, start_ram)
-	SYM_GEN_Z(u_short, start_ram64)
-#endif
 };
 
 /*
@@ -136,10 +132,6 @@
 };
 struct sym_fwz_ba {
 	SYM_GEN_FW_Z(u32)
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	SYM_GEN_Z(u32, start_ram)
-	SYM_GEN_Z(u32, start_ram64)
-#endif
 };
 #undef	SYM_GEN_A
 #undef	SYM_GEN_B
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_fw1.h b/drivers/scsi/sym53c8xx_2/sym_fw1.h
--- a/drivers/scsi/sym53c8xx_2/sym_fw1.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_fw1.h	Thu Jan  8 23:00:24 2004
@@ -234,10 +234,6 @@
 struct SYM_FWZ_SCR {
 	u32 snooptest		[  9];
 	u32 snoopend		[  2];
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	u32 start_ram		[  1];
-	u32 scripta0_ba		[  4];
-#endif
 };
 
 static struct SYM_FWA_SCR SYM_FWA_SCR = {
@@ -1851,24 +1847,5 @@
 	 */
 	SCR_INT,
 		99,
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  We may use MEMORY MOVE instructions to load the on chip-RAM,
-	 *  if it happens that mapping PCI memory is not possible.
-	 *  But writing the RAM from the CPU is the preferred method, 
-	 *  since PCI 2.2 seems to disallow PCI self-mastering.
-	 */
-}/*-------------------------< START_RAM >------------------------*/,{
-	/*
-	 *  Load the script into on-chip RAM, 
-	 *  and jump to start point.
-	 */
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_JUMP,
-		PADDR_A (init),
-#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
 }/*--------------------------<>----------------------------------*/
 };
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_fw2.h b/drivers/scsi/sym53c8xx_2/sym_fw2.h
--- a/drivers/scsi/sym53c8xx_2/sym_fw2.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_fw2.h	Thu Jan  8 23:00:24 2004
@@ -228,14 +228,6 @@
 struct SYM_FWZ_SCR {
 	u32 snooptest		[  6];
 	u32 snoopend		[  2];
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	u32 start_ram		[  1];
-	u32 scripta0_ba		[  4];
-	u32 start_ram64		[  3];
-	u32 scripta0_ba64	[  3];
-	u32 scriptb0_ba64	[  6];
-	u32 ram_seg64		[  1];
-#endif
 };
 
 static struct SYM_FWA_SCR SYM_FWA_SCR = {
@@ -1944,51 +1936,5 @@
 	 */
 	SCR_INT,
 		99,
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-	/*
-	 *  We may use MEMORY MOVE instructions to load the on chip-RAM,
-	 *  if it happens that mapping PCI memory is not possible.
-	 *  But writing the RAM from the CPU is the preferred method, 
-	 *  since PCI 2.2 seems to disallow PCI self-mastering.
-	 */
-}/*-------------------------< START_RAM >------------------------*/,{
-	/*
-	 *  Load the script into on-chip RAM, 
-	 *  and jump to start point.
-	 */
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_JUMP,
-		PADDR_A (init),
-}/*-------------------------< START_RAM64 >----------------------*/,{
-	/*
-	 *  Load the RAM and start for 64 bit PCI (895A,896).
-	 *  Both scripts (script and scripth) are loaded into 
-	 *  the RAM which is 8K (4K for 825A/875/895).
-	 *  We also need to load some 32-63 bit segments 
-	 *  address of the SCRIPTS processor.
-	 *  LOAD/STORE ABSOLUTE always refers to on-chip RAM 
-	 *  in our implementation. The main memory is 
-	 *  accessed using LOAD/STORE DSA RELATIVE.
-	 */
-	SCR_LOAD_REL (mmws, 4),
-		offsetof (struct sym_hcb, scr_ram_seg),
-	SCR_COPY (sizeof(struct SYM_FWA_SCR)),
-}/*-------------------------< SCRIPTA0_BA64 >--------------------*/,{
-		0,
-		PADDR_A (start),
-	SCR_COPY (sizeof(struct SYM_FWB_SCR)),
-}/*-------------------------< SCRIPTB0_BA64 >--------------------*/,{
-		0,
-		PADDR_B  (start64),
-	SCR_LOAD_REL (mmrs, 4),
-		offsetof (struct sym_hcb, scr_ram_seg),
-	SCR_JUMP64,
-		PADDR_B (start64),
-}/*-------------------------< RAM_SEG64 >------------------------*/,{
-		0,
-#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
 }/*-------------------------<>-----------------------------------*/
 };
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c
--- a/drivers/scsi/sym53c8xx_2/sym_glue.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.c	Thu Jan  8 23:00:24 2004
@@ -167,34 +167,16 @@
 #define SYM_SCMD_PTR(ucmd) sym_que_entry(ucmd, struct scsi_cmnd, SCp)
 #define SYM_SOFTC_PTR(cmd) (((struct host_data *)cmd->device->host->hostdata)->ncb)
 
-/*
- *  Deal with DMA mapping/unmapping.
- */
-#define	bus_unmap_sg(pdev, sgptr, sgcnt, dir)		\
-	pci_unmap_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_unmap_single(pdev, mapping, bufptr, dir)	\
-	pci_unmap_single(pdev, mapping, bufptr, dir)
-#define	bus_map_single(pdev, bufptr, bufsiz, dir)	\
-	pci_map_single(pdev, bufptr, bufsiz, dir)
-#define	bus_map_sg(pdev, sgptr, sgcnt, dir)		\
-	pci_map_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_dma_sync_sg(pdev, sgptr, sgcnt, dir)	\
-	pci_dma_sync_sg(pdev, sgptr, sgcnt, dir)
-#define	bus_dma_sync_single(pdev, mapping, bufsiz, dir)	\
-	pci_dma_sync_single(pdev, mapping, bufsiz, dir)
-#define bus_sg_dma_address(sc)	sg_dma_address(sc)
-#define bus_sg_dma_len(sc)	sg_dma_len(sc)
-
 static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
 	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
-		bus_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+		pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 		break;
 	case 1:
-		bus_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
+		pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
 				 cmd->request_bufflen, dma_dir);
 		break;
 	}
@@ -206,7 +188,7 @@
 	dma_addr_t mapping;
 	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
-	mapping = bus_map_single(pdev, cmd->request_buffer,
+	mapping = pci_map_single(pdev, cmd->request_buffer,
 				 cmd->request_bufflen, dma_dir);
 	if (mapping) {
 		SYM_UCMD_PTR(cmd)->data_mapped  = 1;
@@ -221,7 +203,7 @@
 	int use_sg;
 	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 
-	use_sg = bus_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+	use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 	if (use_sg > 0) {
 		SYM_UCMD_PTR(cmd)->data_mapped  = 2;
 		SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
@@ -236,10 +218,10 @@
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
-		bus_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+		pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 		break;
 	case 1:
-		bus_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
+		pci_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
 				    cmd->request_bufflen, dma_dir);
 		break;
 	}
@@ -469,8 +451,8 @@
 		data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
 
 		for (segment = 0; segment < use_sg; segment++) {
-			dma_addr_t baddr = bus_sg_dma_address(&scatter[segment]);
-			unsigned int len = bus_sg_dma_len(&scatter[segment]);
+			dma_addr_t baddr = sg_dma_address(&scatter[segment]);
+			unsigned int len = sg_dma_len(&scatter[segment]);
 
 			sym_build_sge(np, &data[segment], baddr, len);
 			cp->data_len += len;
@@ -1595,10 +1577,8 @@
 	if (np->s.mmio_va)
 		iounmap(np->s.mmio_va);
 #endif
-#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
 	if (np->s.ram_va)
 		iounmap(np->s.ram_va);
-#endif
 	/*
 	 *  Free O/S independent resources.
 	 */
@@ -1650,14 +1630,13 @@
  *  If all is OK, install interrupt handling and
  *  start the timer daemon.
  */
-static int __devinit 
-sym_attach (struct scsi_host_template *tpnt, int unit, struct sym_device *dev)
+static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
+		int unit, struct sym_device *dev)
 {
 	struct host_data *host_data;
 	struct sym_hcb *np = NULL;
 	struct Scsi_Host *instance = NULL;
 	unsigned long flags;
-	struct sym_nvram *nvram = dev->nvram;
 	struct sym_fw *fw;
 
 	printk(KERN_INFO
@@ -1762,20 +1741,18 @@
 			np->ram_ws = 8192;
 		else
 			np->ram_ws = 4096;
-#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
 		np->s.ram_va = ioremap(dev->s.base_2_c, np->ram_ws);
 		if (!np->s.ram_va) {
 			printf_err("%s: can't map PCI MEMORY region\n",
 				sym_name(np));
 			goto attach_failed;
 		}
-#endif
 	}
 
 	/*
 	 *  Perform O/S independent stuff.
 	 */
-	if (sym_hcb_attach(np, fw, nvram))
+	if (sym_hcb_attach(np, fw, dev->nvram))
 		goto attach_failed;
 
 
@@ -1843,13 +1820,7 @@
 
 	spin_unlock_irqrestore(instance->host_lock, flags);
 
-	/*
-	 *  Now let the generic SCSI driver
-	 *  look for the SCSI devices on the bus ..
-	 */
-	scsi_add_host(instance, &dev->pdev->dev); /* XXX: handle failure */
-	scsi_scan_host(instance);
-	return 0;
+	return instance;
 
  reset_failed:
 	printf_err("%s: FATAL ERROR: CHECK SCSI BUS - CABLES, "
@@ -1857,13 +1828,13 @@
 	spin_unlock_irqrestore(instance->host_lock, flags);
  attach_failed:
 	if (!instance)
-		return -1;
+		return NULL;
 	printf_info("%s: giving up ...\n", sym_name(np));
 	if (np)
 		sym_free_resources(np);
 	scsi_host_put(instance);
 
-	return -1;
+	return NULL;
  }
 
 
@@ -2115,7 +2086,7 @@
 	 *  Ignore Symbios chips controlled by various RAID controllers.
 	 *  These controllers set value 0x52414944 at RAM end - 16.
 	 */
-#if defined(__i386__) && !defined(SYM_OPT_NO_BUS_MEMORY_MAPPING)
+#if defined(__i386__)
 	if (base_2_c) {
 		unsigned int ram_size, ram_val;
 		void *ram_ptr;
@@ -2202,12 +2173,9 @@
 
 
 /*
- *  Linux release module stuff.
- *
  *  Called before unloading the module.
  *  Detach the host.
  *  We have to free resources and halt the NCR chip.
- *
  */
 static int __devexit sym_detach(struct sym_hcb *np)
 {
@@ -2216,18 +2184,15 @@
 	del_timer_sync(&np->s.timer);
 
 	/*
-	 *  Reset NCR chip.
-	 *  We should use sym_soft_reset(), but we donnot want to do 
-	 *  so, since we may not be safe if interrupts occur.
+	 * Reset NCR chip.
+	 * We should use sym_soft_reset(), but we don't want to do 
+	 * so, since we may not be safe if interrupts occur.
 	 */
 	printk("%s: resetting chip\n", sym_name(np));
 	OUTB (nc_istat, SRST);
 	UDELAY (10);
 	OUTB (nc_istat, 0);
 
-	/*
-	 *  Free host resources
-	 */
 	sym_free_resources(np);
 
 	return 1;
@@ -2336,6 +2301,7 @@
 {
 	struct sym_device sym_dev;
 	struct sym_nvram nvram;
+	struct Scsi_Host *instance;
 
 	memset(&sym_dev, 0, sizeof(sym_dev));
 	memset(&nvram, 0, sizeof(nvram));
@@ -2354,12 +2320,20 @@
 
 	sym_get_nvram(&sym_dev, &nvram);
 
-	if (sym_attach(&sym2_template, attach_count, &sym_dev))
+	instance = sym_attach(&sym2_template, attach_count, &sym_dev);
+	if (!instance)
 		goto free;
 
+	if (scsi_add_host(instance, &pdev->dev))
+		goto detach;
+	scsi_scan_host(instance);
+
 	attach_count++;
+
 	return 0;
 
+ detach:
+	sym_detach(pci_get_drvdata(pdev));
  free:
 	pci_release_regions(pdev);
  disable:
@@ -2369,7 +2343,13 @@
 
 static void __devexit sym2_remove(struct pci_dev *pdev)
 {
-	sym_detach(pci_get_drvdata(pdev));
+	struct sym_hcb *np = pci_get_drvdata(pdev);
+	struct Scsi_Host *host = np->s.host;
+
+	scsi_remove_host(host);
+	scsi_host_put(host);
+
+	sym_detach(np);
 
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h
--- a/drivers/scsi/sym53c8xx_2/sym_glue.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.h	Thu Jan  8 23:00:24 2004
@@ -74,10 +74,6 @@
 #define bzero(d, n)	memset((d), 0, (n))
 #endif
 
-#ifndef bcmp
-#define bcmp(a, b, n)	memcmp((a), (b), (n))
-#endif
-
 /*
  *  General driver includes.
  */
@@ -96,7 +92,6 @@
 #define SYM_OPT_SNIFF_INQUIRY
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 #define	SYM_OPT_ANNOUNCE_TRANSFER_RATE
-#define	SYM_OPT_BUS_DMA_ABSTRACTION
 
 /*
  *  Print a message with severity.
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c
--- a/drivers/scsi/sym53c8xx_2/sym_hipd.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c	Thu Jan  8 23:00:23 2004
@@ -50,7 +50,7 @@
  * SUCH DAMAGE.
  */
 
-#define SYM_DRIVER_NAME	"sym-2.1.18b"
+#define SYM_DRIVER_NAME	"sym-2.1.18f"
 
 #ifdef __FreeBSD__
 #include <dev/sym/sym_glue.h>
@@ -751,8 +751,6 @@
 				&np->maxwide, &scsi_mode))
 		return period;
 
-	printk("scsi_mode = %d, period = %ld\n", scsi_mode, pdc_period);
-
 	if (scsi_mode >= 0) {
 		/* C3000 PDC reports period/mode */
 		SYM_SETUP_SCSI_DIFF = 0;
@@ -1962,13 +1960,6 @@
 		if (sym_verbose >= 2)
 			printf ("%s: Downloading SCSI SCRIPTS.\n",
 				sym_name(np));
-#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-		np->fw_patch(np);
-		if (np->ram_ws == 8192)
-			phys = SCRIPTZ_BA (np, start_ram64);
-		else
-			phys = SCRIPTZ_BA (np, start_ram);
-#else
 		if (np->ram_ws == 8192) {
 			OUTRAM_OFF(4096, np->scriptb0, np->scriptb_sz);
 			phys =  scr_to_cpu(np->scr_ram_seg);
@@ -1980,7 +1971,6 @@
 		else
 			phys = SCRIPTA_BA (np, init);
 		OUTRAM_OFF(0, np->scripta0, np->scripta_sz);
-#endif
 	}
 	else
 		phys = SCRIPTA_BA (np, init);
@@ -4151,8 +4141,10 @@
 	/*
 	 *  Check values against our limits.
 	 */
-	if (wide > np->maxwide)
-		{chg = 1; wide = np->maxwide;}
+	if (wide > np->maxwide) {
+		chg = 1;
+		wide = np->maxwide;
+	}
 	if (!wide || !(np->features & FE_ULTRA3))
 		dt &= ~PPR_OPT_DT;
 	if (req) {
@@ -4306,8 +4298,10 @@
 	/*
 	 *  Check values against our limits.
 	 */
-	if (wide > np->maxwide)
-		{chg = 1; wide = np->maxwide;}
+	if (wide > np->maxwide) {
+		chg = 1;
+		wide = np->maxwide;
+	}
 	if (req) {
 		if (wide > tp->tinfo.user.width)
 			{chg = 1; wide = tp->tinfo.user.width;}
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h
--- a/drivers/scsi/sym53c8xx_2/sym_hipd.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h	Thu Jan  8 23:00:23 2004
@@ -59,12 +59,6 @@
  *  They may be defined in platform specific headers, if they 
  *  are useful.
  *
- *    SYM_OPT_NO_BUS_MEMORY_MAPPING
- *        When this option is set, the driver will not load the 
- *        on-chip RAM using MMIO, but let the SCRIPTS processor 
- *        do the work using MOVE MEMORY instructions.
- *        (set for Linux/PPC)
- *
  *    SYM_OPT_HANDLE_DIR_UNKNOWN
  *        When this option is set, the SCRIPTS used by the driver 
  *        are able to handle SCSI transfers with direction not 
@@ -75,12 +69,6 @@
  *        When this option is set, the driver will use a queue per 
  *        device and handle QUEUE FULL status requeuing internally.
  *
- *    SYM_OPT_BUS_DMA_ABSTRACTION
- *        When this option is set, the driver allocator is responsible 
- *        of maintaining bus physical addresses and so provides virtual 
- *        to bus physical address translation of driver data structures.
- *        (set for FreeBSD-4 and Linux 2.3)
- *
  *    SYM_OPT_SNIFF_INQUIRY
  *        When this option is set, the driver sniff out successful 
  *        INQUIRY response and performs negotiations accordingly.
@@ -92,10 +80,8 @@
  *        (set for Linux)
  */
 #if 0
-#define SYM_OPT_NO_BUS_MEMORY_MAPPING
 #define SYM_OPT_HANDLE_DIR_UNKNOWN
 #define SYM_OPT_HANDLE_DEVICE_QUEUEING
-#define SYM_OPT_BUS_DMA_ABSTRACTION
 #define SYM_OPT_SNIFF_INQUIRY
 #define SYM_OPT_LIMIT_COMMAND_REORDERING
 #endif
@@ -958,9 +944,7 @@
 	/*
 	 *  DMA pool handle for this HBA.
 	 */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 	m_pool_ident_t	bus_dmat;
-#endif
 
 	/*
 	 *  O/S specific data structure
@@ -1133,9 +1117,20 @@
 /*
  *  NVRAM reading (sym_nvram.c).
  */
+#if SYM_CONF_NVRAM_SUPPORT
 void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram);
 void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp);
 int sym_read_nvram (sdev_p np, struct sym_nvram *nvp);
+#else
+static inline void sym_nvram_setup_host(hcb_p np, struct sym_nvram *nvram) { }
+static inline void sym_nvram_setup_target(hcb_p np, struct sym_nvram *nvram) { }
+static inline int sym_read_nvram(sdev_p np, struct sym_nvram *nvp)
+{
+	nvp->type = 0;
+	return 0;
+}
+#endif
+
 
 /*
  *  FIRMWARES (sym_fw.c)
@@ -1347,7 +1342,6 @@
  *  Virtual to bus physical translation for a given cluster.
  *  Such a structure is only useful with DMA abstraction.
  */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 typedef struct sym_m_vtob {	/* Virtual to Bus address translation */
 	struct sym_m_vtob *next;
 #ifdef	SYM_HAVE_M_SVTOB
@@ -1363,7 +1357,6 @@
 #define VTOB_HASH_MASK		(VTOB_HASH_SIZE-1)
 #define VTOB_HASH_CODE(m)	\
 	((((m_addr_t) (m)) >> SYM_MEM_CLUSTER_SHIFT) & VTOB_HASH_MASK)
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
 
 /*
  *  Memory pool of a given kind.
@@ -1375,7 +1368,6 @@
  *     method are expected to tell the driver about.
  */
 typedef struct sym_m_pool {
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 	m_pool_ident_t	dev_dmat;	/* Identifies the pool (see above) */
 	m_addr_t (*get_mem_cluster)(struct sym_m_pool *);
 #ifdef	SYM_MEM_FREE_UNUSED
@@ -1389,10 +1381,6 @@
 	int nump;
 	m_vtob_p vtob[VTOB_HASH_SIZE];
 	struct sym_m_pool *next;
-#else
-#define M_GET_MEM_CLUSTER()		sym_get_mem_cluster()
-#define M_FREE_MEM_CLUSTER(p)		sym_free_mem_cluster(p)
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
 	struct sym_m_link h[SYM_MEM_CLUSTER_SHIFT - SYM_MEM_SHIFT + 1];
 } *m_pool_p;
 
@@ -1406,12 +1394,10 @@
  *  Alloc, free and translate addresses to bus physical 
  *  for DMAable memory.
  */
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 void *__sym_calloc_dma_unlocked(m_pool_ident_t dev_dmat, int size, char *name);
 void 
 __sym_mfree_dma_unlocked(m_pool_ident_t dev_dmat, void *m,int size, char *name);
 u32 __vtobus_unlocked(m_pool_ident_t dev_dmat, void *m);
-#endif
 
 /*
  * Verbs used by the driver code for DMAable memory handling.
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_malloc.c b/drivers/scsi/sym53c8xx_2/sym_malloc.c
--- a/drivers/scsi/sym53c8xx_2/sym_malloc.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_malloc.c	Thu Jan  8 23:00:24 2004
@@ -204,18 +204,9 @@
 /*
  *  Default memory pool we donnot need to involve in DMA.
  *
- *  If DMA abtraction is not needed, the generic allocator 
- *  calls directly some kernel allocator.
- *
  *  With DMA abstraction, we use functions (methods), to 
  *  distinguish between non DMAable memory and DMAable memory.
  */
-#ifndef	SYM_OPT_BUS_DMA_ABSTRACTION
-
-static struct sym_m_pool mp0;
-
-#else
-
 static m_addr_t ___mp0_get_mem_cluster(m_pool_p mp)
 {
 	m_addr_t m = (m_addr_t) sym_get_mem_cluster();
@@ -240,8 +231,6 @@
 	{0, ___mp0_get_mem_cluster};
 #endif
 
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
-
 /*
  * Actual memory allocation routine for non-DMAed memory.
  */
@@ -260,7 +249,6 @@
 	__sym_mfree(&mp0, ptr, size, name);
 }
 
-#ifdef	SYM_OPT_BUS_DMA_ABSTRACTION
 /*
  *  Methods that maintains DMAable pools according to user allocations.
  *  New pools are created on the fly when a new pool id is provided.
@@ -417,5 +405,3 @@
 		panic("sym: VTOBUS FAILED!\n");
 	return (u32)(vp ? vp->baddr + (((m_addr_t) m) - a) : 0);
 }
-
-#endif	/* SYM_OPT_BUS_DMA_ABSTRACTION */
diff -Nru a/drivers/scsi/sym53c8xx_2/sym_nvram.c b/drivers/scsi/sym53c8xx_2/sym_nvram.c
--- a/drivers/scsi/sym53c8xx_2/sym_nvram.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/sym53c8xx_2/sym_nvram.c	Thu Jan  8 23:00:24 2004
@@ -59,25 +59,22 @@
 /*
  *  Some poor and bogus sync table that refers to Tekram NVRAM layout.
  */
-#if SYM_CONF_NVRAM_SUPPORT
 static u_char Tekram_sync[16] =
 	{25,31,37,43, 50,62,75,125, 12,15,18,21, 6,7,9,10};
 #ifdef	SYM_CONF_DEBUG_NVRAM
 static u_char Tekram_boot_delay[7] = {3, 5, 10, 20, 30, 60, 120};
 #endif
-#endif
 
 /*
  *  Get host setup from NVRAM.
  */
-void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram)
+void sym_nvram_setup_host(struct sym_hcb *np, struct sym_nvram *nvram)
 {
-#if SYM_CONF_NVRAM_SUPPORT
 	/*
 	 *  Get parity checking, host ID, verbose mode 
 	 *  and miscellaneous host flags from NVRAM.
 	 */
-	switch(nvram->type) {
+	switch (nvram->type) {
 	case SYM_SYMBIOS_NVRAM:
 		if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE))
 			np->rv_scntl0  &= ~0x0a;
@@ -95,41 +92,15 @@
 	default:
 		break;
 	}
-#endif
-}
-
-/*
- *  Get target setup from NVRAM.
- */
-#if SYM_CONF_NVRAM_SUPPORT
-static void sym_Symbios_setup_target(hcb_p np,int target, Symbios_nvram *nvram);
-static void sym_Tekram_setup_target(hcb_p np,int target, Tekram_nvram *nvram);
-#endif
-
-void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp)
-{
-#if SYM_CONF_NVRAM_SUPPORT
-	switch(nvp->type) {
-	case SYM_SYMBIOS_NVRAM:
-		sym_Symbios_setup_target (np, target, &nvp->data.Symbios);
-		break;
-	case SYM_TEKRAM_NVRAM:
-		sym_Tekram_setup_target (np, target, &nvp->data.Tekram);
-		break;
-	default:
-		break;
-	}
-#endif
 }
 
-#if SYM_CONF_NVRAM_SUPPORT
 /*
  *  Get target set-up from Symbios format NVRAM.
  */
 static void
-sym_Symbios_setup_target(hcb_p np, int target, Symbios_nvram *nvram)
+sym_Symbios_setup_target(struct sym_hcb *np, int target, Symbios_nvram *nvram)
 {
-	tcb_p tp = &np->target[target];
+	struct sym_tcb *tp = &np->target[target];
 	Symbios_target *tn = &nvram->target[target];
 
 	tp->tinfo.user.period = tn->sync_period ? (tn->sync_period + 3) / 4 : 0;
@@ -149,9 +120,9 @@
  *  Get target set-up from Tekram format NVRAM.
  */
 static void
-sym_Tekram_setup_target(hcb_p np, int target, Tekram_nvram *nvram)
+sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram)
 {
-	tcb_p tp = &np->target[target];
+	struct sym_tcb *tp = &np->target[target];
 	struct Tekram_target *tn = &nvram->target[target];
 	int i;
 
@@ -160,8 +131,8 @@
 		tp->tinfo.user.period = Tekram_sync[i];
 	}
 
-	tp->tinfo.user.width =
-		(tn->flags & TEKRAM_WIDE_NEGO) ? BUS_16_BIT : BUS_8_BIT;
+	tp->tinfo.user.width = (tn->flags & TEKRAM_WIDE_NEGO) ?
+		BUS_16_BIT : BUS_8_BIT;
 
 	if (tn->flags & TEKRAM_TAGGED_COMMANDS) {
 		tp->usrtags = 2 << nvram->max_tags_index;
@@ -175,11 +146,28 @@
 		np->rv_scntl0  &= ~0x0a; /* SCSI parity checking disabled */
 }
 
+/*
+ *  Get target setup from NVRAM.
+ */
+void sym_nvram_setup_target(struct sym_hcb *np, int target, struct sym_nvram *nvp)
+{
+	switch (nvp->type) {
+	case SYM_SYMBIOS_NVRAM:
+		sym_Symbios_setup_target(np, target, &nvp->data.Symbios);
+		break;
+	case SYM_TEKRAM_NVRAM:
+		sym_Tekram_setup_target(np, target, &nvp->data.Tekram);
+		break;
+	default:
+		break;
+	}
+}
+
 #ifdef	SYM_CONF_DEBUG_NVRAM
 /*
  *  Dump Symbios format NVRAM for debugging purpose.
  */
-static void sym_display_Symbios_nvram(sdev_p np, Symbios_nvram *nvram)
+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
 {
 	int i;
 
@@ -211,7 +199,7 @@
 /*
  *  Dump TEKRAM format NVRAM for debugging purpose.
  */
-static void sym_display_Tekram_nvram(sdev_p np, Tekram_nvram *nvram)
+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram)
 {
 	int i, tags, boot_delay;
 	char *rem;
@@ -221,7 +209,7 @@
 	boot_delay = 0;
 	if (nvram->boot_delay_index < 6)
 		boot_delay = Tekram_boot_delay[nvram->boot_delay_index];
-	switch((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
+	switch ((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
 	default:
 	case 0:	rem = "";			break;
 	case 1: rem = " REMOVABLE=boot device";	break;
@@ -257,49 +245,12 @@
 		sync);
 	}
 }
-#endif	/* SYM_CONF_DEBUG_NVRAM */
-#endif	/* SYM_CONF_NVRAM_SUPPORT */
-
-
-/*
- *  Try reading Symbios or Tekram NVRAM
- */
-#if SYM_CONF_NVRAM_SUPPORT
-static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram);
-static int sym_read_Tekram_nvram  (sdev_p np, Tekram_nvram *nvram);
-#endif
-
-int sym_read_nvram (sdev_p np, struct sym_nvram *nvp)
-{
-#if SYM_CONF_NVRAM_SUPPORT
-	/*
-	 *  Try to read SYMBIOS nvram.
-	 *  Try to read TEKRAM nvram if Symbios nvram not found.
-	 */
-	if	(SYM_SETUP_SYMBIOS_NVRAM &&
-		 !sym_read_Symbios_nvram (np, &nvp->data.Symbios)) {
-		nvp->type = SYM_SYMBIOS_NVRAM;
-#ifdef SYM_CONF_DEBUG_NVRAM
-		sym_display_Symbios_nvram(np, &nvp->data.Symbios);
-#endif
-	}
-	else if	(SYM_SETUP_TEKRAM_NVRAM &&
-		 !sym_read_Tekram_nvram (np, &nvp->data.Tekram)) {
-		nvp->type = SYM_TEKRAM_NVRAM;
-#ifdef SYM_CONF_DEBUG_NVRAM
-		sym_display_Tekram_nvram(np, &nvp->data.Tekram);
-#endif
-	}
-	else
-		nvp->type = 0;
 #else
-	nvp->type = 0;
-#endif
-	return nvp->type;
-}
+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram) { }
+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram) { }
+#endif	/* SYM_CONF_DEBUG_NVRAM */
 
 
-#if SYM_CONF_NVRAM_SUPPORT
 /*
  *  24C16 EEPROM reading.
  *
@@ -316,11 +267,11 @@
 /*
  *  Set/clear data/clock bit in GPIO0
  */
-static void S24C16_set_bit(sdev_p np, u_char write_bit, u_char *gpreg, 
+static void S24C16_set_bit(struct sym_device *np, u_char write_bit, u_char *gpreg, 
 			  int bit_mode)
 {
 	UDELAY (5);
-	switch (bit_mode){
+	switch (bit_mode) {
 	case SET_BIT:
 		*gpreg |= write_bit;
 		break;
@@ -342,7 +293,7 @@
 /*
  *  Send START condition to NVRAM to wake it up.
  */
-static void S24C16_start(sdev_p np, u_char *gpreg)
+static void S24C16_start(struct sym_device *np, u_char *gpreg)
 {
 	S24C16_set_bit(np, 1, gpreg, SET_BIT);
 	S24C16_set_bit(np, 0, gpreg, SET_CLK);
@@ -353,7 +304,7 @@
 /*
  *  Send STOP condition to NVRAM - puts NVRAM to sleep... ZZzzzz!!
  */
-static void S24C16_stop(sdev_p np, u_char *gpreg)
+static void S24C16_stop(struct sym_device *np, u_char *gpreg)
 {
 	S24C16_set_bit(np, 0, gpreg, SET_CLK);
 	S24C16_set_bit(np, 1, gpreg, SET_BIT);
@@ -363,7 +314,7 @@
  *  Read or write a bit to the NVRAM,
  *  read if GPIO0 input else write if GPIO0 output
  */
-static void S24C16_do_bit(sdev_p np, u_char *read_bit, u_char write_bit, 
+static void S24C16_do_bit(struct sym_device *np, u_char *read_bit, u_char write_bit, 
 			 u_char *gpreg)
 {
 	S24C16_set_bit(np, write_bit, gpreg, SET_BIT);
@@ -378,7 +329,7 @@
  *  Output an ACK to the NVRAM after reading,
  *  change GPIO0 to output and when done back to an input
  */
-static void S24C16_write_ack(sdev_p np, u_char write_bit, u_char *gpreg, 
+static void S24C16_write_ack(struct sym_device *np, u_char write_bit, u_char *gpreg, 
 			    u_char *gpcntl)
 {
 	OUTB (nc_gpcntl, *gpcntl & 0xfe);
@@ -390,7 +341,7 @@
  *  Input an ACK from NVRAM after writing,
  *  change GPIO0 to input and when done back to an output
  */
-static void S24C16_read_ack(sdev_p np, u_char *read_bit, u_char *gpreg, 
+static void S24C16_read_ack(struct sym_device *np, u_char *read_bit, u_char *gpreg, 
 			   u_char *gpcntl)
 {
 	OUTB (nc_gpcntl, *gpcntl | 0x01);
@@ -402,7 +353,7 @@
  *  WRITE a byte to the NVRAM and then get an ACK to see it was accepted OK,
  *  GPIO0 must already be set as an output
  */
-static void S24C16_write_byte(sdev_p np, u_char *ack_data, u_char write_data, 
+static void S24C16_write_byte(struct sym_device *np, u_char *ack_data, u_char write_data, 
 			     u_char *gpreg, u_char *gpcntl)
 {
 	int x;
@@ -417,7 +368,7 @@
  *  READ a byte from the NVRAM and then send an ACK to say we have got it,
  *  GPIO0 must already be set as an input
  */
-static void S24C16_read_byte(sdev_p np, u_char *read_data, u_char ack_data, 
+static void S24C16_read_byte(struct sym_device *np, u_char *read_data, u_char ack_data, 
 			    u_char *gpreg, u_char *gpcntl)
 {
 	int x;
@@ -435,7 +386,7 @@
 /*
  *  Read 'len' bytes starting at 'offset'.
  */
-static int sym_read_S24C16_nvram (sdev_p np, int offset, u_char *data, int len)
+static int sym_read_S24C16_nvram(struct sym_device *np, int offset, u_char *data, int len)
 {
 	u_char	gpcntl, gpreg;
 	u_char	old_gpcntl, old_gpreg;
@@ -514,7 +465,7 @@
  *  Try reading Symbios NVRAM.
  *  Return 0 if OK.
  */
-static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram)
+static int sym_read_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
 {
 	static u_char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0};
 	u_char *data = (u_char *) nvram;
@@ -528,7 +479,7 @@
 
 	/* check valid NVRAM signature, verify byte count and checksum */
 	if (nvram->type != 0 ||
-	    bcmp(nvram->trailer, Symbios_trailer, 6) ||
+	    memcmp(nvram->trailer, Symbios_trailer, 6) ||
 	    nvram->byte_count != len - 12)
 		return 1;
 
@@ -555,7 +506,7 @@
 /*
  *  Pulse clock bit in GPIO0
  */
-static void T93C46_Clk(sdev_p np, u_char *gpreg)
+static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
 {
 	OUTB (nc_gpreg, *gpreg | 0x04);
 	UDELAY (2);
@@ -565,7 +516,7 @@
 /* 
  *  Read bit from NVRAM
  */
-static void T93C46_Read_Bit(sdev_p np, u_char *read_bit, u_char *gpreg)
+static void T93C46_Read_Bit(struct sym_device *np, u_char *read_bit, u_char *gpreg)
 {
 	UDELAY (2);
 	T93C46_Clk(np, gpreg);
@@ -575,7 +526,7 @@
 /*
  *  Write bit to GPIO0
  */
-static void T93C46_Write_Bit(sdev_p np, u_char write_bit, u_char *gpreg)
+static void T93C46_Write_Bit(struct sym_device *np, u_char write_bit, u_char *gpreg)
 {
 	if (write_bit & 0x01)
 		*gpreg |= 0x02;
@@ -593,7 +544,7 @@
 /*
  *  Send STOP condition to NVRAM - puts NVRAM to sleep... ZZZzzz!!
  */
-static void T93C46_Stop(sdev_p np, u_char *gpreg)
+static void T93C46_Stop(struct sym_device *np, u_char *gpreg)
 {
 	*gpreg &= 0xef;
 	OUTB (nc_gpreg, *gpreg);
@@ -605,7 +556,7 @@
 /*
  *  Send read command and address to NVRAM
  */
-static void T93C46_Send_Command(sdev_p np, u_short write_data, 
+static void T93C46_Send_Command(struct sym_device *np, u_short write_data, 
 				u_char *read_bit, u_char *gpreg)
 {
 	int x;
@@ -620,7 +571,8 @@
 /*
  *  READ 2 bytes from the NVRAM
  */
-static void T93C46_Read_Word(sdev_p np, u_short *nvram_data, u_char *gpreg)
+static void T93C46_Read_Word(struct sym_device *np,
+		unsigned short *nvram_data, unsigned char *gpreg)
 {
 	int x;
 	u_char read_bit;
@@ -639,13 +591,13 @@
 /*
  *  Read Tekram NvRAM data.
  */
-static int T93C46_Read_Data(sdev_p np, u_short *data,int len,u_char *gpreg)
+static int T93C46_Read_Data(struct sym_device *np, unsigned short *data,
+		int len, unsigned char *gpreg)
 {
-	u_char	read_bit;
-	int	x;
+	int x;
 
 	for (x = 0; x < len; x++)  {
-
+		unsigned char read_bit;
 		/* output read command and address */
 		T93C46_Send_Command(np, 0x180 | x, &read_bit, gpreg);
 		if (read_bit & 0x01)
@@ -660,7 +612,7 @@
 /*
  *  Try reading 93C46 Tekram NVRAM.
  */
-static int sym_read_T93C46_nvram (sdev_p np, Tekram_nvram *nvram)
+static int sym_read_T93C46_nvram(struct sym_device *np, Tekram_nvram *nvram)
 {
 	u_char gpcntl, gpreg;
 	u_char old_gpcntl, old_gpreg;
@@ -692,7 +644,7 @@
  *  Try reading Tekram NVRAM.
  *  Return 0 if OK.
  */
-static int sym_read_Tekram_nvram (sdev_p np, Tekram_nvram *nvram)
+static int sym_read_Tekram_nvram (struct sym_device *np, Tekram_nvram *nvram)
 {
 	u_char *data = (u_char *) nvram;
 	int len = sizeof(*nvram);
@@ -700,13 +652,13 @@
 	int x;
 
 	switch (np->device_id) {
-	case PCI_ID_SYM53C885:
-	case PCI_ID_SYM53C895:
-	case PCI_ID_SYM53C896:
+	case PCI_DEVICE_ID_NCR_53C885:
+	case PCI_DEVICE_ID_NCR_53C895:
+	case PCI_DEVICE_ID_NCR_53C896:
 		x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
 					  data, len);
 		break;
-	case PCI_ID_SYM53C875:
+	case PCI_DEVICE_ID_NCR_53C875:
 		x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
 					  data, len);
 		if (!x)
@@ -727,4 +679,19 @@
 	return 0;
 }
 
-#endif	/* SYM_CONF_NVRAM_SUPPORT */
+/*
+ *  Try reading Symbios or Tekram NVRAM
+ */
+int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp)
+{
+	if (!sym_read_Symbios_nvram(np, &nvp->data.Symbios)) {
+		nvp->type = SYM_SYMBIOS_NVRAM;
+		sym_display_Symbios_nvram(np, &nvp->data.Symbios);
+	} else if (!sym_read_Tekram_nvram(np, &nvp->data.Tekram)) {
+		nvp->type = SYM_TEKRAM_NVRAM;
+		sym_display_Tekram_nvram(np, &nvp->data.Tekram);
+	} else {
+		nvp->type = 0;
+	}
+	return nvp->type;
+}
diff -Nru a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c
--- a/drivers/scsi/tmscsim.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/tmscsim.c	Thu Jan  8 23:00:24 2004
@@ -165,6 +165,9 @@
  * 				2.4 PCI device table (Thx to A.Richter)	*
  *	2.0e7 00/11/28	KG	Allow overriding of BIOS settings	*
  *	2.0f  00/12/20	KG	Handle failed INQUIRYs during scan	*
+ *	2.1a  03/11/29  GL, KG	Initial fixing for 2.6. Convert to	*
+ *				use the current PCI-mapping API, update	*
+ *				command-queuing.			*
  ***********************************************************************/
 
 /* Uncomment SA_INTERRUPT, if the driver refuses to share its IRQ with other devices */
@@ -178,33 +181,36 @@
 //#define DC390_REMOVABLEDEBUG
 //#define DC390_LOCKDEBUG
 
+//#define NOP do{}while(0)
+#define C_NOP
+
 /* Debug definitions */
 #ifdef DC390_DEBUG0
-# define DEBUG0(x) x;
+# define DEBUG0(x) x
 #else
-# define DEBUG0(x)
+# define DEBUG0(x) C_NOP
 #endif
 #ifdef DC390_DEBUG1
-# define DEBUG1(x) x;
+# define DEBUG1(x) x
 #else
-# define DEBUG1(x)
+# define DEBUG1(x) C_NOP
 #endif
 #ifdef DC390_DCBDEBUG
-# define DCBDEBUG(x) x;
+# define DCBDEBUG(x) x
 #else
-# define DCBDEBUG(x)
+# define DCBDEBUG(x) C_NOP
 #endif
 #ifdef DC390_PARSEDEBUG
-# define PARSEDEBUG(x) x;
+# define PARSEDEBUG(x) x
 #else
-# define PARSEDEBUG(x)
+# define PARSEDEBUG(x) C_NOP
 #endif
 #ifdef DC390_REMOVABLEDEBUG
-# define REMOVABLEDEBUG(x) x;
+# define REMOVABLEDEBUG(x) x
 #else
-# define REMOVABLEDEBUG(x)
+# define REMOVABLEDEBUG(x) C_NOP
 #endif
-#define DCBDEBUG1(x)
+#define DCBDEBUG1(x) C_NOP
 
 /* Includes */
 #include <linux/module.h>
@@ -226,6 +232,7 @@
 #include <linux/version.h>
 #include <linux/blkdev.h>
 #include <linux/timer.h>
+#include <linux/interrupt.h>
 
 #include "scsi.h"
 #include "hosts.h"
@@ -262,18 +269,7 @@
 #endif
 #endif
 
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,93) 
-# define USE_SPINLOCKS 1
-# define NEW_PCI 1
-#else
-# undef NEW_PCI
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,30)
-#  define USE_SPINLOCKS 2
-# endif
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,99)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,99) && defined(MODULE)
 static struct pci_device_id tmscsim_pci_tbl[] = {
 	{
 		.vendor		= PCI_VENDOR_ID_AMD,
@@ -286,143 +282,42 @@
 MODULE_DEVICE_TABLE(pci, tmscsim_pci_tbl);
 #endif
 	
-#ifdef USE_SPINLOCKS
-
-# if USE_SPINLOCKS == 3 /* both */
-
-#  if defined (CONFIG_SMP)
-#   define DC390_LOCKA_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; };
-#  else
-#   define DC390_LOCKA_INIT
-#  endif
-   spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED;
-
-#  define DC390_AFLAGS unsigned long aflags;
-#  define DC390_IFLAGS unsigned long iflags;
-#  define DC390_DFLAGS unsigned long dflags; 
-
-#  define DC390_LOCK_IO spin_lock_irqsave (((struct Scsi_Host *)dev)->host_lock, iflags)
-#  define DC390_UNLOCK_IO spin_unlock_irqrestore (((struct Scsi_Host *)dev)->host_lock, iflags)
-
-#  define DC390_LOCK_DRV spin_lock_irqsave (&dc390_drvlock, dflags)
-#  define DC390_UNLOCK_DRV spin_unlock_irqrestore (&dc390_drvlock, dflags)
-#  define DC390_LOCK_DRV_NI spin_lock (&dc390_drvlock)
-#  define DC390_UNLOCK_DRV_NI spin_unlock (&dc390_drvlock)
-
-#  define DC390_LOCK_ACB spin_lock_irqsave (&(pACB->lock), aflags)
-#  define DC390_UNLOCK_ACB spin_unlock_irqrestore (&(pACB->lock), aflags)
-#  define DC390_LOCK_ACB_NI spin_lock (&(pACB->lock))
-#  define DC390_UNLOCK_ACB_NI spin_unlock (&(pACB->lock))
-//#  define DC390_LOCKA_INIT spin_lock_init (&(pACB->lock))
-
-# else
-
-#  if USE_SPINLOCKS == 2 /* adapter specific locks */
-
-#   if defined (CONFIG_SMP)
-#    define DC390_LOCKA_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; };
-#   else
-#    define DC390_LOCKA_INIT
-#   endif
-    spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED;
-#   define DC390_AFLAGS unsigned long aflags;
-#   define DC390_IFLAGS 
-#  define DC390_DFLAGS unsigned long dflags; 
-#   define DC390_LOCK_IO(dev) /* spin_lock_irqsave (&io_request_lock, iflags) */
-#   define DC390_UNLOCK_IO(dev) /* spin_unlock_irqrestore (&io_request_lock, iflags) */
-#   define DC390_LOCK_DRV spin_lock_irqsave (&dc390_drvlock, dflags)
-#   define DC390_UNLOCK_DRV spin_unlock_irqrestore (&dc390_drvlock, dflags)
-#   define DC390_LOCK_DRV_NI spin_lock (&dc390_drvlock)
-#   define DC390_UNLOCK_DRV_NI spin_unlock (&dc390_drvlock)
-#   define DC390_LOCK_ACB spin_lock_irqsave (&(pACB->lock), aflags)
-#   define DC390_UNLOCK_ACB spin_unlock_irqrestore (&(pACB->lock), aflags)
-#   define DC390_LOCK_ACB_NI spin_lock (&(pACB->lock))
-#   define DC390_UNLOCK_ACB_NI spin_unlock (&(pACB->lock))
-//#   define DC390_LOCKA_INIT spin_lock_init (&(pACB->lock))
-
-#  else /* USE_SPINLOCKS == 1: global lock io_request_lock */
-
-#   define DC390_AFLAGS 
-#   define DC390_IFLAGS unsigned long iflags;
-#   define DC390_DFLAGS unsigned long dflags; 
-    spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED;
-#   define DC390_LOCK_IO(dev) spin_lock_irqsave (((struct Scsi_Host *)dev)->host_lock, iflags)
-#   define DC390_UNLOCK_IO(dev) spin_unlock_irqrestore (((struct Scsi_Host *)dev)->host_lock, iflags)
-#   define DC390_LOCK_DRV spin_lock_irqsave (&dc390_drvlock, dflags)
-#   define DC390_UNLOCK_DRV spin_unlock_irqrestore (&dc390_drvlock, dflags)
-#   define DC390_LOCK_DRV_NI spin_lock (&dc390_drvlock)
-#   define DC390_UNLOCK_DRV_NI spin_unlock (&dc390_drvlock)
-#   define DC390_LOCK_ACB /* DC390_LOCK_IO */
-#   define DC390_UNLOCK_ACB /* DC390_UNLOCK_IO */
-#   define DC390_LOCK_ACB_NI /* spin_lock (&(pACB->lock)) */
-#   define DC390_UNLOCK_ACB_NI /* spin_unlock (&(pACB->lock)) */
-#   define DC390_LOCKA_INIT /* DC390_LOCKA_INIT */
-
-#  endif /* 2 */
-# endif /* 3 */
-
-#else /* USE_SPINLOCKS undefined */
-
-# define DC390_AFLAGS unsigned long aflags;
-# define DC390_IFLAGS unsigned long iflags;
-# define DC390_DFLAGS unsigned long dflags; 
-# define DC390_LOCK_IO save_flags (iflags); cli ()
-# define DC390_UNLOCK_IO restore_flags (iflags)
-# define DC390_LOCK_DRV save_flags (dflags); cli ()
-# define DC390_UNLOCK_DRV restore_flags (dflags)
-# define DC390_LOCK_DRV_NI
-# define DC390_UNLOCK_DRV_NI
-# define DC390_LOCK_ACB save_flags (aflags); cli ()
-# define DC390_UNLOCK_ACB restore_flags (aflags)
-# define DC390_LOCK_ACB_NI
-# define DC390_UNLOCK_ACB_NI
-# define DC390_LOCKA_INIT
-#endif /* def */
+#define USE_SPINLOCKS 1
+#define NEW_PCI 1
 
+#define DC390_AFLAGS 
+#define DC390_IFLAGS unsigned long iflags
+#define DC390_DFLAGS unsigned long dflags
+spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED;
+#define DC390_LOCK_IO(dev) spin_lock_irqsave (((struct Scsi_Host *)dev)->host_lock, iflags)
+#define DC390_UNLOCK_IO(dev) spin_unlock_irqrestore (((struct Scsi_Host *)dev)->host_lock, iflags)
+#define DC390_LOCK_DRV spin_lock_irqsave (&dc390_drvlock, dflags)
+#define DC390_UNLOCK_DRV spin_unlock_irqrestore (&dc390_drvlock, dflags)
+#define DC390_LOCK_DRV_NI spin_lock (&dc390_drvlock)
+#define DC390_UNLOCK_DRV_NI spin_unlock (&dc390_drvlock)
+#define DC390_LOCK_ACB /* DC390_LOCK_IO */
+#define DC390_UNLOCK_ACB /* DC390_UNLOCK_IO */
+#define DC390_LOCK_ACB_NI /* spin_lock (&(pACB->lock)) */
+#define DC390_UNLOCK_ACB_NI /* spin_unlock (&(pACB->lock)) */
+#define DC390_LOCKA_INIT /* DC390_LOCKA_INIT */
 
 /* These macros are used for uniform access to 2.0.x and 2.1.x PCI config space*/
 
-#ifdef NEW_PCI
-# define PDEV pdev
-# define PDEVDECL struct pci_dev *pdev
-# define PDEVDECL0 struct pci_dev *pdev = NULL
-# define PDEVDECL1 struct pci_dev *pdev
-# define PDEVSET pACB->pdev=pdev
-# define PDEVSET1 pdev=pACB->pdev
-# define PCI_WRITE_CONFIG_BYTE(pd, rv, bv) pci_write_config_byte (pd, rv, bv)
-# define PCI_READ_CONFIG_BYTE(pd, rv, bv) pci_read_config_byte (pd, rv, bv)
-# define PCI_WRITE_CONFIG_WORD(pd, rv, bv) pci_write_config_word (pd, rv, bv)
-# define PCI_READ_CONFIG_WORD(pd, rv, bv) pci_read_config_word (pd, rv, bv)
-# define PCI_BUS_DEV pdev->bus->number, pdev->devfn
-# define PCI_PRESENT (1)
-# define PCI_SET_MASTER pci_set_master (pdev)
-# define PCI_FIND_DEVICE(vend, id) (pdev = pci_find_device (vend, id, pdev))
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,10)
-# define PCI_GET_IO_AND_IRQ io_port = pci_resource_start (pdev, 0); irq = pdev->irq
-#else
-# define PCI_GET_IO_AND_IRQ io_port = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; irq = pdev->irq
-#endif
-#else
-# include <linux/bios32.h>
-# define PDEV pbus, pdevfn
-# define PDEVDECL UCHAR pbus, UCHAR pdevfn
-# define PDEVDECL0 UCHAR pbus = 0; UCHAR pdevfn = 0; USHORT pci_index = 0; int error
-# define PDEVDECL1 UCHAR pbus; UCHAR pdevfn /*; USHORT pci_index */
-# define PDEVSET pACB->pbus=pbus; pACB->pdevfn=pdevfn /*; pACB->pci_index=pci_index */
-# define PDEVSET1 pbus=pACB->pbus; pdevfn=pACB->pdevfn /*; pci_index=pACB->pci_index */
-# define PCI_WRITE_CONFIG_BYTE(pd, rv, bv) pcibios_write_config_byte (pd, rv, bv)
-# define PCI_READ_CONFIG_BYTE(pd, rv, bv) pcibios_read_config_byte (pd, rv, bv)
-# define PCI_WRITE_CONFIG_WORD(pd, rv, bv) pcibios_write_config_word (pd, rv, bv)
-# define PCI_READ_CONFIG_WORD(pd, rv, bv) pcibios_read_config_word (pd, rv, bv)
-# define PCI_BUS_DEV pbus, pdevfn
-# define PCI_PRESENT pcibios_present ()
-# define PCI_SET_MASTER dc390_set_master (pbus, pdevfn)
-# define PCI_FIND_DEVICE(vend, id) (!pcibios_find_device (vend, id, pci_index++, &pbus, &pdevfn))
-# define PCI_GET_IO_AND_IRQ error = pcibios_read_config_dword (pbus, pdevfn, PCI_BASE_ADDRESS_0, &io_port);	\
- error |= pcibios_read_config_byte (pbus, pdevfn, PCI_INTERRUPT_LINE, &irq);	\
- io_port &= 0xfffe;	\
- if (error) { printk (KERN_ERR "DC390_detect: Error reading PCI config registers!\n"); continue; }
-#endif 
+#define PDEV pdev
+#define PDEVDECL struct pci_dev *pdev
+#define PDEVDECL0 struct pci_dev *pdev = NULL
+#define PDEVDECL1 struct pci_dev *pdev
+#define PDEVSET pACB->pdev=pdev
+#define PDEVSET1 pdev=pACB->pdev
+#define PCI_WRITE_CONFIG_BYTE(pd, rv, bv) pci_write_config_byte (pd, rv, bv)
+#define PCI_READ_CONFIG_BYTE(pd, rv, bv) pci_read_config_byte (pd, rv, bv)
+#define PCI_WRITE_CONFIG_WORD(pd, rv, bv) pci_write_config_word (pd, rv, bv)
+#define PCI_READ_CONFIG_WORD(pd, rv, bv) pci_read_config_word (pd, rv, bv)
+#define PCI_BUS_DEV pdev->bus->number, pdev->devfn
+#define PCI_PRESENT (1)
+#define PCI_SET_MASTER pci_set_master (pdev)
+#define PCI_FIND_DEVICE(vend, id) (pdev = pci_find_device (vend, id, pdev))
+#define PCI_GET_IO_AND_IRQ do{io_port = pci_resource_start (pdev, 0); irq = pdev->irq;} while(0)
 
 #include "tmscsim.h"
 
@@ -457,16 +352,14 @@
 static void __inline__ dc390_InvalidCmd( PACB pACB );
 static void __inline__ dc390_EnableMsgOut_Abort (PACB, PSRB);
 static void dc390_remove_dev (PACB pACB, PDCB pDCB);
-void do_DC390_Interrupt( int, void *, struct pt_regs *);
+irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
 
 int    dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
 void   dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
 void   dc390_updateDCB (PACB pACB, PDCB pDCB);
 
-#ifdef MODULE
- static int DC390_release(struct Scsi_Host *host);
- static int dc390_shutdown (struct Scsi_Host *host);
-#endif
+static int DC390_release(struct Scsi_Host *host);
+static int dc390_shutdown (struct Scsi_Host *host);
 
 
 //static PSHT	dc390_pSHT_start = NULL;
@@ -609,7 +502,7 @@
 		ptr[id<<2] = (UCHAR)tmscsim[2];		/* EE_MODE1 */
 	if (tmscsim[1] != -2)
 		ptr[(id<<2) + 1] = (UCHAR)tmscsim[1];	/* EE_Speed */
-    };
+    }
 }
 
 /* Handle "-1" case */
@@ -641,7 +534,7 @@
 {
 	int i;
 	PARSEDEBUG(printk(KERN_INFO "DC390: setup %08x %08x %08x %08x %08x %08x\n", tmscsim[0],\
-		      tmscsim[1], tmscsim[2], tmscsim[3], tmscsim[4], tmscsim[5]);)
+			  tmscsim[1], tmscsim[2], tmscsim[3], tmscsim[4], tmscsim[5]));
 	for (i = 0; i < 6; i++)
 	{
 		if (tmscsim[i] < 0 || tmscsim[i] > 255)
@@ -652,7 +545,7 @@
 	if (tmscsim[1] >   7) tmscsim[1] =   4;
 	if (tmscsim[4] >   5) tmscsim[4] =   4;
 	if (tmscsim[5] > 180) tmscsim[5] = 180;
-};
+}
 #endif
 
 /* Override defaults on cmdline:
@@ -669,12 +562,12 @@
 	{
 		printk (KERN_NOTICE "DC390: ignore extra params!\n");
 		im = 6;
-	};
+	}
 	for (i = 0; i < im; i++)
 		tmscsim[i] = ints[i+1];
 	/* dc390_checkparams (); */
 	return 1;
-};
+}
 #ifndef MODULE
 __setup("tmscsim=", dc390_setup);
 #endif
@@ -688,11 +581,11 @@
 	{
 		printk (KERN_NOTICE "DC390: ignore extra params!\n");
 		im = 6;
-	};
+	}
 	for (i = 0; i < im; i++)
 		tmscsim[i] = ints[i+1];
 	/* dc390_checkparams (); */
-};
+}
 #endif
 
 
@@ -787,7 +680,7 @@
 {
     char interpd [] = {1,3,5,10,16,30,60,120};
     dc390_eepromBuf[index][EE_DELAY] = interpd [dc390_eepromBuf[index][EE_DELAY]];
-};
+}
 
 static UCHAR __init dc390_CheckEEpromCheckSum( PDEVDECL, UCHAR index )
 {
@@ -822,14 +715,14 @@
 	if (pDCB == pACB->pLinkDCB)
 	  {
 	     DCBDEBUG(printk (KERN_WARNING "DC390: DCB not found (DCB=%p, DCBmap[%2x]=%2x)\n",
-		     pDCB, id, pACB->DCBmap[id]);)
+			      pDCB, id, pACB->DCBmap[id]));
 	     return 0;
 	  }
-     };
+     }
    DCBDEBUG1( printk (KERN_DEBUG "DCB %p (%02x,%02x) found.\n",	\
-		      pDCB, pDCB->TargetID, pDCB->TargetLUN);)
+		      pDCB, pDCB->TargetID, pDCB->TargetLUN));
    return pDCB;
-};
+}
 
 /* Queueing philosphy:
  * There are a couple of lists:
@@ -858,39 +751,37 @@
 	if (q == queue) return 0;
     }
     return q;
-};
+}
 #endif
     
 
 /* Append to Query List */
 static void dc390_Query_append( PSCSICMD cmd, PACB pACB )
 {
-    DEBUG0(printk ("DC390: Append cmd %li to Query\n", cmd->pid);)
-    if( !pACB->QueryCnt )
-	pACB->pQueryHead = cmd;
-    else
-	pACB->pQueryTail->next = cmd;
+	dc390_cmd_scp_t *cmdq = (dc390_cmd_scp_t *)&cmd->SCp;
+
+	DEBUG0(printk ("DC390: Append cmd %li to Query\n", cmd->pid));
 
-    pACB->pQueryTail = cmd;
-    pACB->QueryCnt++;
-    pACB->CmdOutOfSRB++;
-    cmd->next = NULL;
+	list_add_tail(&cmdq->list, &pACB->cmdq);
+	pACB->QueryCnt++;
+	pACB->CmdOutOfSRB++;
 }
 
 
 /* Return next cmd from Query list */
 static PSCSICMD dc390_Query_get ( PACB pACB )
 {
-    PSCSICMD  pcmd;
-
-    pcmd = pACB->pQueryHead;
-    if (!pcmd) return pcmd;
-    DEBUG0(printk ("DC390: Get cmd %li from Query\n", pcmd->pid);)
-    pACB->pQueryHead = pcmd->next;
-    pcmd->next = NULL;
-    if (!pACB->pQueryHead) pACB->pQueryTail = NULL;
-    pACB->QueryCnt--;
-    return( pcmd );
+	PSCSICMD  pcmd;
+	dc390_cmd_scp_t *cmdq;
+	if (list_empty(&pACB->cmdq))
+		return NULL;
+
+	pcmd = (PSCSICMD) list_entry(pACB->cmdq.next, struct scsi_cmnd_list, scp.list);
+	DEBUG0(printk ("DC390: Get cmd %li from Query\n", pcmd->pid));
+	cmdq = (dc390_cmd_scp_t *)&pcmd->SCp;
+	list_del(&cmdq->list);
+	pACB->QueryCnt--;
+	return pcmd;
 }
 
 
@@ -900,7 +791,7 @@
     PSRB   pSRB;
 
     pSRB = pACB->pFreeSRB;
-    DEBUG0(printk ("DC390: Get Free SRB %p\n", pSRB);)
+    DEBUG0(printk ("DC390: Get Free SRB %p\n", pSRB));
     if( pSRB )
     {
 	pACB->pFreeSRB = pSRB->pNextSRB;
@@ -913,7 +804,7 @@
 /* Insert SRB oin top of free list */
 static __inline__ void dc390_Free_insert (PACB pACB, PSRB pSRB)
 {
-    DEBUG0(printk ("DC390: Free SRB %p\n", pSRB);)
+    DEBUG0(printk ("DC390: Free SRB %p\n", pSRB));
     pSRB->pNextSRB = pACB->pFreeSRB;
     pACB->pFreeSRB = pSRB;
 }
@@ -922,7 +813,7 @@
 /* Inserts a SRB to the top of the Waiting list */
 static __inline__ void dc390_Waiting_insert ( PDCB pDCB, PSRB pSRB )
 {
-    DEBUG0(printk ("DC390: Insert pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid);)
+    DEBUG0(printk ("DC390: Insert pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid));
     pSRB->pNextSRB = pDCB->pWaitingSRB;
     if (!pDCB->pWaitingSRB)
 	pDCB->pWaitLast = pSRB;
@@ -934,7 +825,7 @@
 /* Queue SRB to waiting list */
 static __inline__ void dc390_Waiting_append ( PDCB pDCB, PSRB pSRB)
 {
-    DEBUG0(printk ("DC390: Append pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid);)
+	DEBUG0(printk ("DC390: Append pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid));
     if( pDCB->pWaitingSRB )
 	pDCB->pWaitLast->pNextSRB = pSRB;
     else
@@ -949,7 +840,7 @@
 static __inline__ void dc390_Going_append (PDCB pDCB, PSRB pSRB)
 {
     pDCB->GoingSRBCnt++;
-    DEBUG0(printk("DC390: Append SRB %p to Going\n", pSRB);)
+    DEBUG0(printk("DC390: Append SRB %p to Going\n", pSRB));
     /* Append to the list of Going commands */
     if( pDCB->pGoingSRB )
 	pDCB->pGoingLast->pNextSRB = pSRB;
@@ -959,11 +850,11 @@
     pDCB->pGoingLast = pSRB;
     /* No next one in sent list */
     pSRB->pNextSRB = NULL;
-};
+}
 
 static __inline__ void dc390_Going_remove (PDCB pDCB, PSRB pSRB)
 {
-   DEBUG0(printk("DC390: Remove SRB %p from Going\n", pSRB);)
+	DEBUG0(printk("DC390: Remove SRB %p from Going\n", pSRB));
    if (pSRB == pDCB->pGoingSRB)
 	pDCB->pGoingSRB = pSRB->pNextSRB;
    else
@@ -978,12 +869,12 @@
 	  pDCB->pGoingLast = psrb;
      }
    pDCB->GoingSRBCnt--;
-};
+}
 
 /* Moves SRB from Going list to the top of Waiting list */
 static void dc390_Going_to_Waiting ( PDCB pDCB, PSRB pSRB )
 {
-    DEBUG0(printk(KERN_INFO "DC390: Going_to_Waiting (SRB %p) pid = %li\n", pSRB, pSRB->pcmd->pid);)
+    DEBUG0(printk(KERN_INFO "DC390: Going_to_Waiting (SRB %p) pid = %li\n", pSRB, pSRB->pcmd->pid));
     /* Remove SRB from Going */
     dc390_Going_remove (pDCB, pSRB);
     /* Insert on top of Waiting */
@@ -995,7 +886,7 @@
 static __inline__ void dc390_Waiting_to_Going ( PDCB pDCB, PSRB pSRB )
 {	
 	/* Remove from waiting list */
-	DEBUG0(printk("DC390: Remove SRB %p from head of Waiting\n", pSRB);)
+	DEBUG0(printk("DC390: Remove SRB %p from head of Waiting\n", pSRB));
 	pDCB->pWaitingSRB = pSRB->pNextSRB;
 	if( !pDCB->pWaitingSRB ) pDCB->pWaitLast = NULL;
 	pDCB->WaitSRBCnt--;
@@ -1068,14 +959,14 @@
 void DC390_waiting_timed_out (unsigned long ptr)
 {
 	PACB pACB = (PACB)ptr;
-	DC390_IFLAGS
-	DC390_AFLAGS
-	DEBUG0(printk ("DC390: Debug: Waiting queue woken up by timer!\n");)
-	DC390_LOCK_IO(pACB.pScsiHost);
+	DC390_IFLAGS;
+	DC390_AFLAGS;
+	DEBUG0(printk ("DC390: Debug: Waiting queue woken up by timer!\n"));
+	DC390_LOCK_IO(pACB->pScsiHost);
 	DC390_LOCK_ACB;
 	dc390_Waiting_process (pACB);
 	DC390_UNLOCK_ACB;
-	DC390_UNLOCK_IO(pACB.pScsiHost);
+	DC390_UNLOCK_IO(pACB->pScsiHost);
 }
 
 /***********************************************************************
@@ -1116,9 +1007,79 @@
     else {
 	dc390_Waiting_insert (pDCB, pSRB);
 	dc390_waiting_timer (pACB, HZ/5);
-    };
+    }
 }
 
+
+/* Create pci mapping */
+static int dc390_pci_map (PSRB pSRB)
+{
+	int error = 0;
+	Scsi_Cmnd *pcmd = pSRB->pcmd;
+	struct pci_dev *pdev = pSRB->pSRBDCB->pDCBACB->pdev;
+	dc390_cmd_scp_t* cmdp = ((dc390_cmd_scp_t*)(&pcmd->SCp));
+	/* Map sense buffer */
+	if (pSRB->SRBFlag & AUTO_REQSENSE) {
+		sg_dma_address(&pSRB->Segmentx) = cmdp->saved_dma_handle = 
+			pci_map_page(pdev, virt_to_page(pcmd->sense_buffer),
+				     (unsigned long)pcmd->sense_buffer & ~PAGE_MASK, sizeof(pcmd->sense_buffer),
+				     DMA_FROM_DEVICE);
+		pSRB->Segmentx.length = sizeof(pcmd->sense_buffer);
+		pSRB->SGcount = 1;
+		pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
+		DEBUG1(printk("%s(): Mapped sense buffer %p at %x\n", __FUNCTION__, pcmd->sense_buffer, cmdp->saved_dma_handle));
+	/* Make SG list */	
+	} else if (pcmd->use_sg) {
+		pSRB->pSegmentList = (PSGL) pcmd->request_buffer;
+		pSRB->SGcount = pci_map_sg(pdev, pSRB->pSegmentList,
+					   pcmd->use_sg,
+					   scsi_to_pci_dma_dir(pcmd->sc_data_direction));
+		/* TODO: error handling */
+		if (!pSRB->SGcount)
+			error = 1;
+		DEBUG1(printk("%s(): Mapped SG %p with %d (%d) elements\n", __FUNCTION__, pcmd->request_buffer, pSRB->SGcount, pcmd->use_sg));
+	/* Map single segment */
+	} else if (pcmd->request_buffer && pcmd->request_bufflen) {
+		sg_dma_address(&pSRB->Segmentx) = cmdp->saved_dma_handle =
+			pci_map_page(pdev, virt_to_page(pcmd->request_buffer),
+				     (unsigned long)pcmd->request_buffer & ~PAGE_MASK,
+				     pcmd->request_bufflen, scsi_to_pci_dma_dir(pcmd->sc_data_direction));
+		/* TODO: error handling */
+		pSRB->Segmentx.length = pcmd->request_bufflen;
+		pSRB->SGcount = 1;
+		pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
+		DEBUG1(printk("%s(): Mapped request buffer %p at %x\n", __FUNCTION__, pcmd->request_buffer, cmdp->saved_dma_handle));
+	/* No mapping !? */	
+    	} else
+		pSRB->SGcount = 0;
+	return error;
+}
+
+/* Remove pci mapping */
+static void dc390_pci_unmap (PSRB pSRB)
+{
+	Scsi_Cmnd* pcmd = pSRB->pcmd;
+	struct pci_dev *pdev = pSRB->pSRBDCB->pDCBACB->pdev;
+	dc390_cmd_scp_t* cmdp = ((dc390_cmd_scp_t*)(&pcmd->SCp));
+
+	if (pSRB->SRBFlag) {
+		pci_unmap_page(pdev, cmdp->saved_dma_handle,
+			       sizeof(pcmd->sense_buffer), DMA_FROM_DEVICE);
+		DEBUG1(printk("%s(): Unmapped sense buffer at %x\n", __FUNCTION__, cmdp->saved_dma_handle));
+	} else if (pcmd->use_sg) {
+		pci_unmap_sg(pdev, pcmd->request_buffer, pcmd->use_sg,
+			     scsi_to_pci_dma_dir(pcmd->sc_data_direction));
+		DEBUG1(printk("%s(): Unmapped SG at %p with %d elements\n", __FUNCTION__, pcmd->request_buffer, pcmd->use_sg));
+	} else if (pcmd->request_buffer && pcmd->request_bufflen) {
+		pci_unmap_page(pdev,
+			       cmdp->saved_dma_handle,
+			       pcmd->request_bufflen,
+			       scsi_to_pci_dma_dir(pcmd->sc_data_direction));
+		DEBUG1(printk("%s(): Unmapped request buffer at %x\n", __FUNCTION__, cmdp->saved_dma_handle));
+	}
+}
+
+
 /***********************************************************************
  * Function: static void dc390_BuildSRB (Scsi_Cmd *pcmd, PDCB pDCB, 
  * 					 PSRB pSRB)
@@ -1134,21 +1095,6 @@
     //pSRB->ScsiCmdLen = pcmd->cmd_len;
     //memcpy (pSRB->CmdBlock, pcmd->cmnd, pcmd->cmd_len);
     
-    if( pcmd->use_sg )
-    {
-	pSRB->SGcount = (UCHAR) pcmd->use_sg;
-	pSRB->pSegmentList = (PSGL) pcmd->request_buffer;
-    }
-    else if( pcmd->request_buffer )
-    {
-	pSRB->SGcount = 1;
-	pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
-	pSRB->Segmentx.address = (PUCHAR) pcmd->request_buffer;
-	pSRB->Segmentx.length = pcmd->request_bufflen;
-    }
-    else
-	pSRB->SGcount = 0;
-
     pSRB->SGIndex = 0;
     pSRB->AdaptStatus = 0;
     pSRB->TargetStatus = 0;
@@ -1166,7 +1112,8 @@
     pSRB->ScsiPhase = 0;
     pSRB->EndMessage = 0;
     pSRB->TagNumber = 255;
-};
+    /* KG: deferred PCI mapping to dc390_StartSCSI */
+}
 
 /* Put cmnd from Query to Waiting list and send next Waiting cmnd */
 static void dc390_Query_to_Waiting (PACB pACB)
@@ -1183,7 +1130,7 @@
 	pSRB = dc390_Free_get ( pACB );
 	if (!pSRB) return;
 	pcmd = dc390_Query_get ( pACB );
-	if (!pcmd) { dc390_Free_insert (pACB, pSRB); return; }; /* should not happen */
+	if (!pcmd) { dc390_Free_insert (pACB, pSRB); return; } /* should not happen */
 	pDCB = dc390_findDCB (pACB, pcmd->device->id, pcmd->device->lun);
 	if (!pDCB) 
 	{ 
@@ -1193,7 +1140,7 @@
 		DC390_UNLOCK_ACB_NI;
 		pcmd->done (pcmd);
 		DC390_LOCK_ACB_NI;
-	};
+	}
 	dc390_BuildSRB (pcmd, pDCB, pSRB);
 	dc390_Waiting_append ( pDCB, pSRB );
     }
@@ -1222,13 +1169,13 @@
 {
     PDCB   pDCB;
     PSRB   pSRB;
-    DC390_AFLAGS
     PACB   pACB = (PACB) cmd->device->host->hostdata;
+    DC390_AFLAGS;
 
 
     DEBUG0(/*  if(pACB->scan_devices) */	\
-	printk(KERN_INFO "DC390: Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li)\n",\
-		cmd->cmnd[0],cmd->device->id,cmd->device->lun,cmd->pid);)
+	printk(KERN_INFO "DC390: Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li), buffer=%p\n",\
+	       cmd->cmnd[0],cmd->device->id,cmd->device->lun,cmd->pid, cmd->buffer));
 
     DC390_LOCK_ACB;
     
@@ -1274,7 +1221,7 @@
 	    done (cmd);
 	    return (0);
 #endif
-	  };
+	  }
             
     }
     else if( !(pACB->scan_devices) && !(pACB->DCBmap[cmd->device->id] & (1 << cmd->device->lun)) )
@@ -1301,7 +1248,7 @@
 	    done (cmd);
 	    return (0);
 #endif
-	 };
+	 }
     }
 
     pACB->Cmds++;
@@ -1312,14 +1259,14 @@
 
     if( pACB->QueryCnt ) /* Unsent commands ? */
     {
-	DEBUG0(printk ("DC390: QueryCnt != 0\n");)
+	DEBUG0(printk ("DC390: QueryCnt != 0\n"));
 	dc390_Query_append ( cmd, pACB );
 	dc390_Waiting_process (pACB);
     }
     else if (pDCB->pWaitingSRB)
     {
  	pSRB = dc390_Free_get ( pACB );
-	DEBUG0(if (!pSRB) printk ("DC390: No free SRB but Waiting\n"); else printk ("DC390: Free SRB w/ Waiting\n");)
+	DEBUG0(if (!pSRB) printk ("DC390: No free SRB but Waiting\n"); else printk ("DC390: Free SRB w/ Waiting\n"));
 	if (!pSRB) dc390_Query_append (cmd, pACB);
 	else 
 	  {
@@ -1331,7 +1278,7 @@
     else
     {
  	pSRB = dc390_Free_get ( pACB );
-	DEBUG0(if (!pSRB) printk ("DC390: No free SRB w/o Waiting\n"); else printk ("DC390: Free SRB w/o Waiting\n");)
+	DEBUG0(if (!pSRB) printk ("DC390: No free SRB w/o Waiting\n"); else printk ("DC390: Free SRB w/o Waiting\n"));
 	if (!pSRB)
 	{
 	    dc390_Query_append (cmd, pACB);
@@ -1341,11 +1288,11 @@
 	{
 	    dc390_BuildSRB (cmd, pDCB, pSRB);
 	    dc390_SendSRB (pACB, pSRB);
-	};
-    };
+	}
+    }
 
     DC390_UNLOCK_ACB;
-    DEBUG1(printk (KERN_DEBUG " ... command (pid %li) queued successfully.\n", cmd->pid);)
+    DEBUG1(printk (KERN_DEBUG " ... command (pid %li) queued successfully.\n", cmd->pid));
     return(0);
 }
 
@@ -1480,7 +1427,7 @@
 		sector_t capacity, int geom[])
 {
     return scsicam_bios_param (bdev, capacity, geom);
-};
+}
 #endif
 
 
@@ -1496,7 +1443,7 @@
 		pSRB->TotalXferredLen, pSRB->SGToBeXferLen, pSRB->SRBState,
 		pSRB->ScsiPhase);
 	printk ("DC390: AdpaterStatus: %02x, SRB Status %02x\n", pSRB->AdaptStatus, pSRB->SRBStatus);
-    };
+    }
     printk ("DC390: Status of last IRQ (DMA/SC/Int/IRQ): %08x\n", dc390_laststatus);
     printk ("DC390: Register dump: SCSI block:\n");
     printk ("DC390: XferCnt  Cmd Stat IntS IRQS FFIS Ctl1 Ctl2 Ctl3 Ctl4\n");
@@ -1512,7 +1459,7 @@
 	printk ("DC390: FIFO:");
 	while (DC390_read8(Current_Fifo) & 0x1f) printk (" %02x", DC390_read8(ScsiFifo));
 	printk ("\n");
-      };
+      }
     printk ("DC390: Register dump: DMA engine:\n");
     printk ("DC390: Cmd   STrCnt    SBusA    WrkBC    WrkAC Stat SBusCtrl\n");
     printk ("DC390:  %02x %08x %08x %08x %08x   %02x %08x\n",
@@ -1523,7 +1470,7 @@
     PDEVSET1; PCI_READ_CONFIG_WORD(PDEV, PCI_STATUS, &pstat);
     printk ("DC390: Register dump: PCI Status: %04x\n", pstat);
     printk ("DC390: In case of driver trouble read linux/Documentation/scsi/tmscsim.txt\n");
-};
+}
 
 
 /***********************************************************************
@@ -1543,11 +1490,10 @@
     PDCB  pDCB;
     PSRB  pSRB, psrb;
     UINT  count, i;
-    PSCSICMD  pcmd;
     int   status;
     //ULONG sbac;
-    DC390_AFLAGS
     PACB  pACB = (PACB) cmd->device->host->hostdata;
+    DC390_AFLAGS;
 
     DC390_LOCK_ACB;
 
@@ -1557,33 +1503,16 @@
     /* First scan Query list */
     if( pACB->QueryCnt )
     {
-	pcmd = pACB->pQueryHead;
-	if( pcmd == cmd )
-	{
-	    /* Found: Dequeue */
-	    pACB->pQueryHead = pcmd->next;
-	    pcmd->next = NULL;
-	    if (cmd == pACB->pQueryTail) pACB->pQueryTail = NULL;
-	    pACB->QueryCnt--;
-	    status = SCSI_ABORT_SUCCESS;
-	    goto  ABO_X;
-	}
-	for( count = pACB->QueryCnt, i=0; i<count-1; i++)
-	{
-	    if( pcmd->next == cmd )
-	    {
-		pcmd->next = cmd->next;
-		cmd->next = NULL;
-		if (cmd == pACB->pQueryTail) pACB->pQueryTail = NULL;
-		pACB->QueryCnt--;
-		status = SCSI_ABORT_SUCCESS;
-		goto  ABO_X;
-	    }
-	    else
-	    {
-		pcmd = pcmd->next;
-	    }
-	}
+	struct scsi_cmnd_list *t, *pcmd_l;
+	list_for_each_entry_safe(pcmd_l, t, &pACB->cmdq, scp.list)
+		if( (struct scsi_cmnd*)pcmd_l == cmd )
+		{
+			/* Found: Dequeue */
+			list_del(&pcmd_l->scp.list);
+			pACB->QueryCnt--;
+			status = SCSI_ABORT_SUCCESS;
+			goto  ABO_X;
+		}
     }
 	
     pDCB = dc390_findDCB (pACB, cmd->device->id, cmd->device->lun);
@@ -1624,7 +1553,7 @@
 IN_WAIT:
 	dc390_Free_insert (pACB, pSRB);
 	pDCB->WaitSRBCnt--;
-	cmd->next = NULL;
+	INIT_LIST_HEAD((struct list_head*)&cmd->SCp);
 	status = SCSI_ABORT_SUCCESS;
 	goto  ABO_X;
     }
@@ -1677,7 +1606,7 @@
 		//udelay (10000);
 		//DC390_read8 (INT_Status);
 		//DC390_write8 (ScsiCmd, EN_SEL_RESEL);
-	};
+	}
     sbac = DC390_read32 (DMA_ScsiBusCtrl);
     if (sbac & SCSI_BUSY)
     {	/* clear BSY, SEL and ATN */
@@ -1695,7 +1624,7 @@
 	DC390_write8 (ScsiCmd, NOP_CMD);
 	sbac = DC390_read32 (DMA_ScsiBusCtrl);
 	printk ("%08lx\n", sbac);
-    };
+    }
 #endif
     dc390_lastabortedpid = cmd->pid;
     DC390_UNLOCK_ACB;
@@ -1781,11 +1710,11 @@
  * Returns : 0 on success.
  ***********************************************************************/
 
-int DC390_reset (Scsi_Cmnd *cmd, unsigned int resetFlags)
+int DC390_reset (Scsi_Cmnd *cmd)
 {
     UCHAR   bval;
-    DC390_AFLAGS
     PACB    pACB = (PACB) cmd->device->host->hostdata;
+    DC390_AFLAGS;
 
     printk(KERN_INFO "DC390: RESET ... ");
 
@@ -1841,10 +1770,11 @@
 
     pDCB = kmalloc (sizeof(DC390_DCB), GFP_ATOMIC);
     DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n"	\
-	    id, lun, pDCB);)
+		     id, lun, pDCB));
  
-    *ppDCB = pDCB; pDCB2 = 0;
+    *ppDCB = pDCB;
     if (!pDCB) return;
+    pDCB2 = 0;
     if( pACB->DCBCnt == 0 )
     {
 	pACB->pLinkDCB = pDCB;
@@ -1853,7 +1783,7 @@
     else
     {
 	pACB->pLastDCB->pNextDCB = pDCB;
-    };
+    }
    
     pACB->DCBCnt++;
    
@@ -1925,21 +1855,21 @@
   } else {
 	pDCB->SyncMode &= ~EN_TAG_QUEUEING;
 	pDCB->MaxCommand = 1;
-  };
+  }
 
   if( pDCB->DevMode & SYNC_NEGO_ )
 	pDCB->SyncMode |= SYNC_ENABLE;
   else {
 	pDCB->SyncMode &= ~(SYNC_NEGO_DONE | SYNC_ENABLE);
 	pDCB->SyncOffset &= ~0x0f;
-  };
+  }
 
   //if (! (pDCB->DevMode & EN_DISCONNECT_)) pDCB->SyncMode &= ~EN_ATN_STOP; 
 
   pDCB->CtrlR1 = pACB->pScsiHost->this_id;
   if( pDCB->DevMode & PARITY_CHK_ )
 	pDCB->CtrlR1 |= PARITY_ERR_REPO;
-};  
+}  
 
 
 /***********************************************************************
@@ -1956,8 +1886,8 @@
     {
       dc390_updateDCB (pACB, pDCB);
       pDCB = pDCB->pNextDCB;
-    };
-};
+    }
+}
   
 
 /***********************************************************************
@@ -2003,7 +1933,7 @@
 {
     PACB    pACB;
     UCHAR   i;
-    DC390_AFLAGS
+    DC390_AFLAGS;
 
     psh->can_queue = MAX_CMD_QUEUE;
     psh->cmd_per_lun = MAX_CMD_PER_LUN;
@@ -2021,15 +1951,13 @@
     psh->last_reset = jiffies;
 	
     pACB = (PACB) psh->hostdata;
-    DC390_LOCKA_INIT;
-    DC390_LOCK_ACB;
 
     pACB->pScsiHost = psh;
     pACB->IOPortBase = (USHORT) io_port;
     pACB->IRQLevel = Irq;
 
     DEBUG0(printk (KERN_INFO "DC390: Adapter index %i, ID %i, IO 0x%08x, IRQ 0x%02x\n",	\
-	    index, psh->this_id, (int)io_port, Irq);)
+		   index, psh->this_id, (int)io_port, Irq));
    
     psh->max_id = 8;
 
@@ -2045,7 +1973,7 @@
     pACB->pFreeSRB = pACB->SRB_array;
     pACB->SRBCount = MAX_SRB_CNT;
     pACB->QueryCnt = 0;
-    pACB->pQueryHead = NULL;
+    INIT_LIST_HEAD(&pACB->cmdq);
     pACB->AdapterIndex = index;
     pACB->status = 0;
     psh->this_id = dc390_eepromBuf[index][EE_ADAPT_SCSI_ID];
@@ -2088,14 +2016,11 @@
     int    i;
     
     pACB = (PACB) psh->hostdata;
-    
-    if (check_region (io_port, psh->n_io_port))
-	{
-	    printk(KERN_ERR "DC390: register IO ports error!\n");
-	    return( -1 );
-	}
-    else
-	request_region (io_port, psh->n_io_port, "tmscsim");
+
+    if (request_region (io_port, psh->n_io_port, "tmscsim") == NULL) {
+	printk(KERN_ERR "DC390: register IO ports error!\n");
+	return( -1 );
+    }
 
     DC390_read8_ (INT_Status, io_port);		/* Reset Pending INT */
 
@@ -2119,7 +2044,7 @@
 	dc390_pACB_current->pNextACB = pACB;
 	dc390_pACB_current = pACB;
 	pACB->pNextACB = NULL;
-      };
+      }
 
     DC390_write8 (CtrlReg1, DIS_INT_ON_SCSI_RST | psh->this_id);	/* Disable SCSI bus reset interrupt */
 
@@ -2133,7 +2058,7 @@
 	for( i=0; i<(500 + 1000*dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY]); i++ )
 		udelay(1000);
 	 */
-    };
+    }
     pACB->ACBFlag = 0;
     DC390_read8 (INT_Status);				/* Reset Pending INT */
     
@@ -2176,7 +2101,7 @@
 {
     PSH   psh;
     PACB  pACB;
-    DC390_AFLAGS
+    DC390_AFLAGS;
     
     if (dc390_CheckEEpromCheckSum (PDEV, index))
     {
@@ -2224,20 +2149,18 @@
     }
 #endif
 
-    DEBUG0(printk(KERN_INFO "DC390: pSH = %8x,", (UINT) psh);)
-    DEBUG0(printk(" Index %02i,", index);)
+    DEBUG0(printk(KERN_INFO "DC390: pSH = %8x, Index %02i\n", (UINT) psh, index));
 
     dc390_initACB( psh, io_port, Irq, index );
-    pACB = (PACB) psh->hostdata;
         
     PDEVSET;
 
     if( !dc390_initAdapter( psh, io_port, Irq, index ) )
     {
-	DEBUG0(printk("\nDC390: pACB = %8x, pDCBmap = %8x, pSRB_array = %8x\n",\
-		(UINT) pACB, (UINT) pACB->DCBmap, (UINT) pACB->SRB_array);)
+	DEBUG0(printk("DC390: pACB = %8x, pDCBmap = %8x, pSRB_array = %8x\n",\
+		      (UINT) pACB, (UINT) pACB->DCBmap, (UINT) pACB->SRB_array));
 	DEBUG0(printk("DC390: ACB size= %4x, DCB size= %4x, SRB size= %4x\n",\
-		sizeof(DC390_ACB), sizeof(DC390_DCB), sizeof(DC390_SRB) );)
+		      sizeof(DC390_ACB), sizeof(DC390_DCB), sizeof(DC390_SRB) ));
 
 	DC390_UNLOCK_ACB;
         return (0);
@@ -2288,7 +2211,7 @@
 		PCI_WRITE_CONFIG_BYTE(PDEV, PCI_LATENCY_TIMER, 64);
 	}
 	
-};
+}
 #endif /* ! NEW_PCI */
 
 static void __init dc390_set_pci_cfg (PDEVDECL)
@@ -2298,7 +2221,7 @@
 	cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY | PCI_COMMAND_IO;
 	PCI_WRITE_CONFIG_WORD (PDEV, PCI_COMMAND, cmd);
 	PCI_WRITE_CONFIG_WORD (PDEV, PCI_STATUS, (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY));
-};
+}
 	
 
 int __init DC390_detect (Scsi_Host_Template *psht)
@@ -2306,10 +2229,7 @@
     PDEVDECL0;
     UCHAR   irq;
     UINT    io_port;
-    //DC390_IFLAGS
-    DC390_DFLAGS
 
-    DC390_LOCK_DRV;
     //dc390_pSHT_start = psht;
     dc390_pACB_start = NULL;
 
@@ -2320,17 +2240,15 @@
 	    if (pci_enable_device (pdev))
 		continue;
 #endif
-	    //DC390_LOCK_IO;		/* Remove this when going to new eh */
 	    PCI_GET_IO_AND_IRQ;
-	    DEBUG0(printk(KERN_INFO "DC390(%i): IO_PORT=%04x,IRQ=%x\n", dc390_adapterCnt, (UINT) io_port, irq);)
+	    DEBUG0(printk(KERN_INFO "DC390(%i): IO_PORT=%04x,IRQ=%x\n", dc390_adapterCnt, (UINT) io_port, irq));
 
 	    if( !DC390_init(psht, io_port, irq, PDEV, dc390_adapterCnt))
 	    {
 		PCI_SET_MASTER;
 		dc390_set_pci_cfg (PDEV);
 		dc390_adapterCnt++;
-	    };
-	    //DC390_UNLOCK_IO;		/* Remove when going to new eh */
+	    }
 	}
     else
 	printk (KERN_ERR "DC390: No PCI BIOS found!\n");
@@ -2342,7 +2260,6 @@
 	psht->proc_dir = &DC390_proc_scsi_tmscsim;
 #endif
     printk(KERN_INFO "DC390: %i adapters found\n", dc390_adapterCnt);
-    DC390_UNLOCK_DRV;
     return( dc390_adapterCnt );
 }
 
@@ -2368,17 +2285,17 @@
 	{
 		pDCB->DevMode &= ~(SYNC_NEGO_ | TAG_QUEUEING_ | EN_DISCONNECT_ );
 		dc390_updateDCB (pACB, pDCB);
-	};
-   };
+	}
+   }
    kfree (cmd);
-};
+}
 
 void dc390_inquiry (PACB pACB, PDCB pDCB)
 {
    char* buffer;
    Scsi_Cmnd* cmd;
    cmd = kmalloc (sizeof(Scsi_Cmnd) + 256, GFP_ATOMIC);
-   if (!cmd) { printk ("DC390: kmalloc failed in inquiry!\n"); return; };
+   if (!cmd) { printk ("DC390: kmalloc failed in inquiry!\n"); return; }
    buffer = (char*)cmd + sizeof(Scsi_Cmnd);
 
    memset (cmd, 0, sizeof(Scsi_Cmnd) + 256);
@@ -2401,13 +2318,13 @@
    cmd->scsi_done = dc390_inquiry_done;
    cmd->timeout_per_command = HZ;
 
-   cmd->request.rq_status = RQ_SCSI_BUSY;
+   cmd->request->rq_status = RQ_SCSI_BUSY;
 
    pDCB->SyncMode &= ~SYNC_NEGO_DONE;
    printk (KERN_INFO "DC390: Queue INQUIRY command to dev ID %02x LUN %02x\n",
 	   pDCB->TargetID, pDCB->TargetLUN);
    DC390_queue_command (cmd, dc390_inquiry_done);
-};
+}
 
 /***********************************************************************
  * Functions: dc390_sendstart(), dc390_sendstart_done()
@@ -2422,14 +2339,14 @@
    printk (KERN_INFO "DC390: SENDSTART (ID %02x LUN %02x) returned %08x\n",
 	   cmd->device->id, cmd->device->lun, cmd->result);
    kfree (cmd);
-};
+}
 
 void dc390_sendstart (PACB pACB, PDCB pDCB)
 {
    char* buffer;
    Scsi_Cmnd* cmd;
    cmd = kmalloc (sizeof(Scsi_Cmnd) + 256, GFP_ATOMIC);
-   if (!cmd) { printk ("DC390: kmalloc failed in sendstart!\n"); return; };
+   if (!cmd) { printk ("DC390: kmalloc failed in sendstart!\n"); return; }
    buffer = (char*)cmd + sizeof(Scsi_Cmnd);
 
    memset (cmd, 0, sizeof(Scsi_Cmnd) + 256);
@@ -2452,13 +2369,13 @@
    cmd->scsi_done = dc390_sendstart_done;
    cmd->timeout_per_command = 5*HZ;
 
-   cmd->request.rq_status = RQ_SCSI_BUSY;
+   cmd->request->rq_status = RQ_SCSI_BUSY;
 
    pDCB->SyncMode &= ~SYNC_NEGO_DONE;
    printk (KERN_INFO "DC390: Queue SEND_START command to dev ID %02x LUN %02x\n",
 	   pDCB->TargetID, pDCB->TargetLUN);
    DC390_queue_command (cmd, dc390_sendstart_done);
-};
+}
 
 /********************************************************************
  * Function: dc390_set_info()
@@ -2476,7 +2393,7 @@
    if (*p0 == *pos) return -1;
    *pos = strsep (buffer, " \t\n:=,;.");
    return 0;
-};
+}
 
 #define SCANF(buffer, pos, p0, var, min, max)		\
 if (dc390_scanf (&buffer, &pos, &p0, &var)) goto einv;	\
@@ -2493,12 +2410,12 @@
      }
    *pos = strsep (buffer, " \t\n:=,;");
    return 0;
-};
+}
 
-#define YESNO(buffer, pos, var, bmask)			\
-if (dc390_yesno (&buffer, &pos, &var, bmask)) goto einv;	\
-else dc390_updateDCB (pACB, pDCB);		\
-if (!p) goto ok
+#define YESNO(buffer, pos, var, bmask)					\
+	if (dc390_yesno (&buffer, &pos, &var, bmask)) goto einv;	\
+	else dc390_updateDCB (pACB, pDCB);				\
+	if (!pos) goto ok
 
 static int dc390_search (char** buffer, char** pos, char** p0, char* var, char* txt, int max, int scale, char* ign)
 {
@@ -2519,7 +2436,7 @@
 
      }
    return 0;
-};
+}
 
 #define SEARCH(buffer, pos, p0, var, txt, max)						\
 if (dc390_search (&buffer, &pos, &p0, (PUCHAR)(&var), txt, max, 100, "")) goto einv2;	\
@@ -2545,7 +2462,7 @@
      else *c++ = *p++;
    *c = 0;
    return _prstr;
-};
+}
 #endif
 
 int dc390_set_info (char *buffer, int length, PACB pACB)
@@ -2555,16 +2472,16 @@
   int dum = 0;
   char dev;
   PDCB pDCB = pACB->pLinkDCB;
-  DC390_IFLAGS
-  DC390_AFLAGS 
+  DC390_IFLAGS;
+  DC390_AFLAGS;
   pos[length] = 0;
 
-  DC390_LOCK_IO(pACB.pScsiHost);
+  DC390_LOCK_IO(pACB->pScsiHost);
   DC390_LOCK_ACB;
   /* UPPERCASE */ 
   /* Don't use kernel toupper, because of 2.0.x bug: ctmp unexported */
   while (*pos) 
-    { if (*pos >='a' && *pos <= 'z') *pos = *pos + 'A' - 'a'; pos++; };
+    { if (*pos >='a' && *pos <= 'z') *pos = *pos + 'A' - 'a'; pos++; }
   
   /* Remove WS */
   pos = strsep (&buffer, " \t:\n=,;");
@@ -2589,7 +2506,7 @@
       if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
       if (!*pos) goto einv;
       
-      PARSEDEBUG(printk (KERN_INFO "DC390: config line %i %i %i:\"%s\"\n", dev, id, lun, prstr (pos, &buffer[length]));)
+      PARSEDEBUG(printk (KERN_INFO "DC390: config line %i %i %i:\"%s\"\n", dev, id, lun, prstr (pos, &buffer[length])));
       pDCB = pACB->pLinkDCB;
       for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
       /* Sanity Check */
@@ -2598,14 +2515,14 @@
 	    printk (KERN_ERR "DC390: no such device: Idx=%02i ID=%02i LUN=%02i\n",
 		    dev, id, lun);
 	    goto einv2;
-	 };
+	 }
 
       if (pDCB->pWaitingSRB || pDCB->pGoingSRB)
       {
 	  printk ("DC390: Cannot change dev (%i-%i) cfg: Pending requests\n",
 		  pDCB->TargetID, pDCB->TargetLUN);
 	  goto einv;
-      };
+      }
 	  
       olddevmode = pDCB->DevMode;
       YESNO (buffer, pos, pDCB->DevMode, PARITY_CHK_);
@@ -2634,9 +2551,9 @@
 	  pDCB->NegoPeriod = dum >> 2;
 	  if (pDCB->NegoPeriod != olddevmode) needs_inquiry++;
 	  if (!pos) goto ok;
-	  if (memcmp (pos, "NS", 2) == 0) pos = strsep (*pos, " \t\n:=,;.");
+	  if (memcmp (pos, "NS", 2) == 0) pos = strsep (&pos, " \t\n:=,;.");
 	}
-      else pos = strsep (*pos, " \t\n:=,;.");
+      else pos = strsep (&pos, " \t\n:=,;.");
       if (!*pos) goto ok;
       
       /* Sync Speed in MHz */
@@ -2654,13 +2571,13 @@
 		for (; p0-pos > 1; p0--) dum /= 10;
 		pDCB->NegoPeriod = (100000/(100*dumold + dum)) >> 2;
 		if (pDCB->NegoPeriod < 19) pDCB->NegoPeriod = 19;
-		pos = strsep (*pos, " \t\n:=,;");
+		pos = strsep (&pos, " \t\n:=,;");
 		if (!*pos) goto ok;
-	     };
-	  if (*pos == 'M') pos = strsep (*pos, " \t\n:=,;");
+	     }
+	  if (*pos == 'M') pos = strsep (&pos, " \t\n:=,;");
 	  if (pDCB->NegoPeriod != olddevmode) needs_inquiry++;
 	}
-      else pos = strsep (*pos, " \t\n:=,;");
+      else pos = strsep (&pos, " \t\n:=,;");
       /* dc390_updateDCB (pACB, pDCB); */
       if (!*pos) goto ok;
 
@@ -2672,7 +2589,7 @@
 	  pDCB->SyncOffset = dum;
 	  if (pDCB->SyncOffset > olddevmode) needs_inquiry++;
 	}
-      else pos = strsep (*pos, " \t\n:=,;");
+      else pos = strsep (&pos, " \t\n:=,;");
       if (!*pos) goto ok;
       dc390_updateDCB (pACB, pDCB);
 
@@ -2685,13 +2602,13 @@
 		pDCB->MaxCommand = dum;
 	  else printk (KERN_INFO "DC390: Can't set MaxCmd larger than one without Tag Queueing!\n");
 	}
-      else pos = strsep (*pos, " \t\n:=,;");
+      else pos = strsep (&pos, " \t\n:=,;");
 
     }
   else
     {
       char* p1 = pos; UCHAR dum, newadaptid;
-      PARSEDEBUG(printk (KERN_INFO "DC390: chg adapt cfg \"%s\"\n", prstr (pos, &buffer[length]));)
+      PARSEDEBUG(printk (KERN_INFO "DC390: chg adapt cfg \"%s\"\n", prstr (pos, &buffer[length])));
       dum = GLITCH_TO_NS (pACB->glitch_cfg);
       /* Adapter setting */
       SEARCH (buffer, pos, p0, pACB->pScsiHost->max_id, "MAXID", 8); 
@@ -2722,15 +2639,15 @@
  ok:
   DC390_UNLOCK_ACB;
   if (needs_inquiry) 
-     { dc390_updateDCB (pACB, pDCB); dc390_inquiry (pACB, pDCB); };
-  DC390_UNLOCK_IO(pACB.pScsiHost);
+     { dc390_updateDCB (pACB, pDCB); dc390_inquiry (pACB, pDCB); }
+  DC390_UNLOCK_IO(pACB->pScsiHost);
   return (length);
 
  einv2:
   pos = p0;
  einv:
   DC390_UNLOCK_ACB;
-  DC390_UNLOCK_IO(pACB.pScsiHost);
+  DC390_UNLOCK_IO(pACB->pScsiHost);
   printk (KERN_WARNING "DC390: parse error near \"%s\"\n", (pos? pos: "NULL"));
   return (-EINVAL);
    
@@ -2741,22 +2658,22 @@
 	/* cmd.host = pACB->pScsiHost; */
 	printk (KERN_WARNING "DC390: Driver reset requested!\n");
 	DC390_UNLOCK_ACB;
-	DC390_reset (&cmd, 0);
-	DC390_UNLOCK_IO(pACB.pScsiHost);
-     };
+	DC390_reset (&cmd);
+	DC390_UNLOCK_IO(pACB->pScsiHost);
+     }
   return (length);
 
  dump:
      {
 	dc390_dumpinfo (pACB, 0, 0);
 	DC390_UNLOCK_ACB;
-	DC390_UNLOCK_IO(pACB.pScsiHost);       
+	DC390_UNLOCK_IO(pACB->pScsiHost);       
      }
   return (length);
 	
  inquiry:
      {
-	pos = strsep (*pos, " \t\n.:;="); if (!*pos) goto einv;
+	pos = strsep (&pos, " \t\n.:;="); if (!*pos) goto einv;
 	dev = simple_strtoul (pos, &p0, 10);
 	if (dev >= pACB->DCBCnt) goto einv_dev;
 	for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
@@ -2764,13 +2681,13 @@
 		dev, pDCB->TargetID, pDCB->TargetLUN);
 	DC390_UNLOCK_ACB;
 	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB.pScsiHost);
-     };
+	DC390_UNLOCK_IO(pACB->pScsiHost);
+     }
    return (length);
 
  remove:
      {
-	pos = strsep (*pos, " \t\n.:;="); if (!*pos) goto einv;
+	pos = strsep (&pos, " \t\n.:;="); if (!*pos) goto einv;
 	dev = simple_strtoul (pos, &p0, 10);
 	if (dev >= pACB->DCBCnt) goto einv_dev;
 	for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
@@ -2779,29 +2696,29 @@
 	/* TO DO: We should make sure no pending commands are left */
 	dc390_remove_dev (pACB, pDCB);
 	DC390_UNLOCK_ACB;
-	DC390_UNLOCK_IO(pACB.pScsiHost);
-     };
+	DC390_UNLOCK_IO(pACB->pScsiHost);
+     }
    return (length);
 
  add:
      {
 	int id, lun;
-	pos = strsep (*pos, " \t\n.:;=");
+	pos = strsep (&pos, " \t\n.:;=");
 	if (*pos) { SCANF (buffer, pos, p0, id, 0, 7); } else goto einv;
 	if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
 	pDCB = dc390_findDCB (pACB, id, lun);
-	if (pDCB) { printk ("DC390: ADD: Device already existing\n"); goto einv; };
+	if (pDCB) { printk ("DC390: ADD: Device already existing\n"); goto einv; }
 	dc390_initDCB (pACB, &pDCB, id, lun);
 	DC390_UNLOCK_ACB;
 	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB.pScsiHost);
-     };
+	DC390_UNLOCK_IO(pACB->pScsiHost);
+     }
    return (length);
 
  start:
      {
 	int id, lun;
-	pos = strsep (*pos, " \t\n.:;=");
+	pos = strsep (&pos, " \t\n.:;=");
 	if (*pos) { SCANF (buffer, pos, p0, id, 0, 7); } else goto einv;
 	if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
 	pDCB = dc390_findDCB (pACB, id, lun);
@@ -2810,18 +2727,16 @@
 	DC390_UNLOCK_ACB;
 	dc390_sendstart (pACB, pDCB);
 	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB.pScsiHost);
-     };
+	DC390_UNLOCK_IO(pACB->pScsiHost);
+     }
    return (length);
 
  einv_dev:
    printk (KERN_WARNING "DC390: Ignore cmnd to invalid Dev(Idx) %i. Valid range: 0 - %i.\n", 
 	   dev, pACB->DCBCnt - 1);
    DC390_UNLOCK_ACB;
-   DC390_UNLOCK_IO(pACB.pScsiHost);
+   DC390_UNLOCK_IO(pACB->pScsiHost);
    return (-EINVAL);
-	     
-	     
 }
 
 #undef SEARCH
@@ -2860,10 +2775,10 @@
 {
   int dev, spd, spd1;
   char *pos = buffer;
+  struct scsi_cmnd_list *cl;
   PACB pACB;
   PDCB pDCB;
-  PSCSICMD pcmd;
-  DC390_AFLAGS
+  DC390_AFLAGS;
 
   pACB = dc390_pACB_start;
 
@@ -2932,8 +2847,8 @@
       pDCB = pDCB->pNextDCB;
      }
     SPRINTF ("Commands in Queues: Query: %li:", pACB->QueryCnt);
-    for (pcmd = pACB->pQueryHead; pcmd; pcmd = pcmd->next)
-	SPRINTF (" %li", pcmd->pid);
+    list_for_each_entry(cl, &pACB->cmdq, scp.list)
+	SPRINTF (" %li", ((struct scsi_cmnd*)cl)->pid);
     if (timer_pending(&pACB->Waiting_Timer)) SPRINTF ("Waiting queue timer running\n");
     else SPRINTF ("\n");
     pDCB = pACB->pLinkDCB;
@@ -2983,8 +2898,6 @@
 #undef YESNO
 #undef SPRINTF
 
-#ifdef MODULE
-
 /***********************************************************************
  * Function : static int dc390_shutdown (struct Scsi_Host *host)
  *
@@ -3024,17 +2937,17 @@
     {
 	nDCB = pDCB->pNextDCB;
 	DCBDEBUG(printk (KERN_INFO "DC390: Free DCB (ID %i, LUN %i): %p\n",\
-		pDCB->TargetID, pDCB->TargetLUN, pDCB);)
+			 pDCB->TargetID, pDCB->TargetLUN, pDCB));
 	//kfree (pDCB);
 	dc390_remove_dev (pACB, pDCB);
 	pDCB = nDCB;
     } while (pDCB && pACB->pLinkDCB);
 
-};
+}
 
 int DC390_release (struct Scsi_Host *host)
 {
-    DC390_AFLAGS DC390_IFLAGS
+    DC390_AFLAGS DC390_IFLAGS;
     PACB pACB = (PACB)(host->hostdata);
 
     DC390_LOCK_IO(host);
@@ -3045,7 +2958,7 @@
 
     if (host->irq != SCSI_IRQ_NONE)
     {
-	DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n",host->irq);)
+	DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n",host->irq));
 	free_irq (host->irq, pACB);
     }
 
@@ -3053,19 +2966,19 @@
     dc390_freeDCBs (host);
     DC390_UNLOCK_ACB;
     DC390_UNLOCK_IO(host);
+    scsi_unregister(host);
     return( 1 );
 }
-#endif /* def MODULE */
 
-static Scsi_Host_Template driver_template = DC390_T;
+static Scsi_Host_Template driver_template = {
    .proc_name      = "tmscsim", 
    .proc_info      = DC390_proc_info,
    .name           = DC390_BANNER " V" DC390_VERSION,
    .detect         = DC390_detect,
    .release        = DC390_release,
    .queuecommand   = DC390_queue_command,
-   .abort          = DC390_abort,
-   .reset          = DC390_reset,
+   .eh_abort_handler		= DC390_abort,
+   .eh_bus_reset_handler	= DC390_reset,
    .bios_param     = DC390_bios_param,
    .can_queue      = 42,
    .this_id        = 7,
diff -Nru a/drivers/scsi/tmscsim.h b/drivers/scsi/tmscsim.h
--- a/drivers/scsi/tmscsim.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/scsi/tmscsim.h	Thu Jan  8 23:00:24 2004
@@ -24,6 +24,8 @@
 
 #define END_SCAN		2
 
+#define pci_dma_lo32(a)			(a & 0xffffffff)
+
 typedef u8		UCHAR;	/*  8 bits */
 typedef u16		USHORT;	/* 16 bits */
 typedef u32		UINT;	/* 32 bits */
@@ -213,8 +215,7 @@
 
 /* 0x2c: */
 ULONG		QueryCnt;
-PSCSICMD	pQueryHead;
-PSCSICMD	pQueryTail;
+struct list_head	cmdq;
 
 /* 0x38: */
 UCHAR		msgin123[4];
@@ -400,6 +401,20 @@
 
 /*;----SCSI MSG BYTE*/ /* see scsi/scsi.h */ /* One is missing ! */
 #define ABORT_TAG	0x0d
+
+/*
+ *	SISC query queue
+ */
+typedef struct {
+	struct list_head	list;
+	dma_addr_t		saved_dma_handle;
+} dc390_cmd_scp_t;
+
+struct scsi_cmnd_list
+{
+	char dummy[offsetof(struct scsi_cmnd, SCp)];
+	dc390_cmd_scp_t scp;
+};
 
 /*
 **  Inquiry Data format
diff -Nru a/drivers/serial/8250.c b/drivers/serial/8250.c
--- a/drivers/serial/8250.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/serial/8250.c	Thu Jan  8 23:00:23 2004
@@ -530,10 +530,10 @@
 			status1 |= 0x10;  /* 1.625 divisor for baud_base --> 921600 */
 			serial_outp(up, 0x04, status1);
 			serial_outp(up, UART_LCR, 0);
+			up->port.uartclk = 921600*16;
 #endif
 
 			up->port.type = PORT_NS16550A;
-			up->port.uartclk = 921600*16;
 			return;
 		}
 	}
@@ -726,13 +726,6 @@
  out:	
 	spin_unlock_irqrestore(&up->port.lock, flags);
 //	restore_flags(flags);
-#ifdef CONFIG_SERIAL_8250_RSA
-	if (up->port.iobase && up->port.type == PORT_RSA) {
-		release_region(up->port.iobase, 8);
-		request_region(up->port.iobase + UART_RSA_BASE, 16,
-			       "serial_rsa");
-	}
-#endif
 	DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
 }
 
diff -Nru a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c
--- a/drivers/serial/8250_pnp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/serial/8250_pnp.c	Thu Jan  8 23:00:23 2004
@@ -42,6 +42,8 @@
 	{	"ADC0001",		0	},
 	/* SXPro 288 External Data Fax Modem Plug & Play */
 	{	"ADC0002",		0	},
+	/* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
+	{	"AEI0250",		0	},
 	/* Actiontec ISA PNP 56K X2 Fax Modem */
 	{	"AEI1240",		0	},
 	/* Rockwell 56K ACF II Fax+Data+Voice Modem */
@@ -74,6 +76,9 @@
 	{	"DMB1032",		0	},
 	/* Creative Modem Blaster V.90 DI5660 */
 	{	"DMB2001",		0	},
+	/* E-Tech */
+	/* E-Tech CyberBULLET PC56RVP */
+	{	"ETT0002",		0	},
 	/* FUJITSU */
 	/* Fujitsu 33600 PnP-I2 R Plug & Play */
 	{	"FUJ0202",		0	},
diff -Nru a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
--- a/drivers/serial/sa1100.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/serial/sa1100.c	Thu Jan  8 23:00:23 2004
@@ -852,6 +852,7 @@
 	.owner			= THIS_MODULE,
 	.driver_name		= "ttySA",
 	.dev_name		= "ttySA",
+	.devfs_name		= "ttySA",
 	.major			= SERIAL_SA1100_MAJOR,
 	.minor			= MINOR_START,
 	.nr			= NR_PORTS,
diff -Nru a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
--- a/drivers/serial/serial_core.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/serial/serial_core.c	Thu Jan  8 23:00:23 2004
@@ -1862,6 +1862,9 @@
 	if (flow == 'r')
 		termios.c_cflag |= CRTSCTS;
 
+	if (!port->ops)
+		return 0;	/* "console=" on ia64 */
+
 	port->ops->set_termios(port, &termios, NULL);
 	co->cflag = termios.c_cflag;
 
diff -Nru a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c
--- a/drivers/serial/sunsu.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/serial/sunsu.c	Thu Jan  8 23:00:23 2004
@@ -97,9 +97,6 @@
 	int			port_node;
 	unsigned int		irq;
 
-	/* L1-A keyboard break state.  */
-	int			kbd_id;
-	int			l1_down;
 #ifdef CONFIG_SERIO
 	struct serio		serio;
 	int			serio_open;
@@ -508,25 +505,8 @@
 	do {
 		unsigned char ch = serial_inp(up, UART_RX);
 
+		/* Stop-A is handled by drivers/char/keyboard.c now. */
 		if (up->su_type == SU_PORT_KBD) {
-			if (ch == SUNKBD_RESET) {
-				up->kbd_id = 1;
-				up->l1_down = 0;
-			} else if (up->kbd_id) {
-				up->kbd_id = 0;
-			} else if (ch == SUNKBD_L1) {
-				up->l1_down = 1;
-			} else if (ch == (SUNKBD_L1|SUNKBD_UP)) {
-				up->l1_down = 0;
-			} else if (ch == SUNKBD_A && up->l1_down) {
-				/* whee... */
-				sun_do_break();
-
-				/* Continue execution... */
-				up->l1_down = 0;
-				up->kbd_id = 0;
-				return;
-			}
 #ifdef CONFIG_SERIO
 			serio_interrupt(&up->serio, ch, 0, regs);
 #endif
diff -Nru a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
--- a/drivers/serial/sunzilog.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/serial/sunzilog.c	Thu Jan  8 23:00:24 2004
@@ -103,10 +103,6 @@
 
 	unsigned int cflag;
 
-	/* L1-A keyboard break state.  */
-	int				kbd_id;
-	int				l1_down;
-
 	unsigned char			parity_mask;
 	unsigned char			prev_status;
 
@@ -292,23 +288,10 @@
 					 struct pt_regs *regs)
 {
 	if (ZS_IS_KEYB(up)) {
-		if (ch == SUNKBD_RESET) {
-			up->kbd_id = 1;
-			up->l1_down = 0;
-		} else if (up->kbd_id) {
-			up->kbd_id = 0;
-		} else if (ch == SUNKBD_L1) {
-			up->l1_down = 1;
-		} else if (ch == (SUNKBD_L1 | SUNKBD_UP)) {
-			up->l1_down = 0;
-		} else if (ch == SUNKBD_A && up->l1_down) {
-			sun_do_break();
-			up->l1_down = 0;
-			up->kbd_id = 0;
-			return;
-		}
+		/* Stop-A is handled by drivers/char/keyboard.c now. */
 #ifdef CONFIG_SERIO
-		serio_interrupt(&up->serio, ch, 0, regs);
+		if (up->serio_open)
+			serio_interrupt(&up->serio, ch, 0, regs);
 #endif
 	} else if (ZS_IS_MOUSE(up)) {
 		int ret = suncore_mouse_baud_detection(ch, is_break);
@@ -322,7 +305,8 @@
 
 		case 0:
 #ifdef CONFIG_SERIO
-			serio_interrupt(&up->serio, ch, 0, regs);
+			if (up->serio_open)
+				serio_interrupt(&up->serio, ch, 0, regs);
 #endif
 			break;
 		};
@@ -333,16 +317,15 @@
 				   struct zilog_channel *channel,
 				   struct pt_regs *regs)
 {
-	struct tty_struct *tty = up->port.info->tty;	/* XXX info==NULL? */
+	struct tty_struct *tty;
+	unsigned char ch, r1;
 
-	while (1) {
-		unsigned char ch, r1;
+	tty = NULL;
+	if (up->port.info != NULL &&		/* Unopened serial console */
+	    up->port.info->tty != NULL)		/* Keyboard || mouse */
+		tty = up->port.info->tty;
 
-		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
-			tty->flip.work.func((void *)tty);
-			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
-				return;		/* XXX Ignores SysRq when we need it most. Fix. */
-		}
+	for (;;) {
 
 		r1 = read_zsreg(channel, R1);
 		if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
@@ -360,6 +343,9 @@
 		if (ch & BRK_ABRT)
 			r1 |= BRK_ABRT;
 
+		if (!(ch & Rx_CH_AV))
+			break;
+
 		ch = sbus_readb(&channel->data);
 		ZSDELAY();
 
@@ -367,21 +353,22 @@
 
 		if (unlikely(ZS_IS_KEYB(up)) || unlikely(ZS_IS_MOUSE(up))) {
 			sunzilog_kbdms_receive_chars(up, ch, 0, regs);
-			goto next_char;
+			continue;
 		}
 
-		if (ZS_IS_CONS(up) && (r1 & BRK_ABRT)) {
-			/* Wait for BREAK to deassert to avoid potentially
-			 * confusing the PROM.
+		if (tty == NULL) {
+			uart_handle_sysrq_char(&up->port, ch, regs);
+			continue;
+		}
+
+		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
+			tty->flip.work.func((void *)tty);
+			/*
+			 * The 8250 bails out of the loop here,
+			 * but we need to read everything, or die.
 			 */
-			while (1) {
-				ch = sbus_readb(&channel->control);
-				ZSDELAY();
-				if (!(ch & BRK_ABRT))
-					break;
-			}
-			sun_do_break();
-			return;
+			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+				continue;
 		}
 
 		/* A real serial line, record the character and status.  */
@@ -393,7 +380,7 @@
 				r1 &= ~(PAR_ERR | CRC_ERR);
 				up->port.icount.brk++;
 				if (uart_handle_break(&up->port))
-					goto next_char;
+					continue;
 			}
 			else if (r1 & PAR_ERR)
 				up->port.icount.parity++;
@@ -410,7 +397,7 @@
 				*tty->flip.flag_buf_ptr = TTY_FRAME;
 		}
 		if (uart_handle_sysrq_char(&up->port, ch, regs))
-			goto next_char;
+			continue;
 
 		if (up->port.ignore_status_mask == 0xff ||
 		    (r1 & up->port.ignore_status_mask) == 0) {
@@ -425,14 +412,10 @@
 			tty->flip.char_buf_ptr++;
 			tty->flip.count++;
 		}
-	next_char:
-		ch = sbus_readb(&channel->control);
-		ZSDELAY();
-		if (!(ch & Rx_CH_AV))
-			break;
 	}
 
-	tty_flip_buffer_push(tty);
+	if (tty)
+		tty_flip_buffer_push(tty);
 }
 
 static void sunzilog_status_handle(struct uart_sunzilog_port *up,
@@ -448,8 +431,23 @@
 	ZSDELAY();
 	ZS_WSYNC(channel);
 
-	if ((status & BRK_ABRT) && ZS_IS_MOUSE(up))
-		sunzilog_kbdms_receive_chars(up, 0, 1, regs);
+	if (status & BRK_ABRT) {
+		if (ZS_IS_MOUSE(up))
+			sunzilog_kbdms_receive_chars(up, 0, 1, regs);
+		if (ZS_IS_CONS(up)) {
+			/* Wait for BREAK to deassert to avoid potentially
+			 * confusing the PROM.
+			 */
+			while (1) {
+				status = sbus_readb(&channel->control);
+				ZSDELAY();
+				if (!(status & BRK_ABRT))
+					break;
+			}
+			sun_do_break();
+			return;
+		}
+	}
 
 	if (ZS_WANTS_MODEM_STATUS(up)) {
 		if (status & SYNC)
@@ -1364,8 +1362,8 @@
 	unsigned long flags;
 	int baud, brg;
 
-	printk("Console: ttyS%d (SunZilog)\n",
-	       (sunzilog_reg.minor - 64) + con->index);
+	printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n",
+	       (sunzilog_reg.minor - 64) + con->index, con->index);
 
 	/* Get firmware console settings.  */
 	sunserial_console_termios(con);
@@ -1596,6 +1594,8 @@
 
 		if (i == KEYBOARD_LINE || i == MOUSE_LINE) {
 			sunzilog_init_kbdms(up, i);
+			up->curregs[R9] |= (NV | MIE);
+			write_zsreg(channel, R9, up->curregs[R9]);
 		} else {
 			/* Normal serial TTY. */
 			up->parity_mask = 0xff;
@@ -1631,8 +1631,10 @@
 {
 	struct zs_probe_scan scan;
 	int ret;
+	int uart_count;
+	int i;
 
-	printk(KERN_INFO "Serial: Sun Zilog driver (%d chips).\n", NUM_SUNZILOG);
+	printk(KERN_DEBUG "SunZilog: %d chips.\n", NUM_SUNZILOG);
 
 	scan.scanner = sunzilog_scan_probe;
 	scan.depth = 0;
@@ -1650,25 +1652,37 @@
 	sunzilog_init_hw();
 
 	/* We can only init this once we have probed the Zilogs
-	 * in the system.
+	 * in the system. Do not count channels assigned to keyboards
+	 * or mice when we are deciding how many ports to register.
 	 */
-	sunzilog_reg.nr = NUM_CHANNELS;
+	uart_count = 0;
+	for (i = 0; i < NUM_CHANNELS; i++) {
+		struct uart_sunzilog_port *up = &sunzilog_port_table[i];
+
+		if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up))
+			continue;
+
+		uart_count++;
+	}
+		
+	sunzilog_reg.nr = uart_count;
 	sunzilog_reg.cons = SUNZILOG_CONSOLE;
 
 	sunzilog_reg.minor = sunserial_current_minor;
-	sunserial_current_minor += NUM_CHANNELS;
+	sunserial_current_minor += uart_count;
 
 	ret = uart_register_driver(&sunzilog_reg);
 	if (ret == 0) {
-		int i;
-
 		for (i = 0; i < NUM_CHANNELS; i++) {
 			struct uart_sunzilog_port *up = &sunzilog_port_table[i];
 
 			if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up))
 				continue;
 
-			uart_add_one_port(&sunzilog_reg, &up->port);
+			if (uart_add_one_port(&sunzilog_reg, &up->port)) {
+				printk(KERN_ERR
+				    "SunZilog: failed to add port zs%d\n", i);
+			}
 		}
 	}
 
diff -Nru a/drivers/usb/Makefile b/drivers/usb/Makefile
--- a/drivers/usb/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/Makefile	Thu Jan  8 23:00:24 2004
@@ -34,6 +34,7 @@
 obj-$(CONFIG_USB_SE401)		+= media/
 obj-$(CONFIG_USB_STV680)	+= media/
 obj-$(CONFIG_USB_VICAM)		+= media/
+obj-$(CONFIG_USB_W9968CF)	+= media/
 
 obj-$(CONFIG_USB_CATC)		+= net/
 obj-$(CONFIG_USB_KAWETH)	+= net/
@@ -58,4 +59,3 @@
 obj-$(CONFIG_USB_TEST)		+= misc/
 obj-$(CONFIG_USB_TIGL)		+= misc/
 obj-$(CONFIG_USB_USS720)	+= misc/
-
diff -Nru a/drivers/usb/class/audio.h b/drivers/usb/class/audio.h
--- a/drivers/usb/class/audio.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/class/audio.h	Thu Jan  8 23:00:24 2004
@@ -1,9 +1,3 @@
-#define USB_DT_CS_DEVICE                0x21
-#define USB_DT_CS_CONFIG                0x22
-#define USB_DT_CS_STRING                0x23
-#define USB_DT_CS_INTERFACE             0x24
-#define USB_DT_CS_ENDPOINT              0x25
-
 #define CS_AUDIO_UNDEFINED		0x20
 #define CS_AUDIO_DEVICE			0x21
 #define CS_AUDIO_CONFIGURATION		0x22
diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
--- a/drivers/usb/class/cdc-acm.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/class/cdc-acm.c	Thu Jan  8 23:00:24 2004
@@ -1,5 +1,5 @@
 /*
- * acm.c  Version 0.22
+ * cdc-acm.c
  *
  * Copyright (c) 1999 Armin Fuerst	<fuerst@in.tum.de>
  * Copyright (c) 1999 Pavel Machek	<pavel@suse.cz>
@@ -26,6 +26,7 @@
  *	v0.21 - revert to probing on device for devices with multiple configs
  *	v0.22 - probe only the control interface. if usbcore doesn't choose the
  *		config we want, sysadmin changes bConfigurationValue in sysfs.
+ *	v0.23 - use softirq for rx processing, as needed by tty layer
  */
 
 /*
@@ -44,6 +45,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
+#undef DEBUG
+
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -54,14 +57,13 @@
 #include <linux/module.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
-#undef DEBUG
 #include <linux/usb.h>
 #include <asm/byteorder.h>
 
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.21"
+#define DRIVER_VERSION "v0.23"
 #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
 #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
 
@@ -146,7 +148,8 @@
 	struct tty_struct *tty;				/* the corresponding tty */
 	struct urb *ctrlurb, *readurb, *writeurb;	/* urbs */
 	struct acm_line line;				/* line coding (bits, stop, parity) */
-	struct work_struct work;					/* work queue entry for line discipline waking up */
+	struct work_struct work;			/* work queue entry for line discipline waking up */
+	struct tasklet_struct bh;			/* rx processing */
 	unsigned int ctrlin;				/* input control lines (DCD, DSR, RI, break, overruns) */
 	unsigned int ctrlout;				/* output control lines (DTR, RTS) */
 	unsigned int writesize;				/* max packet size for the output bulk endpoint */
@@ -184,9 +187,10 @@
 #define acm_send_break(acm, ms)		acm_ctrl_msg(acm, ACM_REQ_SEND_BREAK, ms, NULL, 0)
 
 /*
- * Interrupt handler for various ACM control events
+ * Interrupt handlers for various ACM device responses
  */
 
+/* control interface reports status changes with "interrupt" transfers */
 static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = urb->context;
@@ -251,20 +255,30 @@
 		     __FUNCTION__, status);
 }
 
+/* data interface returns incoming bytes, or we got unthrottled */
 static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = urb->context;
-	struct tty_struct *tty = acm->tty;
-	unsigned char *data = urb->transfer_buffer;
-	int i = 0;
 
 	if (!ACM_READY(acm))
 		return;
 
 	if (urb->status)
-		dbg("nonzero read bulk status received: %d", urb->status);
+		dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
+
+	/* calling tty_flip_buffer_push() in_irq() isn't allowed */
+	tasklet_schedule(&acm->bh);
+}
+
+static void acm_rx_tasklet(unsigned long _acm)
+{
+	struct acm *acm = (void *)_acm;
+	struct urb *urb = acm->readurb;
+	struct tty_struct *tty = acm->tty;
+	unsigned char *data = urb->transfer_buffer;
+	int i = 0;
 
-	if (!urb->status && !acm->throttle)  {
+	if (urb->actual_length > 0 && !acm->throttle)  {
 		for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
 			/* if we insert more than TTY_FLIPBUF_SIZE characters,
 			 * we drop them. */
@@ -285,10 +299,12 @@
 	urb->actual_length = 0;
 	urb->dev = acm->dev;
 
-	if (usb_submit_urb(urb, GFP_ATOMIC))
-		dbg("failed resubmitting read urb");
+	i = usb_submit_urb(urb, GFP_ATOMIC);
+	if (i)
+		dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
 }
 
+/* data interface wrote those outgoing bytes */
 static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
 {
 	struct acm *acm = (struct acm *)urb->context;
@@ -621,6 +637,8 @@
 			acm->minor = minor;
 			acm->dev = dev;
 
+			acm->bh.func = acm_rx_tasklet;
+			acm->bh.data = (unsigned long) acm;
 			INIT_WORK(&acm->work, acm_softint, acm);
 
 			if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) {
diff -Nru a/drivers/usb/class/usb-midi.h b/drivers/usb/class/usb-midi.h
--- a/drivers/usb/class/usb-midi.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/class/usb-midi.h	Thu Jan  8 23:00:24 2004
@@ -28,12 +28,6 @@
 #define USB_SUBCLASS_MIDISTREAMING	3
 #endif
 
-#define USB_DT_CS_DEVICE		0x21
-#define USB_DT_CS_CONFIG		0x22
-#define USB_DT_CS_STRING		0x23
-#define USB_DT_CS_INTERFACE		0x24
-#define USB_DT_CS_ENDPOINT		0x25
-
 /* ------------------------------------------------------------------------- */
 /* Roland MIDI Devices */
 
diff -Nru a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
--- a/drivers/usb/class/usblp.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/class/usblp.c	Thu Jan  8 23:00:23 2004
@@ -610,7 +610,7 @@
 		if (!usblp->wcomplete) {
 			barrier();
 			if (file->f_flags & O_NONBLOCK)
-				return -EAGAIN;
+				return writecount ? writecount : -EAGAIN;
 
 			timeout = USBLP_WRITE_TIMEOUT;
 			add_wait_queue(&usblp->wait, &wait);
@@ -673,8 +673,12 @@
 
 		usblp->writeurb->dev = usblp->dev;
 		usblp->wcomplete = 0;
-		if (usb_submit_urb(usblp->writeurb, GFP_KERNEL)) {
-			count = -EIO;
+		err = usb_submit_urb(usblp->writeurb, GFP_KERNEL);
+		if (err) {
+			if (err != -ENOMEM)
+				count = -EIO;
+			else
+				count = writecount ? writecount : -ENOMEM;
 			up (&usblp->sem);
 			break;
 		}
@@ -706,8 +710,6 @@
 			goto done;
 		}
 
-		// FIXME:  only use urb->status inside completion
-		// callbacks; this way is racey...
 		add_wait_queue(&usblp->wait, &wait);
 		while (1==1) {
 			if (signal_pending(current)) {
@@ -1093,7 +1095,7 @@
 	/* First two bytes are length in big-endian.
 	 * They count themselves, and we copy them into
 	 * the user's buffer. */
-	length = (usblp->device_id_string[0] << 8) + usblp->device_id_string[1];
+	length = be16_to_cpu(*((u16 *)usblp->device_id_string));
 	if (length < 2)
 		length = 2;
 	else if (length >= USBLP_DEVICE_ID_SIZE)
diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/core/hcd.c	Thu Jan  8 23:00:24 2004
@@ -1165,6 +1165,7 @@
 	struct device			*sys = 0;
 	unsigned long			flags;
 	struct completion_splice	splice;
+	struct list_head		*tmp;
 	int				retval;
 
 	if (!urb)
@@ -1203,7 +1204,12 @@
 	 */
 	WARN_ON (!HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_HALT);
 
-	if (!urb->hcpriv) {
+	/* insist the urb is still queued */
+	list_for_each(tmp, &dev->urb_list) {
+		if (tmp == &urb->urb_list)
+			break;
+	}
+	if (tmp != &urb->urb_list) {
 		retval = -EINVAL;
 		goto done;
 	}
diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/core/hub.c	Thu Jan  8 23:00:24 2004
@@ -126,14 +126,20 @@
 static void hub_irq(struct urb *urb, struct pt_regs *regs)
 {
 	struct usb_hub *hub = (struct usb_hub *)urb->context;
-	unsigned long flags;
 	int status;
 
+	spin_lock(&hub_event_lock);
+	hub->urb_active = 0;
+	if (hub->urb_complete) {	/* disconnect or rmmod */
+		complete(hub->urb_complete);
+		goto done;
+	}
+
 	switch (urb->status) {
 	case -ENOENT:		/* synchronous unlink */
 	case -ECONNRESET:	/* async unlink */
 	case -ESHUTDOWN:	/* hardware going away */
-		return;
+		goto done;
 
 	default:		/* presumably an error */
 		/* Cause a hub reset after 10 consecutive errors */
@@ -151,18 +157,20 @@
 	hub->nerrors = 0;
 
 	/* Something happened, let khubd figure it out */
-	spin_lock_irqsave(&hub_event_lock, flags);
 	if (list_empty(&hub->event_list)) {
 		list_add(&hub->event_list, &hub_event_list);
 		wake_up(&khubd_wait);
 	}
-	spin_unlock_irqrestore(&hub_event_lock, flags);
 
 resubmit:
 	if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0
 			/* ENODEV means we raced disconnect() */
 			&& status != -ENODEV)
 		dev_err (&hub->intf->dev, "resubmit --> %d\n", urb->status);
+	if (status == 0)
+		hub->urb_active = 1;
+done:
+	spin_unlock(&hub_event_lock);
 }
 
 /* USB 2.0 spec Section 11.24.2.3 */
@@ -467,7 +475,8 @@
 		message = "couldn't submit status urb";
 		goto fail;
 	}
-		
+	hub->urb_active = 1;
+
 	/* Wake up khubd */
 	wake_up(&khubd_wait);
 
@@ -485,6 +494,7 @@
 static void hub_disconnect(struct usb_interface *intf)
 {
 	struct usb_hub *hub = usb_get_intfdata (intf);
+	DECLARE_COMPLETION(urb_complete);
 	unsigned long flags;
 
 	if (!hub)
@@ -492,12 +502,11 @@
 
 	usb_set_intfdata (intf, NULL);
 	spin_lock_irqsave(&hub_event_lock, flags);
+	hub->urb_complete = &urb_complete;
 
 	/* Delete it and then reset it */
-	list_del(&hub->event_list);
-	INIT_LIST_HEAD(&hub->event_list);
-	list_del(&hub->hub_list);
-	INIT_LIST_HEAD(&hub->hub_list);
+	list_del_init(&hub->event_list);
+	list_del_init(&hub->hub_list);
 
 	spin_unlock_irqrestore(&hub_event_lock, flags);
 
@@ -510,6 +519,8 @@
 
 	if (hub->urb) {
 		usb_unlink_urb(hub->urb);
+		if (hub->urb_active)
+			wait_for_completion(&urb_complete);
 		usb_free_urb(hub->urb);
 		hub->urb = NULL;
 	}
diff -Nru a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
--- a/drivers/usb/core/hub.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/core/hub.h	Thu Jan  8 23:00:23 2004
@@ -172,6 +172,8 @@
 struct usb_hub {
 	struct usb_interface	*intf;		/* the "real" device */
 	struct urb		*urb;		/* for interrupt polling pipe */
+	struct completion	*urb_complete;	/* wait for urb to end */
+	unsigned int		urb_active:1;
 
 	/* buffer for urb ... 1 bit each for hub and children, rounded up */
 	char			(*buffer)[(USB_MAXCHILDREN + 1 + 7) / 8];
diff -Nru a/drivers/usb/core/message.c b/drivers/usb/core/message.c
--- a/drivers/usb/core/message.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/core/message.c	Thu Jan  8 23:00:23 2004
@@ -1086,6 +1086,11 @@
 		ret = -EINVAL;
 		goto out;
 	}
+
+	/* The USB spec says configuration 0 means unconfigured.
+	 * But if a device includes a configuration numbered 0,
+	 * we will accept it as a correctly configured state.
+	 */
 	if (cp && configuration == 0)
 		dev_warn(&dev->dev, "config 0 descriptor??\n");
 
@@ -1101,7 +1106,7 @@
 		goto out;
 
 	dev->actconfig = cp;
-	if (!configuration)
+	if (!cp)
 		dev->state = USB_STATE_ADDRESS;
 	else {
 		dev->state = USB_STATE_CONFIGURED;
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/core/usb.c	Thu Jan  8 23:00:24 2004
@@ -80,7 +80,7 @@
 
 static int usb_generic_driver_data;
 
-/* needs to be called with BKL held */
+/* called from driver core with usb_bus_type.subsys writelock */
 int usb_probe_interface(struct device *dev)
 {
 	struct usb_interface * intf = to_usb_interface(dev);
@@ -93,12 +93,14 @@
 	if (!driver->probe)
 		return error;
 
+	/* driver claim() doesn't yet affect dev->driver... */
+	if (intf->driver)
+		return error;
+
 	id = usb_match_id (intf, driver->id_table);
 	if (id) {
 		dev_dbg (dev, "%s - got id\n", __FUNCTION__);
-		down (&driver->serialize);
 		error = driver->probe (intf, id);
-		up (&driver->serialize);
 	}
 	if (!error)
 		intf->driver = driver;
@@ -106,23 +108,24 @@
 	return error;
 }
 
+/* called from driver core with usb_bus_type.subsys writelock */
 int usb_unbind_interface(struct device *dev)
 {
 	struct usb_interface *intf = to_usb_interface(dev);
-	struct usb_driver *driver = to_usb_driver(dev->driver);
-
-	down(&driver->serialize);
+	struct usb_driver *driver = intf->driver;
 
 	/* release all urbs for this interface */
 	usb_disable_interface(interface_to_usbdev(intf), intf);
 
-	if (intf->driver && intf->driver->disconnect)
-		intf->driver->disconnect(intf);
-
-	/* force a release and re-initialize the interface */
-	usb_driver_release_interface(driver, intf);
+	if (driver && driver->disconnect)
+		driver->disconnect(intf);
 
-	up(&driver->serialize);
+	/* reset other interface state */
+	usb_set_interface(interface_to_usbdev(intf),
+			intf->altsetting[0].desc.bInterfaceNumber,
+			0);
+	usb_set_intfdata(intf, NULL);
+	intf->driver = NULL;
 
 	return 0;
 }
@@ -152,8 +155,6 @@
 	new_driver->driver.probe = usb_probe_interface;
 	new_driver->driver.remove = usb_unbind_interface;
 
-	init_MUTEX(&new_driver->serialize);
-
 	retval = driver_register(&new_driver->driver);
 
 	if (!retval) {
@@ -170,7 +171,7 @@
 /**
  * usb_deregister - unregister a USB driver
  * @driver: USB operations of the driver to unregister
- * Context: !in_interrupt (), must be called with BKL held
+ * Context: must be able to sleep
  *
  * Unlinks the specified driver from the internal USB driver list.
  * 
@@ -264,26 +265,22 @@
  * Few drivers should need to use this routine, since the most natural
  * way to bind to an interface is to return the private data from
  * the driver's probe() method.
+ *
+ * Callers must own the driver model's usb bus writelock.  So driver
+ * probe() entries don't need extra locking, but other call contexts
+ * may need to explicitly claim that lock.
  */
 int usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv)
 {
 	if (!iface || !driver)
 		return -EINVAL;
 
-	/* this is mainly to lock against usbfs */
-	lock_kernel();
-	if (iface->driver) {
-		unlock_kernel();
-		err ("%s driver booted %s off interface %p",
-			driver->name, iface->driver->name, iface);
+	if (iface->driver)
 		return -EBUSY;
-	} else {
-	    dbg("%s driver claimed interface %p", driver->name, iface);
-	}
 
+	/* FIXME should device_bind_driver() */
 	iface->driver = driver;
 	usb_set_intfdata(iface, priv);
-	unlock_kernel();
 	return 0;
 }
 
@@ -323,13 +320,22 @@
  * usually won't need to call this.
  *
  * This call is synchronous, and may not be used in an interrupt context.
+ * Callers must own the driver model's usb bus writelock.  So driver
+ * disconnect() entries don't need extra locking, but other call contexts
+ * may need to explicitly claim that lock.
  */
 void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface)
 {
 	/* this should never happen, don't release something that's not ours */
-	if (iface->driver && iface->driver != driver)
+	if (!iface || !iface->driver || iface->driver != driver)
 		return;
 
+	if (iface->dev.driver) {
+		/* FIXME should be the ONLY case here */
+		device_release_driver(&iface->dev);
+		return;
+	}
+
 	usb_set_interface(interface_to_usbdev(iface),
 			iface->altsetting[0].desc.bInterfaceNumber,
 			0);
@@ -991,6 +997,7 @@
 	int err = -EINVAL;
 	int i;
 	int j;
+	int config;
 
 	/*
 	 * Set the driver for the usb device to point to the "generic" driver.
@@ -1108,18 +1115,30 @@
 
 	/* choose and set the configuration. that registers the interfaces
 	 * with the driver core, and lets usb device drivers bind to them.
+	 * NOTE:  should interact with hub power budgeting.
 	 */
+	config = dev->config[0].desc.bConfigurationValue;
 	if (dev->descriptor.bNumConfigurations != 1) {
+		for (i = 0; i < dev->descriptor.bNumConfigurations; i++) {
+			/* heuristic:  Linux is more likely to have class
+			 * drivers, so avoid vendor-specific interfaces.
+			 */
+			if (dev->config[i].interface[0]->altsetting
+						->desc.bInterfaceClass
+					== USB_CLASS_VENDOR_SPEC)
+				continue;
+			config = dev->config[i].desc.bConfigurationValue;
+			break;
+		}
 		dev_info(&dev->dev,
 			"configuration #%d chosen from %d choices\n",
-			dev->config[0].desc.bConfigurationValue,
+			config,
 			dev->descriptor.bNumConfigurations);
 	}
-	err = usb_set_configuration(dev,
-			dev->config[0].desc.bConfigurationValue);
+	err = usb_set_configuration(dev, config);
 	if (err) {
 		dev_err(&dev->dev, "can't set config #%d, error %d\n",
-			dev->config[0].desc.bConfigurationValue, err);
+			config, err);
 		device_del(&dev->dev);
 		goto fail;
 	}
diff -Nru a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
--- a/drivers/usb/gadget/ether.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/gadget/ether.c	Thu Jan  8 23:00:24 2004
@@ -226,6 +226,27 @@
 #define hw_optimize(g) do {} while (0)
 #endif
 
+/*
+ * Toshiba TC86C001 ("Goku-S") UDC
+ *
+ * This has three semi-configurable full speed bulk/interrupt endpoints.
+ */
+#ifdef	CONFIG_USB_ETH_GOKU
+#define CHIP			"goku"
+#define DRIVER_VERSION_NUM	0x0106
+#define EP0_MAXPACKET		8
+static const char EP_OUT_NAME [] = "ep1-bulk";
+#define EP_OUT_NUM	1
+static const char EP_IN_NAME [] = "ep2-bulk";
+#define EP_IN_NUM	2
+static const char EP_STATUS_NAME [] = "ep3-bulk";
+#define EP_STATUS_NUM	3
+#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
+/* doesn't support remote wakeup */
+
+#define hw_optimize(g) do {} while (0)
+#endif
+
 /*-------------------------------------------------------------------------*/
 
 #ifndef EP0_MAXPACKET
diff -Nru a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c
--- a/drivers/usb/gadget/zero.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/gadget/zero.c	Thu Jan  8 23:00:23 2004
@@ -108,18 +108,14 @@
  *
  * CHIP ... hardware identifier
  * DRIVER_VERSION_NUM ... alerts the host side driver to differences
- * EP0_MAXPACKET ... controls packetization of control requests
  * EP_*_NAME ... which endpoints do we use for which purpose?
  * EP_*_NUM ... numbers for them (often limited by hardware)
  * HIGHSPEED ... define if ep0 and descriptors need high speed support
  * MAX_USB_POWER ... define if we use other than 100 mA bus current
- * SELFPOWER ... unless we can run on bus power, USB_CONFIG_ATT_SELFPOWER
+ * SELFPOWER ... if we can run on bus power, zero
  * WAKEUP ... if hardware supports remote wakeup AND we will issue the
  * 	usb_gadget_wakeup() call to initiate it, USB_CONFIG_ATT_WAKEUP
  *
- * hw_optimize(gadget) ... for any hardware tweaks we want to kick in
- * 	before we enable our endpoints
- *
  * add other defines for other portability issues, like hardware that
  * for some reason doesn't handle full speed bulk maxpacket of 64.
  */
@@ -138,25 +134,13 @@
 #ifdef	CONFIG_USB_ZERO_NET2280
 #define CHIP			"net2280"
 #define DRIVER_VERSION_NUM	0x0101
-#define EP0_MAXPACKET		64
 static const char EP_OUT_NAME [] = "ep-a";
 #define EP_OUT_NUM	2
 static const char EP_IN_NAME [] = "ep-b";
 #define EP_IN_NUM	2
 #define HIGHSPEED
 /* specific hardware configs could be bus-powered */
-#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
 /* supports remote wakeup, but this driver doesn't */
-
-extern int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode);
-
-static inline void hw_optimize (struct usb_gadget *gadget)
-{
-	/* we can have bigger ep-a/ep-b fifos (2KB each, 4 packets
-	 * for highspeed bulk) because we're not using ep-c/ep-d.
-	 */
-	net2280_set_fifo_mode (gadget, 1);
-}
 #endif
 
 /*
@@ -173,17 +157,12 @@
 #ifdef	CONFIG_USB_ZERO_PXA2XX
 #define CHIP			"pxa2xx"
 #define DRIVER_VERSION_NUM	0x0103
-#define EP0_MAXPACKET		16
 static const char EP_OUT_NAME [] = "ep12out-bulk";
 #define EP_OUT_NUM	12
 static const char EP_IN_NAME [] = "ep11in-bulk";
 #define EP_IN_NUM	11
 /* doesn't support bus-powered operation */
-#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
 /* supports remote wakeup, but this driver doesn't */
-
-/* no hw optimizations to apply */
-#define hw_optimize(g) do {} while (0);
 #endif
 
 /*
@@ -200,22 +179,32 @@
 #ifdef	CONFIG_USB_ZERO_SA1100
 #define CHIP			"sa1100"
 #define DRIVER_VERSION_NUM	0x0105
-#define EP0_MAXPACKET		8
 static const char EP_OUT_NAME [] = "ep1out-bulk";
 #define EP_OUT_NUM	1
 static const char EP_IN_NAME [] = "ep2in-bulk";
 #define EP_IN_NUM	2
 /* doesn't support bus-powered operation */
-#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
 /* doesn't support remote wakeup? */
+#endif
 
-/* no hw optimizations to apply */
-#define hw_optimize(g) do {} while (0);
+/*
+ * Toshiba TC86C001 ("Goku-S") UDC
+ *
+ * This has three semi-configurable full speed bulk/interrupt endpoints.
+ */
+#ifdef	CONFIG_USB_ZERO_GOKU
+#define CHIP			"goku"
+#define DRIVER_VERSION_NUM	0x0106
+static const char EP_OUT_NAME [] = "ep1-bulk";
+#define EP_OUT_NUM	1
+static const char EP_IN_NAME [] = "ep2-bulk";
+#define EP_IN_NUM	2
+/* doesn't support remote wakeup */
 #endif
 
 /*-------------------------------------------------------------------------*/
 
-#ifndef EP0_MAXPACKET
+#ifndef EP_OUT_NUM
 #	error Configure some USB peripheral controller driver!
 #endif
 
@@ -224,10 +213,10 @@
  */
 
 #ifndef	SELFPOWER
-/* default: say we rely on bus power */
-#define SELFPOWER	0
+/* default: say we're self-powered */
+#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
 /* else:
- * - SELFPOWER value must be USB_CONFIG_ATT_SELFPOWER
+ * - SELFPOWER value must be zero
  * - MAX_USB_POWER may be nonzero.
  */
 #endif
@@ -338,14 +327,13 @@
 #define	CONFIG_SOURCE_SINK	3
 #define	CONFIG_LOOPBACK		2
 
-static const struct usb_device_descriptor
+static struct usb_device_descriptor
 device_desc = {
 	.bLength =		sizeof device_desc,
 	.bDescriptorType =	USB_DT_DEVICE,
 
 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
 	.bDeviceClass =		USB_CLASS_VENDOR_SPEC,
-	.bMaxPacketSize0 =	EP0_MAXPACKET,
 
 	.idVendor =		__constant_cpu_to_le16 (DRIVER_VENDOR_NUM),
 	.idProduct =		__constant_cpu_to_le16 (DRIVER_PRODUCT_NUM),
@@ -457,7 +445,7 @@
 	.wMaxPacketSize =	__constant_cpu_to_le16 (512),
 };
 
-static const struct usb_qualifier_descriptor
+static struct usb_qualifier_descriptor
 dev_qualifier = {
 	.bLength =		sizeof dev_qualifier,
 	.bDescriptorType =	USB_DT_DEVICE_QUALIFIER,
@@ -465,9 +453,6 @@
 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
 	.bDeviceClass =		USB_CLASS_VENDOR_SPEC,
 
-	/* assumes ep0 uses the same value for both speeds ... */
-	.bMaxPacketSize0 =	EP0_MAXPACKET,
-
 	.bNumConfigurations =	2,
 };
 
@@ -959,7 +944,6 @@
 	}
 #endif
 	zero_reset_config (dev);
-	hw_optimize (gadget);
 
 	switch (number) {
 	case CONFIG_SOURCE_SINK:
@@ -1028,7 +1012,7 @@
 
 	case USB_REQ_GET_DESCRIPTOR:
 		if (ctrl->bRequestType != USB_DIR_IN)
-			break;
+			goto unknown;
 		switch (ctrl->wValue >> 8) {
 
 		case USB_DT_DEVICE:
@@ -1068,14 +1052,14 @@
 	/* currently two configs, two speeds */
 	case USB_REQ_SET_CONFIGURATION:
 		if (ctrl->bRequestType != 0)
-			break;
+			goto unknown;
 		spin_lock (&dev->lock);
 		value = zero_set_config (dev, ctrl->wValue, GFP_ATOMIC);
 		spin_unlock (&dev->lock);
 		break;
 	case USB_REQ_GET_CONFIGURATION:
 		if (ctrl->bRequestType != USB_DIR_IN)
-			break;
+			goto unknown;
 		*(u8 *)req->buf = dev->config;
 		value = min (ctrl->wLength, (u16) 1);
 		break;
@@ -1086,7 +1070,7 @@
 	 */
 	case USB_REQ_SET_INTERFACE:
 		if (ctrl->bRequestType != USB_RECIP_INTERFACE)
-			break;
+			goto unknown;
 		spin_lock (&dev->lock);
 		if (dev->config && ctrl->wIndex == 0 && ctrl->wValue == 0) {
 			u8		config = dev->config;
@@ -1106,7 +1090,7 @@
 		break;
 	case USB_REQ_GET_INTERFACE:
 		if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE))
-			break;
+			goto unknown;
 		if (!dev->config)
 			break;
 		if (ctrl->wIndex != 0) {
@@ -1117,7 +1101,35 @@
 		value = min (ctrl->wLength, (u16) 1);
 		break;
 
+	/*
+	 * These are the same vendor-specific requests supported by
+	 * Intel's USB 2.0 compliance test devices.  We exceed that
+	 * device spec by allowing multiple-packet requests.
+	 */
+	case 0x5b:	/* control WRITE test -- fill the buffer */
+		if (ctrl->bRequestType != (USB_DIR_OUT|USB_TYPE_VENDOR))
+			goto unknown;
+		if (ctrl->wValue || ctrl->wIndex)
+			break;
+		/* just read that many bytes into the buffer */
+		if (ctrl->wLength > USB_BUFSIZ)
+			break;
+		value = ctrl->wLength;
+		break;
+	case 0x5c:	/* control READ test -- return the buffer */
+		if (ctrl->bRequestType != (USB_DIR_IN|USB_TYPE_VENDOR))
+			goto unknown;
+		if (ctrl->wValue || ctrl->wIndex)
+			break;
+		/* expect those bytes are still in the buffer; send back */
+		if (ctrl->wLength > USB_BUFSIZ
+				|| ctrl->wLength != req->length)
+			break;
+		value = ctrl->wLength;
+		break;
+
 	default:
+unknown:
 		VDEBUG (dev,
 			"unknown control req%02x.%02x v%04x i%04x l%d\n",
 			ctrl->bRequestType, ctrl->bRequest,
@@ -1198,6 +1210,12 @@
 		goto enomem;
 
 	dev->req->complete = zero_setup_complete;
+
+	device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
+#ifdef HIGHSPEED
+	/* assume ep0 uses the same value for both speeds ... */
+	dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0;
+#endif
 
 	gadget->ep0->driver_data = dev;
 
diff -Nru a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c
--- a/drivers/usb/host/ohci-dbg.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/host/ohci-dbg.c	Thu Jan  8 23:00:24 2004
@@ -269,18 +269,19 @@
 	ohci_dump_status (controller, NULL, 0);
 	if (controller->hcca)
 		ohci_dbg (controller,
-			"hcca frame #%04x\n", controller->hcca->frame_no);
+			"hcca frame #%04x\n", OHCI_FRAME_NO(controller->hcca));
 	ohci_dump_roothub (controller, 1, NULL, 0);
 }
 
 static const char data0 [] = "DATA0";
 static const char data1 [] = "DATA1";
 
-static void ohci_dump_td (struct ohci_hcd *ohci, char *label, struct td *td)
+static void ohci_dump_td (const struct ohci_hcd *ohci, const char *label,
+		const struct td *td)
 {
 	u32	tmp = le32_to_cpup (&td->hwINFO);
 
-	ohci_dbg (ohci, "%s td %p%s; urb %p index %d; hw next td %08x",
+	ohci_dbg (ohci, "%s td %p%s; urb %p index %d; hw next td %08x\n",
 		label, td,
 		(tmp & TD_DONE) ? " (DONE)" : "",
 		td->urb, td->index,
@@ -301,28 +302,28 @@
 		case TD_DP_OUT: pid = "OUT"; break;
 		default: pid = "(bad pid)"; break;
 		}
-		ohci_dbg (ohci, "     info %08x CC=%x %s DI=%d %s %s", tmp,
+		ohci_dbg (ohci, "     info %08x CC=%x %s DI=%d %s %s\n", tmp,
 			TD_CC_GET(tmp), /* EC, */ toggle,
 			(tmp & TD_DI) >> 21, pid,
 			(tmp & TD_R) ? "R" : "");
 		cbp = le32_to_cpup (&td->hwCBP);
 		be = le32_to_cpup (&td->hwBE);
-		ohci_dbg (ohci, "     cbp %08x be %08x (len %d)", cbp, be,
+		ohci_dbg (ohci, "     cbp %08x be %08x (len %d)\n", cbp, be,
 			cbp ? (be + 1 - cbp) : 0);
 	} else {
 		unsigned	i;
-		ohci_dbg (ohci, "     info %08x CC=%x FC=%d DI=%d SF=%04x", tmp,
+		ohci_dbg (ohci, "  info %08x CC=%x FC=%d DI=%d SF=%04x\n", tmp,
 			TD_CC_GET(tmp),
 			(tmp >> 24) & 0x07,
 			(tmp & TD_DI) >> 21,
 			tmp & 0x0000ffff);
-		ohci_dbg (ohci, "     bp0 %08x be %08x",
+		ohci_dbg (ohci, "  bp0 %08x be %08x\n",
 			le32_to_cpup (&td->hwCBP) & ~0x0fff,
 			le32_to_cpup (&td->hwBE));
 		for (i = 0; i < MAXPSW; i++) {
 			u16	psw = le16_to_cpup (&td->hwPSW [i]);
 			int	cc = (psw >> 12) & 0x0f;
-			ohci_dbg (ohci, "       psw [%d] = %2x, CC=%x %s=%d", i,
+			ohci_dbg (ohci, "    psw [%d] = %2x, CC=%x %s=%d\n", i,
 				psw, cc,
 				(cc >= 0x0e) ? "OFFSET" : "SIZE",
 				psw & 0x0fff);
@@ -332,12 +333,13 @@
 
 /* caller MUST own hcd spinlock if verbose is set! */
 static void __attribute__((unused))
-ohci_dump_ed (struct ohci_hcd *ohci, char *label, struct ed *ed, int verbose)
+ohci_dump_ed (const struct ohci_hcd *ohci, const char *label,
+		const struct ed *ed, int verbose)
 {
 	u32	tmp = ed->hwINFO;
 	char	*type = "";
 
-	ohci_dbg (ohci, "%s, ed %p state 0x%x type %s; next ed %08x",
+	ohci_dbg (ohci, "%s, ed %p state 0x%x type %s; next ed %08x\n",
 		label,
 		ed, ed->state, edstring (ed->type),
 		le32_to_cpup (&ed->hwNextED));
@@ -347,7 +349,7 @@
 	/* else from TDs ... control */
 	}
 	ohci_dbg (ohci,
-		"  info %08x MAX=%d%s%s%s%s EP=%d%s DEV=%d", le32_to_cpu (tmp),
+		"  info %08x MAX=%d%s%s%s%s EP=%d%s DEV=%d\n", le32_to_cpu (tmp),
 		0x03ff & (le32_to_cpu (tmp) >> 16),
 		(tmp & ED_DEQUEUE) ? " DQ" : "",
 		(tmp & ED_ISO) ? " ISO" : "",
@@ -356,7 +358,7 @@
 		0x000f & (le32_to_cpu (tmp) >> 7),
 		type,
 		0x007f & le32_to_cpu (tmp));
-	ohci_dbg (ohci, "  tds: head %08x %s%s tail %08x%s",
+	ohci_dbg (ohci, "  tds: head %08x %s%s tail %08x%s\n",
 		tmp = le32_to_cpup (&ed->hwHeadP),
 		(ed->hwHeadP & ED_C) ? data1 : data0,
 		(ed->hwHeadP & ED_H) ? " HALT" : "",
@@ -541,24 +543,29 @@
 			if (temp == seen_count) {
 				u32	info = ed->hwINFO;
 				u32	scratch = cpu_to_le32p (&ed->hwINFO);
+				struct list_head	*entry;
+				unsigned		qlen = 0;
+
+				/* qlen measured here in TDs, not urbs */
+				list_for_each (entry, &ed->td_list)
+					qlen++;
 
 				temp = snprintf (next, size,
-					" (%cs dev%d%s ep%d%s"
+					" (%cs dev%d ep%d%s-%s qlen %u"
 					" max %d %08x%s%s)",
 					(info & ED_LOWSPEED) ? 'l' : 'f',
 					scratch & 0x7f,
-					(info & ED_ISO) ? " iso" : "",
 					(scratch >> 7) & 0xf,
 					(info & ED_IN) ? "in" : "out",
+					(info & ED_ISO) ? "iso" : "int",
+					qlen,
 					0x03ff & (scratch >> 16),
 					scratch,
-					(info & ED_SKIP) ? " s" : "",
+					(info & ED_SKIP) ? " K" : "",
 					(ed->hwHeadP & ED_H) ? " H" : "");
 				size -= temp;
 				next += temp;
 
-				// FIXME some TD info too
-
 				if (seen_count < DBG_SCHED_LIMIT)
 					seen [seen_count++] = ed;
 
@@ -617,7 +624,7 @@
 	/* hcca */
 	if (ohci->hcca)
 		ohci_dbg_sw (ohci, &next, &size,
-			"hcca frame 0x%04x\n", ohci->hcca->frame_no);
+			"hcca frame 0x%04x\n", OHCI_FRAME_NO(ohci->hcca));
 
 	/* other registers mostly affect frame timings */
 	rdata = readl (&regs->fminterval);
diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/host/ohci-hcd.c	Thu Jan  8 23:00:23 2004
@@ -226,7 +226,7 @@
 		if (retval < 0)
 			goto fail;
 		if (ed->type == PIPE_ISOCHRONOUS) {
-			u16	frame = le16_to_cpu (ohci->hcca->frame_no);
+			u16	frame = OHCI_FRAME_NO(ohci->hcca);
 
 			/* delay a few frames before the first TD */
 			frame += max_t (u16, 8, ed->interval);
@@ -281,7 +281,7 @@
 		urb_priv = urb->hcpriv;
 		if (urb_priv) {
 			if (urb_priv->ed->state == ED_OPER)
-				start_urb_unlink (ohci, urb_priv->ed);
+				start_ed_unlink (ohci, urb_priv->ed);
 		}
 	} else {
 		/*
@@ -363,7 +363,7 @@
 {
 	struct ohci_hcd		*ohci = hcd_to_ohci (hcd);
 
-	return le16_to_cpu (ohci->hcca->frame_no);
+	return OHCI_FRAME_NO(ohci->hcca);
 }
 
 /*-------------------------------------------------------------------------*
@@ -591,7 +591,7 @@
 	 */
 	spin_lock (&ohci->lock);
 	if (ohci->ed_rm_list)
-		finish_unlinks (ohci, le16_to_cpu (ohci->hcca->frame_no),
+		finish_unlinks (ohci, OHCI_FRAME_NO(ohci->hcca),
 				ptregs);
 	if ((ints & OHCI_INTR_SF) != 0 && !ohci->ed_rm_list
 			&& HCD_IS_RUNNING(ohci->hcd.state))
diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
--- a/drivers/usb/host/ohci-q.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/host/ohci-q.c	Thu Jan  8 23:00:24 2004
@@ -430,7 +430,7 @@
  * put the ep on the rm_list
  * real work is done at the next start frame (SF) hardware interrupt
  */
-static void start_urb_unlink (struct ohci_hcd *ohci, struct ed *ed)
+static void start_ed_unlink (struct ohci_hcd *ohci, struct ed *ed)
 {    
 	ed->hwINFO |= ED_DEQUEUE;
 	ed->state = ED_UNLINK;
@@ -441,7 +441,7 @@
 	 * behave.  frame_no wraps every 2^16 msec, and changes right before
 	 * SF is triggered.
 	 */
-	ed->tick = le16_to_cpu (ohci->hcca->frame_no) + 1;
+	ed->tick = OHCI_FRAME_NO(ohci->hcca) + 1;
 
 	/* rm_list is just singly linked, for simplicity */
 	ed->ed_next = ohci->ed_rm_list;
@@ -479,7 +479,8 @@
 	 * and iso; other urbs rarely need more than one TD per urb.
 	 * this way, only final tds (or ones with an error) cause IRQs.
 	 * at least immediately; use DI=6 in case any control request is
-	 * tempted to die part way through.
+	 * tempted to die part way through.  (and to force the hc to flush
+	 * its donelist soonish, even on unlink paths.)
 	 *
 	 * NOTE: could delay interrupts even for the last TD, and get fewer
 	 * interrupts ... increasing per-urb latency by sharing interrupts.
@@ -879,12 +880,27 @@
 		u32			*prev;
 
 		/* only take off EDs that the HC isn't using, accounting for
-		 * frame counter wraps.
+		 * frame counter wraps and EDs with partially retired TDs
 		 */
-		if (tick_before (tick, ed->tick)
-				&& HCD_IS_RUNNING(ohci->hcd.state)) {
-			last = &ed->ed_next;
-			continue;
+		if (likely (HCD_IS_RUNNING(ohci->hcd.state))) {
+			if (tick_before (tick, ed->tick)) {
+skip_ed:
+				last = &ed->ed_next;
+				continue;
+			}
+
+			if (!list_empty (&ed->td_list)) {
+				struct td	*td;
+				u32		head;
+
+				td = list_entry (ed->td_list.next, struct td,
+							td_list);
+				head = cpu_to_le32 (ed->hwHeadP) & TD_MASK;
+
+				/* INTR_WDH may need to clean up first */
+				if (td->td_dma != head)
+					goto skip_ed;
+			}
 		}
 
 		/* reentrancy:  if we drop the schedule lock, someone might
diff -Nru a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
--- a/drivers/usb/host/ohci.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/host/ohci.h	Thu Jan  8 23:00:24 2004
@@ -172,8 +172,14 @@
 struct ohci_hcca {
 #define NUM_INTS 32
 	__u32	int_table [NUM_INTS];	/* periodic schedule */
-	__u16	frame_no;		/* current frame number */
-	__u16	pad1;			/* set to 0 on each frame_no change */
+
+	/* 
+	 * OHCI defines u16 frame_no, followed by u16 zero pad.
+	 * Since some processors can't do 16 bit bus accesses,
+	 * portable access must be a 32 bit byteswapped access.
+	 */
+	u32	frame_no;		/* current frame number */
+#define OHCI_FRAME_NO(hccap) ((u16)le32_to_cpup(&(hccap)->frame_no))
 	__u32	done_head;		/* info returned for an interrupt */
 	u8	reserved_for_hc [116];
 	u8	what [4];		/* spec only identifies 252 bytes :) */
diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
--- a/drivers/usb/host/uhci-hcd.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/host/uhci-hcd.c	Thu Jan  8 23:00:24 2004
@@ -2182,6 +2182,9 @@
 
 	uhci->io_addr = (unsigned long) hcd->regs;
 
+	/* Turn off all interrupts */
+	outw(0, uhci->io_addr + USBINTR);
+
 	/* Maybe kick BIOS off this hardware.  Then reset, so we won't get
 	 * interrupts from any previous setup.
 	 */
diff -Nru a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c
--- a/drivers/usb/image/scanner.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/image/scanner.c	Thu Jan  8 23:00:23 2004
@@ -282,7 +282,7 @@
  *      for common error messages rather than the maintainer.
  *
  * 0.4.7  11/28/2001
- *    - Fixed typo in Documentation/scanner.txt.  Thanks to
+ *    - Fixed typo in Documentation/usb/scanner.txt.  Thanks to
  *      Karel <karel.vervaeke@pandora.be> for pointing it out.
  *    - Added ID's for a Memorex 6136u. Thanks to Álvaro Gaspar de
  *      Valenzuela" <agaspard@utsi.edu>.
@@ -380,6 +380,10 @@
  *      Visioneer scanners.
  *    - Added test for USB_CLASS_CDC_DATA which is used by some fingerprint scanners.
  *
+ * 0.4.16  2003-11-04
+ *    - Added vendor/product ids for Epson, Genius, Microtek, Plustek, Reflecta, and
+ *      Visioneer scanners. Removed ids for HP PSC devices as these are supported by
+ *      the hpoj userspace driver.
  *
  * TODO
  *    - Performance
diff -Nru a/drivers/usb/image/scanner.h b/drivers/usb/image/scanner.h
--- a/drivers/usb/image/scanner.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/image/scanner.h	Thu Jan  8 23:00:23 2004
@@ -43,7 +43,7 @@
 
 // #define DEBUG
 
-#define DRIVER_VERSION "0.4.15"
+#define DRIVER_VERSION "0.4.16"
 #define DRIVER_DESC "USB Scanner Driver"
 
 #include <linux/usb.h>
@@ -146,7 +146,12 @@
 	{ USB_DEVICE(0x0458, 0x2015) }, /* ColorPage HR7LE */
 	{ USB_DEVICE(0x0458, 0x2016) }, /* ColorPage HR6X */
 	{ USB_DEVICE(0x0458, 0x2018) },	/* ColorPage HR7X */
+	{ USB_DEVICE(0x0458, 0x201b) },	/* Colorpage Vivid 4x */
 	/* Hewlett Packard */
+	/* IMPORTANT: Hewlett-Packard multi-function peripherals (OfficeJet, 
+	   Printer/Scanner/Copier (PSC), LaserJet, or PhotoSmart printer)
+	   should not be added to this table because they are accessed by a
+	   userspace driver (hpoj) */
 	{ USB_DEVICE(0x03f0, 0x0101) },	/* ScanJet 4100C */
 	{ USB_DEVICE(0x03f0, 0x0102) },	/* PhotoSmart S20 */
 	{ USB_DEVICE(0x03f0, 0x0105) },	/* ScanJet 4200C */
@@ -168,10 +173,10 @@
 	{ USB_DEVICE(0x03F0, 0x1105) },	/* ScanJet 5470C */
 	{ USB_DEVICE(0x03f0, 0x1205) }, /* ScanJet 5550C */
 	{ USB_DEVICE(0x03f0, 0x1305) },	/* Scanjet 4570c */
-	{ USB_DEVICE(0x03f0, 0x1411) }, /* PSC 750 */
+	//	{ USB_DEVICE(0x03f0, 0x1411) }, /* PSC 750 - NOT SUPPORTED - use hpoj userspace driver */
 	{ USB_DEVICE(0x03f0, 0x2005) },	/* ScanJet 3570c */
 	{ USB_DEVICE(0x03f0, 0x2205) },	/* ScanJet 3500c */
-	{ USB_DEVICE(0x03f0, 0x2f11) }, /* PSC 1210 */
+	//	{ USB_DEVICE(0x03f0, 0x2f11) }, /* PSC 1210 - NOT SUPPORTED - use hpoj userspace driver */
 	/* Lexmark */
 	{ USB_DEVICE(0x043d, 0x002d) }, /* X70/X73 */
 	{ USB_DEVICE(0x043d, 0x003d) }, /* X83 */
@@ -187,6 +192,7 @@
 	{ USB_DEVICE(0x05da, 0x30ce) },	/* ScanMaker 3800 */
 	{ USB_DEVICE(0x05da, 0x30cf) },	/* ScanMaker 4800 */
 	{ USB_DEVICE(0x05da, 0x30d4) },	/* ScanMaker 3830 + 3840 */
+	{ USB_DEVICE(0x05da, 0x30d8) },	/* ScanMaker 5900 */
 	{ USB_DEVICE(0x04a7, 0x0224) },	/* Scanport 3000 (actually Visioneer?)*/
 	/* The following SCSI-over-USB Microtek devices are supported by the
 	   microtek driver: Enable SCSI and USB Microtek in kernel config */
@@ -245,6 +251,7 @@
 	{ USB_DEVICE(0x07b3, 0x0400) }, /* OpticPro 1248U */
 	{ USB_DEVICE(0x07b3, 0x0401) }, /* OpticPro 1248U (another one) */
 	{ USB_DEVICE(0x07b3, 0x0403) },	/* U16B */
+	{ USB_DEVICE(0x07b3, 0x0413) },	/* OpticSlim 1200 */
 	/* Primax/Colorado */
 	{ USB_DEVICE(0x0461, 0x0300) },	/* G2-300 #1 */
 	{ USB_DEVICE(0x0461, 0x0301) },	/* G2E-300 #1 */
@@ -261,6 +268,8 @@
 	{ USB_DEVICE(0x0461, 0x0383) },	/* G2E-600 */
 	/* Prolink */
 	{ USB_DEVICE(0x06dc, 0x0014) }, /* Winscan Pro 2448U */
+	/* Reflecta  */
+	{ USB_DEVICE(0x05e3, 0x0120) },	/* iScan 1800 */
 	/* Relisis */
 	// { USB_DEVICE(0x0475, 0x0103) },	/* Episode - undetected endpoint */
 	{ USB_DEVICE(0x0475, 0x0210) }, /* Scorpio Ultra 3 */
@@ -285,6 +294,7 @@
 	{ USB_DEVICE(0x04b8, 0x011c) }, /* Perfection 3200 */
 	{ USB_DEVICE(0x04b8, 0x011d) }, /* Perfection 1260 */
 	{ USB_DEVICE(0x04b8, 0x011e) }, /* Perfection 1660 Photo */
+	{ USB_DEVICE(0x04b8, 0x011f) },	/* Perfection 1670 */
 	{ USB_DEVICE(0x04b8, 0x0801) }, /* Stylus CX5200 */
 	{ USB_DEVICE(0x04b8, 0x0802) }, /* Stylus CX3200 */
 	/* Siemens */
@@ -309,6 +319,7 @@
 	{ USB_DEVICE(0x04a7, 0x0221) },	/* OneTouch 5300 USB */
 	{ USB_DEVICE(0x04a7, 0x0224) },	/* OneTouch 4800 USB */
 	{ USB_DEVICE(0x04a7, 0x0226) },	/* OneTouch 5800 USB */
+	{ USB_DEVICE(0x04a7, 0x0229) }, /* OneTouch 7100 USB */
 	{ USB_DEVICE(0x04a7, 0x022c) },	/* OneTouch 9020 USB */
 	{ USB_DEVICE(0x04a7, 0x0231) },	/* 6100 USB */
 	{ USB_DEVICE(0x04a7, 0x0311) },	/* 6200 EPP/USB */
diff -Nru a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
--- a/drivers/usb/input/hid-core.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/input/hid-core.c	Thu Jan  8 23:00:24 2004
@@ -1354,6 +1354,9 @@
 #define USB_VENDOR_ID_A4TECH		0x09DA
 #define USB_DEVICE_ID_A4TECH_WCP32PU	0x0006
 
+#define USB_VENDOR_ID_BERKSHIRE		0x0c98
+#define USB_DEVICE_ID_BERKSHIRE_PCWD	0x1140
+
 struct hid_blacklist {
 	__u16 idVendor;
 	__u16 idProduct;
@@ -1388,8 +1391,8 @@
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
-	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_HIDDEV },
-	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_HIDDEV },
+	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE },
+	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
 	{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD|HID_QUIRK_MULTI_INPUT },
 	{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD|HID_QUIRK_MULTI_INPUT },
@@ -1403,6 +1406,7 @@
 	{ USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK },
+	{ USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
 	{ 0, 0 }
 };
 
diff -Nru a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c
--- a/drivers/usb/input/hiddev.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/input/hiddev.c	Thu Jan  8 23:00:23 2004
@@ -213,6 +213,7 @@
 	  ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : 
 	   ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0));
 	uref.report_id = report->id;
+	uref.field_index = HID_FIELD_INDEX_NONE;
 
 	hiddev_send_event(hid, &uref);
 }
diff -Nru a/drivers/usb/media/Kconfig b/drivers/usb/media/Kconfig
--- a/drivers/usb/media/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/media/Kconfig	Thu Jan  8 23:00:23 2004
@@ -113,16 +113,17 @@
           webcams:
            * Philips PCA645, PCA646
            * Philips PCVC675, PCVC680, PCVC690
-           * Philips PCVC730, PCVC740, PCVC750
+           * Philips PCVC720/40, PCVC730, PCVC740, PCVC750
 	   * Askey VC010
-	   * Logitech QuickCam Pro 3000, 4000, 'Zoom' and 'Notebook'
-	   * Samsung MPC-C10, MPC-C30
-	   * Creative Webcam 5
-	   * SOTECT Afina Eye
+	   * Logitech QuickCam Pro 3000, 4000, 'Zoom', 'Notebook Pro' 
+             and 'Orbit'/'Sphere'
+           * Samsung MPC-C10, MPC-C30
+	   * Creative Webcam 5, Pro Ex
+	   * SOTEC Afina Eye
 	   * Visionite VCS-UC300, VCS-UM100
 	   
-	  The PCA635, PCVC665 and PCVC720 are not supported by this driver
-	  and never will be, but the 665 and 720 are supported by other 
+	  The PCA635, PCVC665 and PCVC720/20 are not supported by this driver
+	  and never will be, but the 665 and 720/20 are supported by other 
 	  drivers.
 
 	  This driver has an optional plugin (called PWCX), which is 
@@ -177,3 +178,30 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called stv680.
 
+config USB_W9968CF
+	tristate "USB W996[87]CF JPEG Dual Mode Camera support"
+	depends on USB && VIDEO_DEV && I2C
+	---help---
+	  Say Y here if you want support for cameras based on
+	  Winbond W9967CF/W9968CF JPEG USB Dual Mode Camera Chips.
+	
+	  This driver has an optional plugin, which is distributed as a
+	  separate module only (released under GPL). It contains code that 
+	  allows you to use higher resolutions and framerates, and can't
+	  be included into the official Linux kernel for performance 
+	  purposes.
+	  At the moment the driver needs a third-part module for the CMOS 
+	  sensors, which is available on internet: it is recommended to read
+	  <file:Documentation/usb/w9968cf.txt> for more informations and for
+	  a list of supported cameras.
+	
+	  This driver uses the Video For Linux and the I2C APIs. 
+	  You must say Y or M to both "Video For Linux" and 
+	  "I2C Support" to use this driver.
+	  Information on this API and pointers to "v4l" programs may be found
+	  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	
+	  This code is also available as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called w9968cf.o. If you want to compile it as a
+	  module, say M here and read <file:Documentation/modules.txt>.
diff -Nru a/drivers/usb/media/Makefile b/drivers/usb/media/Makefile
--- a/drivers/usb/media/Makefile	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/media/Makefile	Thu Jan  8 23:00:23 2004
@@ -13,3 +13,4 @@
 obj-$(CONFIG_USB_SE401)		+= se401.o
 obj-$(CONFIG_USB_STV680)	+= stv680.o
 obj-$(CONFIG_USB_VICAM)		+= vicam.o usbvideo.o
+obj-$(CONFIG_USB_W9968CF)	+= w9968cf.o
diff -Nru a/drivers/usb/media/pwc-ctrl.c b/drivers/usb/media/pwc-ctrl.c
--- a/drivers/usb/media/pwc-ctrl.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/media/pwc-ctrl.c	Thu Jan  8 23:00:24 2004
@@ -44,6 +44,8 @@
 #define GET_STATUS_CTL			0x06
 #define SET_EP_STREAM_CTL		0x07
 #define GET_EP_STREAM_CTL		0x08
+#define SET_MPT_CTL			0x0D
+#define GET_MPT_CTL			0x0E
 
 /* Selectors for the Luminance controls [GS]ET_LUM_CTL */
 #define AGC_MODE_FORMATTER			0x2000
@@ -88,6 +90,11 @@
 /* Formatters for the Video Endpoint controls [GS]ET_EP_STREAM_CTL */
 #define VIDEO_OUTPUT_CONTROL_FORMATTER		0x0100
 
+/* Formatters for the motorized pan & tilt [GS]ET_MPT_CTL */
+#define PT_RELATIVE_CONTROL_FORMATTER		0x01
+#define PT_RESET_CONTROL_FORMATTER		0x02
+#define PT_STATUS_FORMATTER			0x03
+
 static char *size2name[PSZ_MAX] =
 {
 	"subQCIF",
@@ -435,6 +442,7 @@
 		ret = set_video_mode_Timon(pdev, size, frames, compression, snapshot);
 		break;
 		
+	case 720:
 	case 730:
 	case 740:
 	case 750:
@@ -745,6 +753,7 @@
 			buf[1] = speed >> 8;
 			buf[0] = speed & 0xff;
 			break;
+		case 720:
 		case 730:
 		case 740:
 		case 750:
@@ -1243,6 +1252,46 @@
 	return buf;
 }
 
+int pwc_mpt_reset(struct pwc_device *pdev, int flags)
+{
+	unsigned char buf;
+	
+	buf = flags & 0x03; // only lower two bits are currently used 
+	return SendControlMsg(SET_MPT_CTL, PT_RESET_CONTROL_FORMATTER, 1);
+}
+
+static inline int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt)
+{
+	unsigned char buf[4];
+	
+	/* set new relative angle; angles are expressed in degrees * 100,
+	   but cam as .5 degree resolution, hence devide by 200. Also
+	   the angle must be multiplied by 64 before it's send to
+	   the cam (??)
+	 */
+	pan  =  64 * pan  / 100;
+	tilt = -64 * tilt / 100; /* positive tilt is down, which is not what the user would expect */
+	buf[0] = pan & 0xFF;
+	buf[1] = (pan >> 8) & 0xFF;
+	buf[2] = tilt & 0xFF;
+	buf[3] = (tilt >> 8) & 0xFF;
+	return SendControlMsg(SET_MPT_CTL, PT_RELATIVE_CONTROL_FORMATTER, 4);
+}
+
+static inline int pwc_mpt_get_status(struct pwc_device *pdev, struct pwc_mpt_status *status)
+{
+	int ret;
+	unsigned char buf[5];
+	
+	ret = RecvControlMsg(GET_MPT_CTL, PT_STATUS_FORMATTER, 5);
+	if (ret < 0)
+		return ret;
+	status->status = buf[0] & 0x7; // 3 bits are used for reporting
+	status->time_pan = (buf[1] << 8) + buf[2];
+	status->time_tilt = (buf[3] << 8) + buf[4];
+	return 0;
+}
+
 
 int pwc_get_cmos_sensor(struct pwc_device *pdev)
 {
@@ -1512,8 +1561,128 @@
 		size->width = pdev->image.x;
 		size->height = pdev->image.y;
 		break;
-	}	
-
+ 	}
+ 	
+ 	case VIDIOCPWCMPTRESET:
+ 	{
+ 		int *flags = arg;
+ 		
+ 		if (pdev->features & FEATURE_MOTOR_PANTILT)
+ 		{
+			ret = pwc_mpt_reset(pdev, *flags);
+ 			if (ret >= 0)
+ 			{
+ 				pdev->pan_angle = 0;
+ 				pdev->tilt_angle = 0;
+ 			}
+ 		}
+ 		else
+ 		{
+ 			ret = -ENXIO;
+ 		}
+ 		break;		
+ 	}
+ 	case VIDIOCPWCMPTGRANGE:
+ 	{
+ 		if (pdev->features & FEATURE_MOTOR_PANTILT)
+ 		{
+ 			memcpy(arg, &pdev->angle_range, sizeof(struct pwc_mpt_range));
+ 		}
+ 		else
+ 		{	
+ 			ret = -ENXIO;
+ 		}
+ 		break;
+ 	}
+ 	
+ 	case VIDIOCPWCMPTSANGLE:
+ 	{
+ 		struct pwc_mpt_angles *angles = arg;
+ 		int new_pan, new_tilt;
+ 		
+ 		if (pdev->features & FEATURE_MOTOR_PANTILT)
+ 		{
+			/* The camera can only set relative angles, so
+			   do some calculations when getting an absolute angle .
+			 */
+			if (angles->absolute)
+			{
+ 				new_pan  = angles->pan; 
+ 				new_tilt = angles->tilt;
+ 			}
+ 			else
+ 			{
+ 				new_pan  = pdev->pan_angle  + angles->pan;
+ 				new_tilt = pdev->tilt_angle + angles->tilt;
+			}
+			/* check absolute ranges */
+			if (new_pan  < pdev->angle_range.pan_min  ||
+			    new_pan  > pdev->angle_range.pan_max  ||
+			    new_tilt < pdev->angle_range.tilt_min ||
+			    new_tilt > pdev->angle_range.tilt_max)
+			{
+				ret = -ERANGE;
+			}
+			else
+			{
+				/* go to relative range, check again */
+				new_pan  -= pdev->pan_angle;
+				new_tilt -= pdev->tilt_angle;
+				/* angles are specified in degrees * 100, thus the limit = 36000 */
+				if (new_pan < -36000 || new_pan > 36000 || new_tilt < -36000 || new_tilt > 36000)
+					ret = -ERANGE;
+			}
+			if (ret == 0) /* no errors so far */
+			{
+				ret = pwc_mpt_set_angle(pdev, new_pan, new_tilt);
+				if (ret >= 0)
+				{
+					pdev->pan_angle  += new_pan;
+					pdev->tilt_angle += new_tilt;
+				}
+				if (ret == -EPIPE) /* stall -> out of range */
+					ret = -ERANGE;				
+			}
+ 		}
+ 		else
+ 		{
+ 			ret = -ENXIO;
+ 		}
+ 		break;
+ 	} 
+ 	
+ 	case VIDIOCPWCMPTGANGLE:
+ 	{
+ 		struct pwc_mpt_angles *angles = arg;
+ 		
+ 		if (pdev->features & FEATURE_MOTOR_PANTILT)
+ 		{
+ 			angles->absolute = 1;
+ 			angles->pan  = pdev->pan_angle;
+ 			angles->tilt = pdev->tilt_angle;
+ 		}
+ 		else
+ 		{
+ 			ret = -ENXIO;
+ 		}
+ 		break;
+ 	}
+ 
+ 	case VIDIOCPWCMPTSTATUS:
+ 	{
+ 		struct pwc_mpt_status *status = arg;
+ 	
+ 		if (pdev->features & FEATURE_MOTOR_PANTILT)
+ 		{
+ 			ret = pwc_mpt_get_status(pdev, status);
+ 		}
+ 		else
+ 		{
+ 			ret = -ENXIO;
+ 		}
+  		break;
+  	}
+  	
 	default:
 		ret = -ENOIOCTLCMD;
 		break;
diff -Nru a/drivers/usb/media/pwc-if.c b/drivers/usb/media/pwc-if.c
--- a/drivers/usb/media/pwc-if.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/media/pwc-if.c	Thu Jan  8 23:00:24 2004
@@ -79,9 +79,9 @@
 	{ USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
 	{ USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
 	{ USB_DEVICE(0x046D, 0x08B2) }, /* Logitech QuickCam Pro 4000 */
-	{ USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom */
-	{ USB_DEVICE(0x046D, 0x08B4) }, /* Logitech (reserved) */
-	{ USB_DEVICE(0x046D, 0x08B5) }, /* Logitech (reserved) */
+	{ USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom (old model) */
+	{ USB_DEVICE(0x046D, 0x08B4) }, /* Logitech QuickCam Zoom (new model) */
+	{ USB_DEVICE(0x046D, 0x08B5) }, /* Logitech QuickCam Orbit/Sphere */
 	{ USB_DEVICE(0x046D, 0x08B6) }, /* Logitech (reserved) */
 	{ USB_DEVICE(0x046D, 0x08B7) }, /* Logitech (reserved) */
 	{ USB_DEVICE(0x046D, 0x08B8) }, /* Logitech (reserved) */
@@ -129,6 +129,7 @@
 
 static int pwc_video_open(struct inode *inode, struct file *file);
 static int pwc_video_close(struct inode *inode, struct file *file);
+static int pwc_video_release(struct video_device *);			  
 static ssize_t pwc_video_read(struct file *file, char *buf,
 			  size_t count, loff_t *ppos);
 static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
@@ -918,21 +919,32 @@
 
 int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot)
 {
-	int ret;
+	int ret, start;
 
 	/* Stop isoc stuff */
 	pwc_isoc_cleanup(pdev);
 	/* Reset parameters */
 	pwc_reset_buffers(pdev);
 	/* Try to set video mode... */
-	ret = pwc_set_video_mode(pdev, width, height, new_fps, new_compression, new_snapshot);
-	if (ret) /* That failed... restore old mode (we know that worked) */
-		ret = pwc_set_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, pdev->vcompression, pdev->vsnapshot);
-	if (!ret)
-		if (pwc_isoc_init(pdev) < 0)
-			Info("Failed to restart ISOC transfer in pwc_try_video_mode.\n");
+	start = ret = pwc_set_video_mode(pdev, width, height, new_fps, new_compression, new_snapshot);
+	if (ret) { 
+	        Trace(TRACE_FLOW, "pwc_set_video_mode attempt 1 failed.\n");
+		/* That failed... restore old mode (we know that worked) */
+		start = pwc_set_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, pdev->vcompression, pdev->vsnapshot);
+		if (start) {
+		        Trace(TRACE_FLOW, "pwc_set_video_mode attempt 2 failed.\n");
+		}
+	}
+	if (start == 0) 
+	{
+		if (pwc_isoc_init(pdev) < 0) 
+		{
+			Info("Failed to restart ISOC transfers in pwc_try_video_mode.\n");
+			ret = -EAGAIN; /* let's try again, who knows if it works a second time */
+		}
+	}
 	pdev->drop_frames++; /* try to avoid garbage during switch */
-	return ret;
+	return ret; /* Return original error code */
 }
 
 
@@ -997,6 +1009,7 @@
 #if PWC_DEBUG	
 	Debug("Found decompressor for %d at 0x%p\n", pdev->type, pdev->decompressor);
 #endif
+	pwc_construct(pdev); /* set min/max sizes correct */
 
 	/* So far, so good. Allocate memory. */
 	i = pwc_allocate_buffers(pdev);
@@ -1018,6 +1031,7 @@
 #if PWC_DEBUG
 	pdev->sequence = 0;
 #endif
+	pwc_construct(pdev); /* set min/max sizes correct */
 
 	/* Set some defaults */
 	pdev->vsnapshot = 0;
@@ -1104,6 +1118,12 @@
 	return 0;
 }
 
+static int pwc_video_release(struct video_device *vfd)
+{
+	Trace(TRACE_OPEN, "pwc_video_release() called. Now what?\n");
+}
+		
+
 /*
  *	FIXME: what about two parallel reads ????
  *      ANSWER: Not supported. You can't open the device more than once,
@@ -1124,7 +1144,7 @@
 	int noblock = file->f_flags & O_NONBLOCK;
 	DECLARE_WAITQUEUE(wait, current);
 
-	Trace(TRACE_READ, "video_read(0x%p, %p, %Zd) called.\n", vdev, buf, count);
+	Trace(TRACE_READ, "video_read(0x%p, %p, %d) called.\n", vdev, buf, count);
 	if (vdev == NULL)
 		return -EFAULT;
 	pdev = vdev->priv;
@@ -1568,6 +1588,7 @@
 	struct pwc_device *pdev = NULL;
 	int vendor_id, product_id, type_id;
 	int i, hint;
+	int features = 0;
 	int video_nr = -1; /* default: use next available device */
 	char serial_number[30], *name;
 
@@ -1677,8 +1698,17 @@
 			name = "Logitech QuickCam Zoom";
 			type_id = 740; /* CCD sensor */
 			break;
-		case 0x08b4:
+		case 0x08B4:
+			Info("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
+			name = "Logitech QuickCam Zoom";
+			type_id = 740; /* CCD sensor */
+			break;
 		case 0x08b5:
+			Info("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
+			name = "Logitech QuickCam Orbit";
+			type_id = 740; /* CCD sensor */
+			features |= FEATURE_MOTOR_PANTILT;
+			break;
 		case 0x08b6:
 		case 0x08b7:
 		case 0x08b8:
@@ -1776,9 +1806,22 @@
 	}
 	memset(pdev, 0, sizeof(struct pwc_device));
 	pdev->type = type_id;
-	pwc_construct(pdev);
 	pdev->vsize = default_size;
 	pdev->vframes = default_fps;
+	pdev->features = features;
+	if (vendor_id == 0x046D && product_id == 0x08B5)
+	{
+		/* Logitech QuickCam Orbit
+	           The ranges have been determined experimentally; they may differ from cam to cam.
+	           Also, the exact ranges left-right and up-down are different for my cam
+	          */
+		pdev->angle_range.pan_min  = -7000;
+		pdev->angle_range.pan_max  =  7000;
+		pdev->angle_range.tilt_min = -3000;
+		pdev->angle_range.tilt_max =  2500;
+		pdev->angle_range.zoom_min = -1;
+		pdev->angle_range.zoom_max = -1;
+	}
 
 	init_MUTEX(&pdev->modlock);
 	pdev->ptrlock = SPIN_LOCK_UNLOCKED;
@@ -1791,7 +1834,7 @@
 	strcpy(pdev->vdev.name, name);
 	pdev->vdev.owner = THIS_MODULE;
 	pdev->vdev.priv = pdev;
-
+	
 	pdev->release = udev->descriptor.bcdDevice;
 	Trace(TRACE_PROBE, "Release: %04x\n", pdev->release);
 
@@ -1809,6 +1852,7 @@
 		}
 	}
 
+	pdev->vdev.release = pwc_video_release;
 	i = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, video_nr);
 	if (i < 0) {
 		Err("Failed to register as video device (%d).\n", i);
@@ -1818,6 +1862,7 @@
 	else {
 		Info("Registered as /dev/video%d.\n", pdev->vdev.minor & 0x3F);
 	}
+
 	/* occupy slot */
 	if (hint < MAX_DEV_HINTS) 
 		device_hint[hint].pdev = pdev;
diff -Nru a/drivers/usb/media/pwc-ioctl.h b/drivers/usb/media/pwc-ioctl.h
--- a/drivers/usb/media/pwc-ioctl.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/media/pwc-ioctl.h	Thu Jan  8 23:00:24 2004
@@ -112,6 +112,43 @@
 	int height;
 };
 
+/* Defines and structures for Motorized Pan & Tilt */
+#define PWC_MPT_PAN		0x01
+#define PWC_MPT_TILT		0x02
+#define PWC_MPT_TIMEOUT		0x04 /* for status */
+
+/* Set angles; when absolute = 1, the angle is absolute and the 
+   driver calculates the relative offset for you. This can only
+   be used with VIDIOCPWCSANGLE; VIDIOCPWCGANGLE always returns
+   absolute angles.
+ */   
+struct pwc_mpt_angles
+{
+	int absolute;		/* write-only */
+	int pan;		/* degrees * 100 */
+	int tilt;		/* degress * 100 */
+	int zoom;		/* N/A, set to -1 */
+};
+
+/* Range of angles of the camera, both horizontally and vertically.
+   The zoom is not used, maybe in the future...
+
+ */
+struct pwc_mpt_range
+{
+	int pan_min, pan_max;		/* degrees * 100 */
+	int tilt_min, tilt_max;
+	int zoom_min, zoom_max;		/* -1, -1 */
+};
+
+struct pwc_mpt_status
+{
+	int status;
+	int time_pan;
+	int time_tilt;
+};
+
+
  /* Restore user settings */
 #define VIDIOCPWCRUSER		_IO('v', 192)
  /* Save user settings */
@@ -181,5 +218,12 @@
 
  /* Real image size as used by the camera; tells you whether or not there's a gray border around the image */
 #define VIDIOCPWCGREALSIZE	_IOR('v', 210, struct pwc_imagesize)
+
+ /* Motorized pan & tilt functions */ 
+#define VIDIOCPWCMPTRESET	_IOW('v', 211, int)
+#define VIDIOCPWCMPTGRANGE	_IOR('v', 211, struct pwc_mpt_range)
+#define VIDIOCPWCMPTSANGLE	_IOW('v', 212, struct pwc_mpt_angles)
+#define VIDIOCPWCMPTGANGLE	_IOR('v', 212, struct pwc_mpt_angles)
+#define VIDIOCPWCMPTSTATUS	_IOR('v', 213, struct pwc_mpt_status)
  
 #endif
diff -Nru a/drivers/usb/media/pwc-misc.c b/drivers/usb/media/pwc-misc.c
--- a/drivers/usb/media/pwc-misc.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/media/pwc-misc.c	Thu Jan  8 23:00:23 2004
@@ -52,7 +52,7 @@
 	return find;
 }
 
-/* initialize variables depending on type */
+/* initialize variables depending on type and decompressor*/
 void pwc_construct(struct pwc_device *pdev)
 {
 	switch(pdev->type) {
@@ -73,9 +73,17 @@
 	case 690:
 		pdev->view_min.x = 128;
 		pdev->view_min.y =  96;
-		pdev->view_max.x = 640;
-		pdev->view_max.y = 480;
-		pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA;
+		/* Anthill bug #38: PWC always reports max size, even without PWCX */
+		if (pdev->decompressor != NULL) {
+			pdev->view_max.x = 640;
+			pdev->view_max.y = 480;
+			pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA;
+		}
+		else {
+			pdev->view_max.x = 352;
+			pdev->view_max.y = 288;
+			pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF;
+		}
 		pdev->vcinterface = 3;
 		pdev->vendpoint = 4;
 		pdev->frame_header_size = 0;
@@ -87,9 +95,18 @@
 	case 750:
 		pdev->view_min.x = 160;
 		pdev->view_min.y = 120;
-		pdev->view_max.x = 640;
-		pdev->view_max.y = 480;
-		pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA;
+		/* Anthill bug #38: PWC always reports max size, even without PWCX */
+		if (pdev->decompressor != NULL) {
+			pdev->view_max.x = 640;
+			pdev->view_max.y = 480;
+			pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA;
+		}
+		else {
+			/* Tell CIF, even though SIF really is the maximum, but some tools really need CIF */
+			pdev->view_max.x = 352;
+			pdev->view_max.y = 288;
+			pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF;
+		}
 		pdev->vcinterface = 3;
 		pdev->vendpoint = 5;
 		pdev->frame_header_size = TOUCAM_HEADER_SIZE;
diff -Nru a/drivers/usb/media/pwc.h b/drivers/usb/media/pwc.h
--- a/drivers/usb/media/pwc.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/media/pwc.h	Thu Jan  8 23:00:24 2004
@@ -18,17 +18,21 @@
 #ifndef PWC_H
 #define PWC_H
 
+#include <linux/version.h>
+
 #include <linux/config.h>
 #include <linux/module.h>
-#include <linux/usb.h>
+#include <linux/smp_lock.h>
 #include <linux/spinlock.h>
+#include <linux/usb.h>
 #include <linux/videodev.h>
 #include <linux/wait.h>
-#include <linux/smp_lock.h>
 
 #include <asm/semaphore.h>
 #include <asm/errno.h>
 
+#include "pwc-ioctl.h"
+
 /* Defines and structures for the Philips webcam */
 /* Used for checking memory corruption/pointer validation */
 #define PWC_MAGIC 0x89DC10ABUL
@@ -58,10 +62,12 @@
 #define TOUCAM_HEADER_SIZE		8
 #define TOUCAM_TRAILER_SIZE		4
 
+#define FEATURE_MOTOR_PANTILT		0x0001
+
 /* Version block */
 #define PWC_MAJOR	8
-#define PWC_MINOR	11
-#define PWC_VERSION 	"8.11"
+#define PWC_MINOR	12
+#define PWC_VERSION 	"8.12"
 #define PWC_NAME 	"pwc"
 
 /* Turn certain features on/off */
@@ -119,8 +125,9 @@
    /* Pointer to our usb_device */
    struct usb_device *udev;
    
-   int type;                    /* type of cam (645, 646, 675, 680, 690) */
+   int type;                    /* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */
    int release;			/* release number */
+   int features;		/* feature bits */
    int error_status;		/* set when something goes wrong with the cam (unplugged, USB errors) */
    int usb_init;		/* set when the cam has been initialized over USB */
 
@@ -193,6 +200,11 @@
 
    struct semaphore modlock;		/* to prevent races in video_open(), etc */
    spinlock_t ptrlock;			/* for manipulating the buffer pointers */
+
+   /*** motorized pan/tilt feature */
+   struct pwc_mpt_range angle_range;
+   int pan_angle;			/* in degrees * 100 */
+   int tilt_angle;			/* absolute angle; 0,0 is home position */
 
    /*** Misc. data ***/
    wait_queue_head_t frameq;		/* When waiting for a frame to finish... */
diff -Nru a/drivers/usb/media/w9968cf.c b/drivers/usb/media/w9968cf.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/usb/media/w9968cf.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,3712 @@
+/***************************************************************************
+ * Video4Linux driver for W996[87]CF JPEG USB Dual Mode Camera Chip.       *
+ *                                                                         *
+ * Copyright (C) 2002 2003 by Luca Risolia <luca_ing@libero.it>            *
+ *                                                                         *
+ * - Memory management code from bttv driver by Ralph Metzler,             *
+ *   Marcus Metzler and Gerd Knorr.                                        *
+ * - I2C interface to kernel, high-level CMOS sensor control routines and  *
+ *   some symbolic names from OV511 driver by Mark W. McClelland.          *
+ * - Low-level I2C fast write function by Piotr Czerczak.                  *
+ * - Low-level I2C read function by FrÃ©dÃ©ric Jouault.                      *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 2 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program; if not, write to the Free Software             *
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
+ ***************************************************************************/
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/vmalloc.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/ioctl.h>
+#include <linux/delay.h>
+#include <asm/page.h>
+#include <asm/uaccess.h>
+
+#include "w9968cf.h"
+#include "w9968cf_decoder.h"
+
+
+
+/****************************************************************************
+ * Modules paramaters                                                       *
+ ****************************************************************************/
+
+static u8 vppmod_load = W9968CF_VPPMOD_LOAD;
+static u8 simcams = W9968CF_SIMCAMS;
+static int video_nr[]={[0 ... W9968CF_MAX_DEVICES-1] = -1}; /* -1=first free */
+static u16 packet_size[] = {[0 ... W9968CF_MAX_DEVICES-1]=W9968CF_PACKET_SIZE};
+static u8 max_buffers[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_BUFFERS};
+static u8 double_buffer[] = {[0 ... W9968CF_MAX_DEVICES-1] = 
+                             W9968CF_DOUBLE_BUFFER};
+static u8 clamping[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_CLAMPING};
+static u8 filter_type[]= {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_FILTER_TYPE};
+static u8 largeview[]= {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_LARGEVIEW};
+static u8 decompression[] = {[0 ... W9968CF_MAX_DEVICES-1] = 
+                             W9968CF_DECOMPRESSION};
+static u8 upscaling[]= {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_UPSCALING};
+static u8 force_palette[] = {[0 ... W9968CF_MAX_DEVICES-1] = 0};
+static u8 force_rgb[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_FORCE_RGB};
+static u8 autobright[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_AUTOBRIGHT};
+static u8 autoexp[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_AUTOEXP};
+static u8 lightfreq[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_LIGHTFREQ};
+static u8 bandingfilter[] = {[0 ... W9968CF_MAX_DEVICES-1]=
+                             W9968CF_BANDINGFILTER};
+static int clockdiv[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_CLOCKDIV};
+static u8 backlight[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_BACKLIGHT};
+static u8 mirror[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_MIRROR};
+static u8 sensor_mono[] = {[0 ... W9968CF_MAX_DEVICES-1]=W9968CF_SENSOR_MONO};
+static u16 brightness[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_BRIGHTNESS};
+static u16 hue[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_HUE};
+static u16 colour[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_COLOUR};
+static u16 contrast[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_CONTRAST};
+static u16 whiteness[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_WHITENESS};
+#ifdef W9968CF_DEBUG
+static u8 debug = W9968CF_DEBUG_LEVEL;
+static u8 specific_debug = W9968CF_SPECIFIC_DEBUG;
+#endif
+
+MODULE_AUTHOR("Luca Risolia <luca_ing@libero.it>");
+
+MODULE_DESCRIPTION("Video4Linux driver for "
+                   "W996[87]CF JPEG USB Dual Mode Camera Chip");
+
+MODULE_SUPPORTED_DEVICE("Video");
+
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(vppmod_load, "i");
+MODULE_PARM(simcams, "i");
+MODULE_PARM(video_nr, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(packet_size, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(max_buffers, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(double_buffer, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(clamping, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(filter_type, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(largeview, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(decompression, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(upscaling, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(force_palette, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(force_rgb, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "i");
+MODULE_PARM(autobright, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(autoexp, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(lightfreq, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(bandingfilter, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(clockdiv, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(backlight, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(mirror, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(sensor_mono, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(brightness, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(hue, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(colour, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(contrast, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+MODULE_PARM(whiteness, "0-" __MODULE_STRING(W9968CF_MAX_DEVICES) "l");
+#ifdef W9968CF_DEBUG
+MODULE_PARM(debug, "i");
+MODULE_PARM(specific_debug, "i");
+#endif
+
+MODULE_PARM_DESC(vppmod_load, 
+                 "\n<0|1> Automatic 'w9968cf-vpp' module loading."
+                 "\n0 disable, 1 enable."
+                 "\nIf enabled, every time an application attempts to open a"
+                 "\ncamera, 'insmod' searches for the video post-processing"
+                 "\nmodule in the system and loads it automatically (if"
+                 "\npresent). The 'w9968cf-vpp' module adds extra image"
+                 "\nmanipulation functions to the 'w9968cf' module, like"
+                 "\nsoftware up-scaling,colour conversions and video decoding."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_VPPMOD_LOAD)"."
+                 "\n");
+MODULE_PARM_DESC(simcams, 
+                 "\n<n> Number of cameras allowed to stream simultaneously."
+                 "\nn may vary from 0 to "
+                 __MODULE_STRING(W9968CF_MAX_DEVICES)"."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_SIMCAMS)"."
+                 "\n");
+MODULE_PARM_DESC(video_nr,
+                 "\n<-1|n[,...]> Specify V4L minor mode number."
+                 "\n -1 = use next available (default)"
+                 "\n  n = use minor number n (integer >= 0)"
+                 "\nYou can specify " __MODULE_STRING(W9968CF_MAX_DEVICES)
+                 " cameras this way."
+                 "\nFor example:"
+                 "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
+                 "\nthe second camera and use auto for the first"
+                 "\none and for every other camera."
+                 "\n");
+MODULE_PARM_DESC(packet_size,
+                 "\n<n[,...]> Specify the maximum data payload"
+                 "\nsize in bytes for alternate settings, for each device."
+                 "\nn is scaled between 63 and 1023 "
+                 "(default is "__MODULE_STRING(W9968CF_PACKET_SIZE)")."
+                 "\n");
+MODULE_PARM_DESC(max_buffers,
+                 "\n<n[,...]> Only for advanced users."
+                 "\nSpecify the maximum number of video frame buffers"
+                 "\nto allocate for each device, from 2 to "
+                 __MODULE_STRING(W9968CF_MAX_BUFFERS)
+                 ". (default is "__MODULE_STRING(W9968CF_BUFFERS)")."
+                 "\n");
+MODULE_PARM_DESC(double_buffer, 
+                 "\n<0|1[,...]> "
+                 "Hardware double buffering: 0 disabled, 1 enabled."
+                 "\nIt should be enabled if you want smooth video output: if"
+                 "\nyou obtain out of sync. video, disable it at all, or try"
+                 "\nto decrease the 'clockdiv' module paramater value."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_DOUBLE_BUFFER)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(clamping, 
+                 "\n<0|1[,...]> Video data clamping: 0 disabled, 1 enabled."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_CLAMPING)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(filter_type, 
+                 "\n<0|1|2[,...]> Video filter type."
+                 "\n0 none, 1 (1-2-1) 3-tap filter, "
+                 "2 (2-3-6-3-2) 5-tap filter."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_FILTER_TYPE)
+                 " for every device."
+                 "\nThe filter is used to reduce noise and aliasing artifacts"
+                 "\nproduced by the CCD or CMOS sensor, and the scaling"
+                 " process."
+                 "\n");
+MODULE_PARM_DESC(largeview, 
+                 "\n<0|1[,...]> Large view: 0 disabled, 1 enabled."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_LARGEVIEW)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(upscaling, 
+                 "\n<0|1[,...]> Software scaling (for non-compressed video):"
+                 "\n0 disabled, 1 enabled."
+                 "\nDisable it if you have a slow CPU or you don't have"
+                 " enough memory."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_UPSCALING)
+                 " for every device."
+                 "\nIf 'w9968cf-vpp' is not loaded, this paramater is"
+                 " set to 0.");
+MODULE_PARM_DESC(decompression,
+                 "\n<0|1|2[,...]> Software video decompression:"
+                 "\n- 0 disables decompression (doesn't allow formats needing"
+                 " decompression)"
+                 "\n- 1 forces decompression (allows formats needing"
+                 " decompression only);"
+                 "\n- 2 allows any permitted formats."
+                 "\nFormats supporting compressed video are YUV422P and"
+                 " YUV420P/YUV420 "
+                 "\nin any resolutions where both width and height are "
+                 "a multiple of 16."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_DECOMPRESSION)
+                 " for every device."
+                 "\nIf 'w9968cf-vpp' is not loaded, forcing decompression is "
+                 "\nnot allowed; in this case this paramater is set to 2.");
+MODULE_PARM_DESC(force_palette,
+                 "\n<0"
+                 "|" __MODULE_STRING(VIDEO_PALETTE_UYVY)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_YUV420)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_YUV422P)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_YUV420P)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_YUYV)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_YUV422)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_GREY)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_RGB555)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_RGB565)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_RGB24)
+                 "|" __MODULE_STRING(VIDEO_PALETTE_RGB32)
+                 "[,...]>"
+                 " Force picture palette."
+                 "\nIn order:"
+                 "\n- 0 allows any of the following formats:"
+                 "\n- UYVY    16 bpp - Original video, compression disabled"
+                 "\n- YUV420  12 bpp - Original video, compression enabled"
+                 "\n- YUV422P 16 bpp - Original video, compression enabled"
+                 "\n- YUV420P 12 bpp - Original video, compression enabled"
+                 "\n- YUVY    16 bpp - Software conversion from UYVY"
+                 "\n- YUV422  16 bpp - Software conversion from UYVY"
+                 "\n- GREY     8 bpp - Software conversion from UYVY"
+                 "\n- RGB555  16 bpp - Software conversion from UYVY"
+                 "\n- RGB565  16 bpp - Software conversion from UYVY"
+                 "\n- RGB24   24 bpp - Software conversion from UYVY"
+                 "\n- RGB32   32 bpp - Software conversion from UYVY"
+                 "\nWhen not 0, this paramater will override 'decompression'."
+                 "\nDefault value is 0 for every device."
+                 "\nInitial palette is "
+                 __MODULE_STRING(W9968CF_PALETTE_DECOMP_ON)"."
+                 "\nIf 'w9968cf-vpp' is not loaded, this paramater is"
+                 " set to 9 (UYVY).");
+MODULE_PARM_DESC(force_rgb, 
+                 "\n<0|1[,...]> Read RGB video data instead of BGR:"
+                 "\n 1 = use RGB component ordering."
+                 "\n 0 = use BGR component ordering."
+                 "\nThis parameter has effect when using RGBX palettes only."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_FORCE_RGB)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(autobright,
+                 "\n<0|1[,...]> CMOS sensor automatically changes brightness:"
+                 "\n 0 = no, 1 = yes"
+                 "\nDefault value is "__MODULE_STRING(W9968CF_AUTOBRIGHT)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(autoexp,
+                 "\n<0|1[,...]> CMOS sensor automatically changes exposure:"
+                 "\n 0 = no, 1 = yes"
+                 "\nDefault value is "__MODULE_STRING(W9968CF_AUTOEXP)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(lightfreq,
+                 "\n<50|60[,...]> Light frequency in Hz:"
+                 "\n 50 for European and Asian lighting,"
+                 " 60 for American lighting."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_LIGHTFREQ)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(bandingfilter,
+                 "\n<0|1[,...]> Banding filter to reduce effects of"
+                 " fluorescent lighting:"
+                 "\n 0 disabled, 1 enabled."
+                 "\nThis filter tries to reduce the pattern of horizontal"
+                 "\nlight/dark bands caused by some (usually fluorescent)"
+                 " lighting."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_BANDINGFILTER)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(clockdiv,
+                 "\n<-1|n[,...]> "
+                 "Force pixel clock divisor to a specific value (for experts):"
+                 "\n  n may vary from 0 to 127."
+                 "\n -1 for automatic value."
+                 "\nSee also the 'double_buffer' module paramater."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_CLOCKDIV)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(backlight,
+                 "\n<0|1[,...]> Objects are lit from behind:"
+                 "\n 0 = no, 1 = yes"
+                 "\nDefault value is "__MODULE_STRING(W9968CF_BACKLIGHT)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(mirror,
+                 "\n<0|1[,...]> Reverse image horizontally:"
+                 "\n 0 = no, 1 = yes"
+                 "\nDefault value is "__MODULE_STRING(W9968CF_MIRROR)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(sensor_mono,
+                 "\n<0|1[,...]> The OV CMOS sensor is monochrome:"
+                 "\n 0 = no, 1 = yes"
+                 "\nDefault value is "__MODULE_STRING(W9968CF_SENSOR_MONO)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(brightness, 
+                 "\n<n[,...]> Set picture brightness (0-65535)."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_BRIGHTNESS)
+                 " for every device."
+                 "\nThis parameter has no effect if 'autobright' is enabled."
+                 "\n");
+MODULE_PARM_DESC(hue, 
+                 "\n<n[,...]> Set picture hue (0-65535)."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_HUE)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(colour, 
+                 "\n<n[,...]> Set picture saturation (0-65535)."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_COLOUR)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(contrast, 
+                 "\n<n[,...]> Set picture contrast (0-65535)."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_CONTRAST)
+                 " for every device."
+                 "\n");
+MODULE_PARM_DESC(whiteness, 
+                 "\n<n[,...]> Set picture whiteness (0-65535)."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_WHITENESS)
+                 " for every device."
+                 "\n");
+#ifdef W9968CF_DEBUG
+MODULE_PARM_DESC(debug,
+                 "\n<n> Debugging information level, from 0 to 6:"
+                 "\n0 = none (be cautious)"
+                 "\n1 = critical errors"
+                 "\n2 = significant informations"
+                 "\n3 = configuration or general messages"
+                 "\n4 = warnings"
+                 "\n5 = called functions"
+                 "\n6 = function internals"
+                 "\nLevel 5 and 6 are useful for testing only, when just "
+                 "one device is used."
+                 "\nDefault value is "__MODULE_STRING(W9968CF_DEBUG_LEVEL)"."
+                 "\n");
+MODULE_PARM_DESC(specific_debug,
+                 "\n<0|1> Enable or disable specific debugging messages:"
+                 "\n0 = print messages concerning every level"
+                 " <= 'debug' level."
+                 "\n1 = print messages concerning the level"
+                 " indicated by 'debug'."
+                 "\nDefault value is "
+                 __MODULE_STRING(W9968CF_SPECIFIC_DEBUG)"."
+                 "\n");
+#endif /* W9968CF_DEBUG */
+
+
+
+/****************************************************************************
+ * Some prototypes                                                          *
+ ****************************************************************************/
+
+/* Video4linux interface */
+static struct file_operations w9968cf_fops;
+static int w9968cf_open(struct inode*, struct file*);
+static int w9968cf_release(struct inode*, struct file*);
+static ssize_t w9968cf_read(struct file*, char*, size_t, loff_t*);
+static int w9968cf_mmap(struct file*, struct vm_area_struct*);
+static int w9968cf_ioctl(struct inode*, struct file*,
+                         unsigned int, unsigned long);
+static int w9968cf_do_ioctl(struct w9968cf_device*, unsigned int, void*);
+
+/* USB-specific */
+static void w9968cf_urb_complete(struct urb *urb, struct pt_regs *regs);
+static int w9968cf_start_transfer(struct w9968cf_device*);
+static int w9968cf_stop_transfer(struct w9968cf_device*);
+static int w9968cf_write_reg(struct w9968cf_device*, u16 value, u16 index);
+static int w9968cf_read_reg(struct w9968cf_device*, u16 index);
+static int w9968cf_write_fsb(struct w9968cf_device*, u16* data);
+static int w9968cf_write_sb(struct w9968cf_device*, u16 value);
+static int w9968cf_read_sb(struct w9968cf_device*);
+static int w9968cf_upload_quantizationtables(struct w9968cf_device*);
+
+/* Low-level I2C (SMBus) I/O */
+static int w9968cf_smbus_start(struct w9968cf_device*);
+static int w9968cf_smbus_stop(struct w9968cf_device*);
+static int w9968cf_smbus_write_byte(struct w9968cf_device*, u8 v);
+static int w9968cf_smbus_read_byte(struct w9968cf_device*, u8* v);
+static int w9968cf_smbus_write_ack(struct w9968cf_device*);
+static int w9968cf_smbus_read_ack(struct w9968cf_device*);
+static int w9968cf_i2c_adap_read_byte(struct w9968cf_device* cam,
+                                      u16 address, u8* value);
+static int w9968cf_i2c_adap_read_byte_data(struct w9968cf_device*, u16 address, 
+                                           u8 subaddress, u8* value);
+static int w9968cf_i2c_adap_write_byte(struct w9968cf_device*,
+                                       u16 address, u8 subaddress);
+static int w9968cf_i2c_adap_fastwrite_byte_data(struct w9968cf_device*,
+                                                u16 address, u8 subaddress,
+                                                u8 value);
+
+/* I2C interface to kernel */
+static int w9968cf_i2c_init(struct w9968cf_device*);
+static int w9968cf_i2c_smbus_xfer(struct i2c_adapter*, u16 addr, 
+                                  unsigned short flags, char read_write, 
+                                  u8 command, int size, union i2c_smbus_data*);
+static u32 w9968cf_i2c_func(struct i2c_adapter*);
+static int w9968cf_i2c_attach_inform(struct i2c_client*);
+static int w9968cf_i2c_detach_inform(struct i2c_client*);
+static int w9968cf_i2c_control(struct i2c_adapter*, unsigned int cmd,
+                               unsigned long arg);
+
+/* Memory management */
+static inline unsigned long kvirt_to_pa(unsigned long adr);
+static void* rvmalloc(unsigned long size);
+static void rvfree(void *mem, unsigned long size);
+static void w9968cf_deallocate_memory(struct w9968cf_device*);
+static int  w9968cf_allocate_memory(struct w9968cf_device*);
+static inline unsigned long w9968cf_get_max_bufsize(struct w9968cf_device*);
+
+/* High-level CMOS sensor control functions */
+static int w9968cf_sensor_set_control(struct w9968cf_device*,int cid,int val);
+static int w9968cf_sensor_get_control(struct w9968cf_device*,int cid,int *val);
+static inline int w9968cf_sensor_cmd(struct w9968cf_device*, 
+                                     unsigned int cmd, void *arg);
+static void w9968cf_sensor_configure(struct w9968cf_device*);
+static int w9968cf_sensor_change_settings(struct w9968cf_device*);
+static int w9968cf_sensor_get_picture(struct w9968cf_device*, 
+                                      struct video_picture*);
+static int w9968cf_sensor_set_picture(struct w9968cf_device*, 
+                                      struct video_picture pict);
+
+/* Other helper functions */
+static void w9968cf_configure_camera(struct w9968cf_device*,struct usb_device*,
+                                     enum w9968cf_model_id, 
+                                     const unsigned short dev_nr);
+static int w9968cf_turn_on_led(struct w9968cf_device*);
+static int w9968cf_init_chip(struct w9968cf_device*);
+static int w9968cf_set_picture(struct w9968cf_device*, struct video_picture);
+static int w9968cf_set_window(struct w9968cf_device*, struct video_window);
+static inline u16 w9968cf_valid_palette(u16 palette);
+static inline u16 w9968cf_valid_depth(u16 palette);
+static inline u8 w9968cf_need_decompression(u16 palette);
+static int w9968cf_postprocess_frame(struct w9968cf_device*, 
+                                     struct w9968cf_frame_t*);
+static int w9968cf_adjust_window_size(struct w9968cf_device*, u16* w, u16* h);
+static void w9968cf_init_framelist(struct w9968cf_device*);
+static void w9968cf_push_frame(struct w9968cf_device*, u8 f_num);
+static void w9968cf_pop_frame(struct w9968cf_device*,struct w9968cf_frame_t**);
+static void w9968cf_release_resources(struct w9968cf_device*);
+
+/* Intermodule communication */
+static int w9968cf_vppmod_detect(void);
+static void w9968cf_vppmod_release(void);
+
+/* Pointers to registered video post-processing functions */
+static void (*w9968cf_vpp_init_decoder)(void);
+static int (*w9968cf_vpp_check_headers)(const unsigned char*,
+                                        const unsigned long);
+static int (*w9968cf_vpp_decode)(const char*, const unsigned, 
+                                 const unsigned, const unsigned, char*);
+static void (*w9968cf_vpp_swap_yuvbytes)(void*, unsigned long);
+static void (*w9968cf_vpp_uyvy_to_rgbx)(u8*, unsigned long, u8*, u16, u8);
+static void (*w9968cf_vpp_scale_up)(u8*, u8*, u16, u16, u16, u16, u16);
+
+
+
+/****************************************************************************
+ * Symbolic names                                                           *
+ ****************************************************************************/
+
+/* Used to represent a list of values and their respective symbolic names */
+struct w9968cf_symbolic_list {
+	const int num;
+	const char *name;
+};
+
+/*-------------------------------------------------------------------------- 
+  Returns the name of the matching element in the symbolic_list array. The
+  end of the list must be marked with an element that has a NULL name.
+  --------------------------------------------------------------------------*/
+static inline const char * 
+symbolic(struct w9968cf_symbolic_list list[], const int num)
+{
+	int i;
+
+	for (i = 0; list[i].name != NULL; i++)
+		if (list[i].num == num)
+			return (list[i].name);
+
+	return "Unknown";
+}
+
+static struct w9968cf_symbolic_list camlist[] = {
+	{ W9968CF_MOD_GENERIC, "W996[87]CF JPEG USB Dual Mode Camera" },
+	{ W9968CF_MOD_CLVBWGP, "Creative Labs Video Blaster WebCam Go Plus" },
+
+	/* Other cameras (having the same descriptors as Generic W996[87]CF) */
+	{ W9968CF_MOD_ADPA5R, "Aroma Digi Pen ADG-5000 Refurbished" },
+	{ W9986CF_MOD_AU, "AVerTV USB" },
+	{ W9968CF_MOD_CLVBWG, "Creative Labs Video Blaster WebCam Go" },
+	{ W9968CF_MOD_DLLDK, "Die Lebon LDC-D35A Digital Kamera" },
+	{ W9968CF_MOD_EEEMC, "Ezonics EZ-802 EZMega Cam" },
+	{ W9968CF_MOD_ODPVDMPC, "OPCOM Digi Pen VGA Dual Mode Pen Camera" },
+
+	{  -1, NULL }
+};
+
+static struct w9968cf_symbolic_list senlist[] = {
+	{ CC_OV76BE,   "OV76BE" },
+	{ CC_OV7610,   "OV7610" },
+	{ CC_OV7620,   "OV7620" },
+	{ CC_OV7620AE, "OV7620AE" },
+	{ CC_OV6620,   "OV6620" },
+	{ CC_OV6630,   "OV6630" },
+	{ CC_OV6630AE, "OV6630AE" },
+	{ CC_OV6630AF, "OV6630AF" },
+	{ -1, NULL }
+};
+
+/* Video4Linux1 palettes */
+static struct w9968cf_symbolic_list v4l1_plist[] = {
+	{ VIDEO_PALETTE_GREY,    "GREY" },
+	{ VIDEO_PALETTE_HI240,   "HI240" },
+	{ VIDEO_PALETTE_RGB565,  "RGB565" },
+	{ VIDEO_PALETTE_RGB24,   "RGB24" },
+	{ VIDEO_PALETTE_RGB32,   "RGB32" },
+	{ VIDEO_PALETTE_RGB555,  "RGB555" },
+	{ VIDEO_PALETTE_YUV422,  "YUV422" },
+	{ VIDEO_PALETTE_YUYV,    "YUYV" },
+	{ VIDEO_PALETTE_UYVY,    "UYVY" },
+	{ VIDEO_PALETTE_YUV420,  "YUV420" },
+	{ VIDEO_PALETTE_YUV411,  "YUV411" },
+	{ VIDEO_PALETTE_RAW,     "RAW" },
+	{ VIDEO_PALETTE_YUV422P, "YUV422P" },
+	{ VIDEO_PALETTE_YUV411P, "YUV411P" },
+	{ VIDEO_PALETTE_YUV420P, "YUV420P" },
+	{ VIDEO_PALETTE_YUV410P, "YUV410P" },
+	{ -1, NULL }
+};
+
+/* Decoder error codes: */
+static struct w9968cf_symbolic_list decoder_errlist[] = {
+	{ W9968CF_DEC_ERR_CORRUPTED_DATA, "Corrupted data" },
+	{ W9968CF_DEC_ERR_BUF_OVERFLOW,   "Buffer overflow" },
+	{ W9968CF_DEC_ERR_NO_SOI,         "SOI marker not found" },     
+	{ W9968CF_DEC_ERR_NO_SOF0,        "SOF0 marker not found" },
+	{ W9968CF_DEC_ERR_NO_SOS,         "SOS marker not found" },
+	{ W9968CF_DEC_ERR_NO_EOI,         "EOI marker not found" },
+	{ -1, NULL }
+};
+
+/* URB error codes: */
+static struct w9968cf_symbolic_list urb_errlist[] = {
+	{ -ENOMEM,    "No memory for allocation of internal structures" },
+	{ -ENOSPC,    "The host controller's bandwidth is already consumed" },
+	{ -ENOENT,    "URB was canceled by unlink_urb" },
+	{ -EXDEV,     "ISO transfer only partially completed" },
+	{ -EAGAIN,    "Too match scheduled for the future" },
+	{ -ENXIO,     "URB already queued" },
+	{ -EFBIG,     "Too much ISO frames requested" },
+	{ -ENOSR,     "Buffer error (overrun)" },
+	{ -EPIPE,     "Specified endpoint is stalled (device not responding)"},
+	{ -EOVERFLOW, "Babble (bad cable?)" },
+	{ -EPROTO,    "Bit-stuff error (bad cable?)" },
+	{ -EILSEQ,    "CRC/Timeout" },
+	{ -ETIMEDOUT, "NAK (device does not respond)" },
+	{ -1, NULL }
+};
+
+
+
+/****************************************************************************
+ * Memory management functions                                              *
+ ****************************************************************************/
+
+/* Shameless copy from bttv-driver.c */
+
+/* Here we want the physical address of the memory.
+   This is used when initializing the contents of the area. */
+static inline unsigned long kvirt_to_pa(unsigned long adr)
+{
+	unsigned long kva, ret;
+
+	kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
+	kva |= adr & (PAGE_SIZE-1); /* restore the offset */
+	ret = __pa(kva);
+	return ret;
+}
+
+
+static void* rvmalloc(unsigned long size)
+{
+	void* mem;
+	unsigned long adr;
+
+	size = PAGE_ALIGN(size);
+	mem = vmalloc_32(size);
+	if (!mem)
+		return NULL;
+
+	memset(mem, 0, size); /* Clear the ram out, no junk to the user */
+	adr = (unsigned long) mem;
+	while (size > 0) {
+		SetPageReserved(vmalloc_to_page((void *)adr));
+		adr += PAGE_SIZE;
+		size -= PAGE_SIZE;
+	}
+
+	return mem;
+}
+
+
+static void rvfree(void* mem, unsigned long size)
+{
+	unsigned long adr;
+
+	if (!mem)
+		return;
+
+	adr = (unsigned long) mem;
+	while ((long) size > 0) {
+		ClearPageReserved(vmalloc_to_page((void *)adr));
+		adr += PAGE_SIZE;
+		size -= PAGE_SIZE;
+	}
+	vfree(mem);
+}
+/* End of shameless copy */
+
+
+/*--------------------------------------------------------------------------
+  Return the maximum size (in bytes) of a frame buffer.
+  --------------------------------------------------------------------------*/
+static inline unsigned long w9968cf_get_max_bufsize(struct w9968cf_device* cam)
+{
+	u8 bpp = (w9968cf_vppmod_present) ? 4 : 2;
+	return (cam->upscaling) ? W9968CF_MAX_WIDTH*W9968CF_MAX_HEIGHT*bpp :
+	                          cam->maxwidth*cam->maxheight*bpp;
+}
+
+
+/*--------------------------------------------------------------------------
+  Deallocate previously allocated memory.
+  --------------------------------------------------------------------------*/
+static void w9968cf_deallocate_memory(struct w9968cf_device* cam)
+{
+	u8 i;
+
+	/* Free the isochronous transfer buffers */
+	for (i = 0; i < W9968CF_URBS; i++) {
+		kfree(cam->transfer_buffer[i]);
+		cam->transfer_buffer[i] = NULL;
+	}
+
+	/* Free temporary frame buffer */
+	if (cam->frame_tmp.buffer) {
+		rvfree(cam->frame_tmp.buffer, W9968CF_HW_BUF_SIZE);
+		cam->frame_tmp.buffer = NULL;
+	}
+
+	/* Free helper buffer */
+	if (cam->vpp_buffer) {
+		rvfree(cam->vpp_buffer, w9968cf_get_max_bufsize(cam));
+		cam->vpp_buffer = NULL;
+	}
+	
+	/* Free video frame buffers */
+	if (cam->frame[0].buffer) {
+		rvfree(cam->frame[0].buffer, 
+		       cam->nbuffers * w9968cf_get_max_bufsize(cam));
+		cam->frame[0].buffer = NULL;
+	}
+
+	cam->nbuffers = 0;
+
+	DBG(5, "Memory successfully deallocated.")
+}
+
+
+/*--------------------------------------------------------------------------
+  Allocate memory buffers for USB transfers and video frames.
+  This function is called by open() only.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_allocate_memory(struct w9968cf_device* cam)
+{
+	const unsigned long bufsize = w9968cf_get_max_bufsize(cam);
+	const u16 p_size = wMaxPacketSize[cam->altsetting-1];
+	void* buff = NULL;
+	u8 i;
+
+	/* NOTE: Deallocation is done elsewhere in case of error */
+
+	/* Allocate memory for the isochronous transfer buffers */
+	for (i = 0; i < W9968CF_URBS; i++) {
+		if (!(cam->transfer_buffer[i] =
+		      kmalloc(W9968CF_ISO_PACKETS*p_size, GFP_KERNEL))) {
+			DBG(1, "Couldn't allocate memory for the isochronous "
+			       "transfer buffers (%d bytes).", 
+			    p_size * W9968CF_ISO_PACKETS)
+			return -ENOMEM;
+		}
+		memset(cam->transfer_buffer[i], 0, W9968CF_ISO_PACKETS*p_size);
+	}
+
+	/* Allocate memory for the temporary frame buffer */
+	if (!(cam->frame_tmp.buffer = rvmalloc(W9968CF_HW_BUF_SIZE))) {
+		DBG(1, "Couldn't allocate memory for the temporary "
+		       "video frame buffer (%i bytes).", W9968CF_HW_BUF_SIZE)
+		return -ENOMEM;
+	}
+
+	/* Allocate memory for the helper buffer */
+	if (w9968cf_vppmod_present) {
+		if (!(cam->vpp_buffer = rvmalloc(bufsize))) {
+			DBG(1, "Couldn't allocate memory for the helper buffer"
+			       " (%li bytes).", bufsize)
+			return -ENOMEM;
+		}
+	} else
+		cam->vpp_buffer = NULL;
+
+	/* Allocate memory for video frame buffers */	
+	cam->nbuffers = cam->max_buffers;
+	while (cam->nbuffers >= 2) {
+		if ((buff = rvmalloc(cam->nbuffers * bufsize)))
+			break;
+		else
+			cam->nbuffers--;
+	}
+
+	if (!buff) {
+		DBG(1, "Couldn't allocate memory for the video frame buffers.")
+		cam->nbuffers = 0;
+		return -ENOMEM;
+	}
+
+	if (cam->nbuffers != cam->max_buffers)
+		DBG(2, "Couldn't allocate memory for %d video frame buffers. "
+		       "Only memory for %d buffers has been allocated.",
+		    cam->max_buffers, cam->nbuffers)
+
+	for (i = 0; i < cam->nbuffers; i++) {
+		cam->frame[i].buffer = buff + i*bufsize;
+		/* Circular list */
+		if (i != cam->nbuffers-1)
+			cam->frame[i].next = &cam->frame[i+1];
+		else
+			cam->frame[i].next = &cam->frame[0];
+		cam->frame[i].status = F_UNUSED;
+	}
+
+	DBG(5, "Memory successfully allocated.")
+	return 0;
+}
+
+
+
+/****************************************************************************
+ * USB-specific functions                                                   *
+ ****************************************************************************/
+
+/*--------------------------------------------------------------------------
+  This is an handler function which is called after the URBs are completed.
+  It collects multiple data packets coming from the camera by putting them
+  into frame buffers: one or more zero data length data packets are used to
+  mark the end of a video frame; the first non-zero data packet is the start
+  of the next video frame; if an error is encountered in a packet, the entire
+  video frame is discarded and grabbed again.
+  If there are no requested frames in the FIFO list, packets are collected into
+  a temporary buffer. 
+  --------------------------------------------------------------------------*/
+static void w9968cf_urb_complete(struct urb *urb, struct pt_regs *regs)
+{
+	struct w9968cf_device* cam = (struct w9968cf_device*)urb->context;
+	struct w9968cf_frame_t** f;
+	unsigned long maxbufsize;
+	unsigned int len, status;
+	void* pos;
+	u8 i;
+	int err = 0;
+
+	if ((!cam->streaming) || cam->disconnected) {
+		DBG(4, "Got interrupt, but not streaming.")
+		return;
+	}
+
+	maxbufsize = min( (unsigned long)W9968CF_HW_BUF_SIZE, 
+	                  w9968cf_get_max_bufsize(cam) );
+
+	/* "(*f)" will be used instead of "cam->frame_current" */
+	f = &cam->frame_current;
+
+	/* If a frame has been requested and we are grabbing into  
+	   the temporary frame, we'll switch to that requested frame */
+	if ((*f) == &cam->frame_tmp && *cam->requested_frame) {
+		if (cam->frame_tmp.status == F_GRABBING) {
+			w9968cf_pop_frame(cam, &cam->frame_current);
+			(*f)->status = F_GRABBING;
+			(*f)->length = cam->frame_tmp.length;
+			memcpy((*f)->buffer, cam->frame_tmp.buffer,
+			       (*f)->length);
+			DBG(6, "Switched from temp. frame to frame #%d", 
+			    (*f) - &cam->frame[0])
+		}
+	}
+
+	for (i = 0; i < urb->number_of_packets; i++) {
+		len    = urb->iso_frame_desc[i].actual_length;
+		status = urb->iso_frame_desc[i].status;
+		pos    = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
+
+		if (status && len != 0) {
+			DBG(4, "URB failed, error in data packet "
+			       "(error #%d, %s).",
+			    status, symbolic(urb_errlist, status))
+			(*f)->status = F_ERROR;
+			continue;
+		}
+
+		if (len) { /* start of frame */
+
+			if ((*f)->status == F_UNUSED) {
+				(*f)->status = F_GRABBING;
+				(*f)->length = 0;
+			}
+
+			/* Buffer overflows shouldn't happen, however...*/
+			if ((*f)->length + len > maxbufsize) {
+				DBG(4, "Buffer overflow: bad data packets.")
+				(*f)->status = F_ERROR;
+			}
+
+			if ((*f)->status == F_GRABBING) {
+				memcpy((*f)->buffer + (*f)->length, pos, len);
+				(*f)->length += len;
+			}
+
+		} else if ((*f)->status == F_GRABBING) { /* end of frame */
+
+			DBG(6, "Frame #%d successfully grabbed.",
+			    ((*f)==&cam->frame_tmp ? -1 : (*f)-&cam->frame[0]))
+
+			if (cam->vpp_flag & VPP_DECOMPRESSION) {
+				err=(*w9968cf_vpp_check_headers)((*f)->buffer,
+				                                 (*f)->length);
+				if (err) {
+					DBG(4, "Skip corrupted frame: %s",
+					    symbolic(decoder_errlist, err))
+					(*f)->status = F_UNUSED;
+					continue; /* grab this frame again */
+				}
+			}
+
+			(*f)->status = F_READY;
+			(*f)->queued = 0;
+
+			/* Take a pointer to the new frame from the FIFO list.
+			   If the list is empty,we'll use the temporary frame*/
+			if (*cam->requested_frame)
+				w9968cf_pop_frame(cam, &cam->frame_current);
+			else {
+				cam->frame_current = &cam->frame_tmp;
+				(*f)->status = F_UNUSED;
+			}
+
+		} else if ((*f)->status == F_ERROR)
+			(*f)->status = F_UNUSED; /* grab it again */
+
+		PDBGG("Frame length %li | pack.#%d | pack.len. %d | state %d",
+		      (unsigned long)(*f)->length, i, len, (*f)->status)
+
+	} /* end for */
+
+	/* Resubmit this URB */
+	urb->dev = cam->usbdev;
+	urb->status = 0;
+	spin_lock(&cam->urb_lock);
+	if (cam->streaming)
+		if ((err = usb_submit_urb(urb, GFP_ATOMIC))) {
+			cam->misconfigured = 1;
+			DBG(1, "Couldn't resubmit the URB: error %d, %s",
+			    err, symbolic(urb_errlist, err));
+		}
+	spin_unlock(&cam->urb_lock);
+
+	/* Wake up the user process */
+	if (waitqueue_active(&cam->wait_queue))
+		wake_up_interruptible(&cam->wait_queue);
+}
+
+
+/*---------------------------------------------------------------------------
+  Setup the URB structures for the isochronous transfer.
+  Submit the URBs so that the data transfer begins.
+  Return 0 on success, a negative number otherwise.
+  ---------------------------------------------------------------------------*/
+static int w9968cf_start_transfer(struct w9968cf_device* cam)
+{
+	struct usb_device *udev = cam->usbdev;
+	struct urb* urb;
+	const u16 p_size = wMaxPacketSize[cam->altsetting-1];
+	u16 w, h, d;
+	int vidcapt;
+	u32 t_size;
+	int err = 0;
+	s8 i, j;
+
+	for (i = 0; i < W9968CF_URBS; i++) {
+		urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL);
+		cam->urb[i] = urb;
+
+		if (!urb) {
+			for (j = 0; j < i; j++)
+				usb_free_urb(cam->urb[j]);
+			DBG(1, "Couldn't allocate the URB structures.")
+			return -ENOMEM;
+		}
+
+		urb->dev = udev;
+		urb->context = (void*)cam;
+		urb->pipe = usb_rcvisocpipe(udev, 1);
+		urb->transfer_flags = URB_ISO_ASAP;
+		urb->number_of_packets = W9968CF_ISO_PACKETS;
+		urb->complete = w9968cf_urb_complete;
+		urb->transfer_buffer = cam->transfer_buffer[i];
+		urb->transfer_buffer_length = p_size*W9968CF_ISO_PACKETS;
+		urb->interval = 1;
+		for (j = 0; j < W9968CF_ISO_PACKETS; j++) {
+			urb->iso_frame_desc[j].offset = p_size*j;
+			urb->iso_frame_desc[j].length = p_size;
+		}
+	}
+
+	/* Transfer size per frame, in WORD ! */
+	d = cam->hw_depth;
+	w = cam->hw_width;
+	h = cam->hw_height;
+
+	t_size = (w*h*d)/16;
+
+	err = w9968cf_write_reg(cam, 0xbf17, 0x00); /* reset  everything */
+	err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* normal operation */
+
+	/* Transfer size */
+	err += w9968cf_write_reg(cam, t_size & 0xffff, 0x3d); /* low bits */
+	err += w9968cf_write_reg(cam, t_size >> 16, 0x3e);    /* high bits */
+
+	if (cam->vpp_flag & VPP_DECOMPRESSION)
+		err += w9968cf_upload_quantizationtables(cam);
+
+	vidcapt = w9968cf_read_reg(cam, 0x16); /* read picture settings */
+	err += w9968cf_write_reg(cam, vidcapt|0x8000, 0x16); /* capt. enable */
+
+	err += usb_set_interface(udev, 0, cam->altsetting);
+	err += w9968cf_write_reg(cam, 0x8a05, 0x3c); /* USB FIFO enable */
+
+	if (err || (vidcapt < 0)) {
+		for (i = 0; i < W9968CF_URBS; i++)
+			usb_free_urb(cam->urb[i]);
+		DBG(1, "Couldn't tell the camera to start the data transfer.")
+		return err;
+	}
+
+	w9968cf_init_framelist(cam);
+
+	/* Begin to grab into the temporary buffer */
+	cam->frame_tmp.status = F_UNUSED;
+	cam->frame_tmp.queued = 0;
+	cam->frame_current = &cam->frame_tmp;
+
+	if (!(cam->vpp_flag & VPP_DECOMPRESSION))
+		DBG(5, "Isochronous transfer size: %li bytes/frame.",
+		    (unsigned long)t_size*2)
+
+	DBG(5, "Starting the isochronous transfer...")
+
+	/* Submit the URBs */
+	for (i = 0; i < W9968CF_URBS; i++) {
+		err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
+		if (err) {
+			for (j = i-1; j >= 0; j--)
+				if (!usb_unlink_urb(cam->urb[j]))
+					usb_free_urb(cam->urb[j]);
+			DBG(1, "Couldn't send a transfer request to the "
+			       "USB core (error #%d, %s).", err, 
+			    symbolic(urb_errlist, err))
+		}
+	}
+
+	cam->streaming = 1;
+
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Stop the isochronous transfer and set alternate setting to 0 (0Mb/s).
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_stop_transfer(struct w9968cf_device* cam)
+{
+	struct usb_device *udev = cam->usbdev;
+	unsigned long lock_flags;
+	int err = 0;
+	s8 i;
+
+	/* This avoids race conditions with usb_submit_urb() 
+	   in the URB completition handler */
+	spin_lock_irqsave(&cam->urb_lock, lock_flags);
+	cam->streaming = 0;
+	spin_unlock_irqrestore(&cam->urb_lock, lock_flags);
+
+	for (i = W9968CF_URBS-1; i >= 0; i--)
+		if (cam->urb[i])
+			if (!usb_unlink_urb(cam->urb[i])) {
+				usb_free_urb(cam->urb[i]);
+				cam->urb[i] = NULL;
+			}
+
+	if (cam->disconnected)
+		goto exit;
+
+	err = w9968cf_write_reg(cam, 0x0a05, 0x3c); /* stop USB transfer */
+	err += usb_set_interface(udev, 0, 0); /* 0 Mb/s */
+	err += w9968cf_write_reg(cam, 0x0000, 0x39); /* disable JPEG encoder */
+	err += w9968cf_write_reg(cam, 0x0000, 0x16); /* stop video capture */
+
+	if (err) {
+		DBG(2, "Failed to tell the camera to stop the isochronous "
+		       "transfer. However this is not a critical error.")
+		return -EIO;
+	}
+
+exit:
+	DBG(5, "Isochronous transfer stopped.")
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Write a W9968CF register. 
+  Return 0 on success, -1 otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_write_reg(struct w9968cf_device* cam, u16 value, u16 index)
+{
+	struct usb_device* udev = cam->usbdev;
+	int res;
+
+	res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0,
+	                      USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+	                      value, index, NULL, 0, W9968CF_USB_CTRL_TIMEOUT);
+
+	if (res < 0)
+		DBG(4, "Failed to write a register "
+		       "(value 0x%04X, index 0x%02X, error #%d, %s).",
+		    value, index, res, symbolic(urb_errlist, res))
+
+	return (res >= 0) ? 0 : -1;
+}
+
+
+/*--------------------------------------------------------------------------
+  Read a W9968CF register. 
+  Return the register value on success, -1 otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_read_reg(struct w9968cf_device* cam, u16 index)
+{
+	struct usb_device* udev = cam->usbdev;
+	u16* buff = cam->control_buffer;
+	int res;
+
+	res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 1,
+	                      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+	                      0, index, (void*)buff,
+	                      2, W9968CF_USB_CTRL_TIMEOUT);
+
+	if (res < 0)
+		DBG(4, "Failed to read a register "
+		       "(index 0x%02X, error #%d, %s).",
+		    index, res, symbolic(urb_errlist, res))
+
+	return (res >= 0) ? (int)(*buff) : -1;
+}
+
+
+/*--------------------------------------------------------------------------
+  Write data to the fast serial bus registers.
+  Return 0 on success, -1 otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_write_fsb(struct w9968cf_device* cam, u16* data)
+{
+	struct usb_device* udev = cam->usbdev;
+	u16 value;
+	int res;
+
+	value = *data++;
+
+	res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0,
+	                      USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+	                      value, 0x06, (void*)data, 6,
+	                      W9968CF_USB_CTRL_TIMEOUT);
+
+	if (res < 0)
+		DBG(4, "Failed to write the FSB registers "
+		       "(error #%d, %s).", res, symbolic(urb_errlist, res))
+
+	return (res >= 0) ? 0 : -1;
+}
+
+
+/*--------------------------------------------------------------------------
+  Write data to the serial bus control register.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_write_sb(struct w9968cf_device* cam, u16 value)
+{
+	int err = 0;
+
+	err = w9968cf_write_reg(cam, value, 0x01);
+	udelay(W9968CF_I2C_BUS_DELAY);
+
+	return err;
+}
+
+
+/*--------------------------------------------------------------------------
+  Read data from the serial bus control register.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_read_sb(struct w9968cf_device* cam)
+{
+	int v = 0;
+
+	v = w9968cf_read_reg(cam, 0x01);
+	udelay(W9968CF_I2C_BUS_DELAY);
+
+	return v;
+}
+
+
+/*--------------------------------------------------------------------------
+  Upload quantization tables for the JPEG compression.
+  This function is called by w9968cf_start_transfer().
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_upload_quantizationtables(struct w9968cf_device* cam)
+{
+	u16 a, b;
+	int err = 0, i, j;
+
+	err += w9968cf_write_reg(cam, 0x0010, 0x39); /* JPEG clock enable */
+
+	for (i = 0, j = 0; i < 32; i++, j += 2) {
+		a = Y_QUANTABLE[j] | ((unsigned)(Y_QUANTABLE[j+1]) << 8);
+		b = UV_QUANTABLE[j] | ((unsigned)(UV_QUANTABLE[j+1]) << 8);
+		err += w9968cf_write_reg(cam, a, 0x40+i);
+		err += w9968cf_write_reg(cam, b, 0x60+i);
+	}
+	err += w9968cf_write_reg(cam, 0x0012, 0x39); /* JPEG encoder enable */
+
+	return err;
+}
+
+
+
+/****************************************************************************
+ * Low-level I2C I/O functions.                                             *
+ * The adapter supports the following I2C transfer functions:               *
+ * i2c_adap_fastwrite_byte_data() (at 400 kHz bit frequency only)           *
+ * i2c_adap_read_byte_data()                                                *
+ * i2c_adap_read_byte()                                                     *
+ ****************************************************************************/
+
+static int w9968cf_smbus_start(struct w9968cf_device* cam)
+{
+	int err = 0;
+
+	err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
+	err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
+
+	return err;
+}
+
+
+static int w9968cf_smbus_stop(struct w9968cf_device* cam)
+{
+	int err = 0;
+
+	err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
+	err += w9968cf_write_sb(cam, 0x0013); /* SDE=1, SDA=1, SCL=1 */
+
+	return err;
+}
+
+
+static int w9968cf_smbus_write_byte(struct w9968cf_device* cam, u8 v)
+{
+	u8 bit;
+	int err = 0, sda;
+
+	for (bit = 0 ; bit < 8 ; bit++) {
+		sda = (v & 0x80) ? 2 : 0;
+		v <<= 1;
+		/* SDE=1, SDA=sda, SCL=0 */
+		err += w9968cf_write_sb(cam, 0x10 | sda);
+		/* SDE=1, SDA=sda, SCL=1 */
+		err += w9968cf_write_sb(cam, 0x11 | sda);
+		/* SDE=1, SDA=sda, SCL=0 */
+		err += w9968cf_write_sb(cam, 0x10 | sda);
+	}
+
+	return err;
+}
+
+
+static int w9968cf_smbus_read_byte(struct w9968cf_device* cam, u8* v)
+{
+	u8 bit;
+	int err = 0;
+
+	*v = 0;
+	for (bit = 0 ; bit < 8 ; bit++) {
+		*v <<= 1;
+		err += w9968cf_write_sb(cam, 0x0013);
+		*v |= (w9968cf_read_sb(cam) & 0x0008) ? 1 : 0;
+		err += w9968cf_write_sb(cam, 0x0012);
+	}
+
+	return err;
+}
+
+
+static int w9968cf_smbus_write_ack(struct w9968cf_device* cam)
+{
+	int err = 0;
+
+	err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
+	err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
+	err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
+
+	return err;
+}
+
+
+static int w9968cf_smbus_read_ack(struct w9968cf_device* cam)
+{
+	int err = 0, sda;
+
+	err += w9968cf_write_sb(cam, 0x0013); /* SDE=1, SDA=1, SCL=1 */
+	sda = (w9968cf_read_sb(cam) & 0x08) ? 1 : 0; /* sda = SDA */
+	err += w9968cf_write_sb(cam, 0x0012); /* SDE=1, SDA=1, SCL=0 */
+	if (sda < 0)
+		err += sda;
+	if (sda == 1) {
+		DBG(6, "Couldn't receive the ACK.")
+		err += -1;
+	}
+
+	return err;
+}
+
+
+/* SMBus protocol: S Addr Wr [A] Subaddr [A] Value [A] P */
+static int 
+w9968cf_i2c_adap_fastwrite_byte_data(struct w9968cf_device* cam, 
+                                     u16 address, u8 subaddress,u8 value)
+{
+	u16* data = cam->data_buffer;
+	int err = 0;
+
+	 /* Enable SBUS outputs */
+	err += w9968cf_write_reg(cam, 0x0020, 0x01);
+
+	data[0] = 0x082f | ((address & 0x80) ? 0x1500 : 0x0);
+	data[0] |= (address & 0x40) ? 0x4000 : 0x0;
+	data[1] = 0x2082 | ((address & 0x40) ? 0x0005 : 0x0);
+	data[1] |= (address & 0x20) ? 0x0150 : 0x0;
+	data[1] |= (address & 0x10) ? 0x5400 : 0x0;
+	data[2] = 0x8208 | ((address & 0x08) ? 0x0015 : 0x0);
+	data[2] |= (address & 0x04) ? 0x0540 : 0x0;
+	data[2] |= (address & 0x02) ? 0x5000 : 0x0;
+	data[3] = 0x1d20 | ((address & 0x02) ? 0x0001 : 0x0);
+	data[3] |= (address & 0x01) ? 0x0054 : 0x0;
+
+	err += w9968cf_write_fsb(cam, data);
+
+	data[0] = 0x8208 | ((subaddress & 0x80) ? 0x0015 : 0x0);
+	data[0] |= (subaddress & 0x40) ? 0x0540 : 0x0;
+	data[0] |= (subaddress & 0x20) ? 0x5000 : 0x0;
+	data[1] = 0x0820 | ((subaddress & 0x20) ? 0x0001 : 0x0);
+	data[1] |= (subaddress & 0x10) ? 0x0054 : 0x0;
+	data[1] |= (subaddress & 0x08) ? 0x1500 : 0x0;
+	data[1] |= (subaddress & 0x04) ? 0x4000 : 0x0;
+	data[2] = 0x2082 | ((subaddress & 0x04) ? 0x0005 : 0x0);
+	data[2] |= (subaddress & 0x02) ? 0x0150 : 0x0;
+	data[2] |= (subaddress & 0x01) ? 0x5400 : 0x0;
+	data[3] = 0x001d;
+
+	err += w9968cf_write_fsb(cam, data);
+
+	data[0] = 0x8208 | ((value & 0x80) ? 0x0015 : 0x0);
+	data[0] |= (value & 0x40) ? 0x0540 : 0x0;
+	data[0] |= (value & 0x20) ? 0x5000 : 0x0;
+	data[1] = 0x0820 | ((value & 0x20) ? 0x0001 : 0x0);
+	data[1] |= (value & 0x10) ? 0x0054 : 0x0;
+	data[1] |= (value & 0x08) ? 0x1500 : 0x0;
+	data[1] |= (value & 0x04) ? 0x4000 : 0x0;
+	data[2] = 0x2082 | ((value & 0x04) ? 0x0005 : 0x0);
+	data[2] |= (value & 0x02) ? 0x0150 : 0x0;
+	data[2] |= (value & 0x01) ? 0x5400 : 0x0;
+	data[3] = 0xfe1d;
+
+	err += w9968cf_write_fsb(cam, data);
+
+	/* Disable SBUS outputs */
+	err += w9968cf_write_reg(cam, 0x0000, 0x01);
+
+	if (!err)
+		DBG(5, "I2C write byte data done, addr.0x%04X, subaddr.0x%02X "
+		       "value 0x%02X.", address, subaddress, value)
+	else
+		DBG(5, "I2C write byte data failed, addr.0x%04X, "
+		       "subaddr.0x%02X, value 0x%02X.", 
+	            address, subaddress, value)
+
+	return err;
+}
+
+
+/* SMBus protocol: S Addr Wr [A] Subaddr [A] P S Addr+1 Rd [A] [Value] NA P */
+static int 
+w9968cf_i2c_adap_read_byte_data(struct w9968cf_device* cam, 
+                                u16 address, u8 subaddress, 
+                                u8* value)
+{
+	int err = 0;
+
+	/* Serial data enable */
+	err += w9968cf_write_sb(cam, 0x0013); /* don't change ! */
+
+	err += w9968cf_smbus_start(cam);
+	err += w9968cf_smbus_write_byte(cam, address);
+	err += w9968cf_smbus_read_ack(cam);
+	err += w9968cf_smbus_write_byte(cam, subaddress);
+	err += w9968cf_smbus_read_ack(cam);
+	err += w9968cf_smbus_stop(cam);
+	err += w9968cf_smbus_start(cam);
+	err += w9968cf_smbus_write_byte(cam, address + 1);
+	err += w9968cf_smbus_read_ack(cam);
+	err += w9968cf_smbus_read_byte(cam, value);
+	err += w9968cf_smbus_write_ack(cam);
+	err += w9968cf_smbus_stop(cam);
+ 
+	/* Serial data disable */
+	err += w9968cf_write_sb(cam, 0x0000);
+
+	if (!err)
+		DBG(5, "I2C read byte data done, addr.0x%04X, "
+		       "subaddr.0x%02X, value 0x%02X.", 
+		    address, subaddress, *value)
+	else
+		DBG(5, "I2C read byte data failed, addr.0x%04X, "
+		       "subaddr.0x%02X, wrong value 0x%02X.",
+		    address, subaddress, *value)
+
+	return err;
+}
+
+
+/* SMBus protocol: S Addr+1 Rd [A] [Value] NA P */
+static int 
+w9968cf_i2c_adap_read_byte(struct w9968cf_device* cam,
+                           u16 address, u8* value)
+{
+	int err = 0;
+
+	/* Serial data enable */
+	err += w9968cf_write_sb(cam, 0x0013);
+
+	err += w9968cf_smbus_start(cam);
+	err += w9968cf_smbus_write_byte(cam, address + 1);
+	err += w9968cf_smbus_read_ack(cam);
+	err += w9968cf_smbus_read_byte(cam, value);
+	err += w9968cf_smbus_write_ack(cam);
+	err += w9968cf_smbus_stop(cam);
+ 
+	/* Serial data disable */
+	err += w9968cf_write_sb(cam, 0x0000);
+
+	if (!err)
+		DBG(5, "I2C read byte done, addr.0x%04X."
+		       "value 0x%02X.", address, *value)
+	else
+		DBG(5, "I2C read byte failed, addr.0x%04X."
+		       "wrong value 0x%02X.", address, *value)
+
+	return err;
+}
+
+
+/* SMBus protocol: S Addr Wr [A] Value [A] P */
+static int 
+w9968cf_i2c_adap_write_byte(struct w9968cf_device* cam,
+                            u16 address, u8 value)
+{
+	DBG(4, "i2c_write_byte() is an unsupported transfer mode.")
+	return -EINVAL;
+}
+
+
+
+/****************************************************************************
+ * I2C interface to kernel                                                  *
+ ****************************************************************************/
+
+static int
+w9968cf_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, 
+                       unsigned short flags, char read_write, u8 command,
+                       int size, union i2c_smbus_data *data)
+{
+	struct w9968cf_device* cam = i2c_get_adapdata(adapter);
+	u8 i, j;
+	int rc = 0, err = 0; 
+
+	switch (addr) {
+		case OV6xx0_SID:
+		case OV7xx0_SID:
+			break;
+		default:
+			DBG(4, "Rejected slave ID 0x%04X", addr)
+			return -EINVAL;
+	}
+
+	if (size == I2C_SMBUS_BYTE) {
+		/* Why addr <<= 1? See OVXXX0_SID defines in ovcamchip.h */
+		addr <<= 1;
+
+		if (read_write == I2C_SMBUS_WRITE)
+ 			rc = w9968cf_i2c_adap_write_byte(cam, addr, command);
+		else if (read_write == I2C_SMBUS_READ) 
+			rc = w9968cf_i2c_adap_read_byte(cam,addr, &data->byte);
+
+	} else if (size == I2C_SMBUS_BYTE_DATA) {
+		addr <<= 1;
+
+		if (read_write == I2C_SMBUS_WRITE)
+ 			rc = w9968cf_i2c_adap_fastwrite_byte_data(cam, addr,
+			                                  command, data->byte);
+		else if (read_write == I2C_SMBUS_READ) {
+			for (i = 1; i <= W9968CF_I2C_RW_RETRIES; i++) {
+				rc = w9968cf_i2c_adap_read_byte_data(cam, addr, 
+				                         command, &data->byte);
+				if (rc < 0) {
+					/* Work around: this seems to wake up  
+					   the EEPROM from the stall state */
+					for (j = 0; j <= 10; j++) {
+					   err += w9968cf_write_sb(cam,0x0020);
+					   err += w9968cf_write_sb(cam,0x0000);
+					   if (err)
+					   	break;
+					}
+				}
+				else
+					break;
+			}
+
+		} else
+			return -EINVAL;
+
+	} else {
+		DBG(4, "Unsupported I2C transfer mode (%d)", size)
+		return -EINVAL;
+	}
+
+	/* This works around a bug in the I2C core */
+	if (rc > 0)
+		rc = 0;
+
+	return rc;
+}
+
+
+static u32 w9968cf_i2c_func(struct i2c_adapter* adap)
+{
+	return I2C_FUNC_SMBUS_READ_BYTE |
+	       I2C_FUNC_SMBUS_READ_BYTE_DATA  |
+	       I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
+}
+
+
+static int w9968cf_i2c_attach_inform(struct i2c_client* client)
+{
+	struct w9968cf_device* cam = i2c_get_adapdata(client->adapter);
+	const char* clientname = i2c_clientname(client);
+	int id = client->driver->id;
+
+	if (id == I2C_DRIVERID_OVCAMCHIP) {
+		int rc = 0;
+
+		cam->sensor_client = client;
+
+		rc = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_INITIALIZE, 
+		                        &cam->sensor_mono);
+		if (rc < 0) {
+			DBG(1, "CMOS sensor initialization failed (rc=%d)",rc);
+			cam->sensor_client = NULL;
+			return rc;
+		}
+
+		if (w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_Q_SUBTYPE, 
+		                       &cam->sensor) < 0)
+			rc = -EIO;
+		else if (client->addr==OV7xx0_SID || client->addr==OV6xx0_SID)
+			w9968cf_sensor_configure(cam);
+		else
+			rc = -EINVAL;
+
+		if (rc < 0) {
+			cam->sensor_client = NULL;
+			cam->sensor = CC_UNKNOWN;
+			return rc;
+		}
+	} else	{
+		DBG(4, "Rejected client [%s] with [%s]", 
+		    clientname, client->driver->name)
+		return -1;
+	}
+
+	DBG(2, "I2C attach client [%s] with [%s]",
+	    clientname, client->driver->name)
+
+	return 0;
+}
+
+
+static int w9968cf_i2c_detach_inform(struct i2c_client* client)
+{
+	struct w9968cf_device* cam = i2c_get_adapdata(client->adapter);
+	const char* clientname = i2c_clientname(client);
+
+	if (cam->sensor_client == client) {
+		cam->sensor_client = NULL;
+	}
+
+	DBG(2, "I2C detach [%s]", clientname)
+
+	return 0;
+}
+
+
+static int 
+w9968cf_i2c_control(struct i2c_adapter* adapter, unsigned int cmd,
+                    unsigned long arg)
+{
+	return 0;
+}
+
+
+static int w9968cf_i2c_init(struct w9968cf_device* cam)
+{
+	int rc = 0;
+
+	static struct i2c_algorithm algo = {
+		.name =          "W996[87]CF algorithm",
+		.id =            I2C_ALGO_SMBUS,
+		.smbus_xfer =    w9968cf_i2c_smbus_xfer,
+		.algo_control =  w9968cf_i2c_control,
+		.functionality = w9968cf_i2c_func,
+	};
+
+	static struct i2c_adapter adap = {
+		.id =                I2C_ALGO_SMBUS | I2C_HW_SMBUS_W9968CF,
+		.class =             I2C_ADAP_CLASS_CAM_DIGITAL,
+		.owner =             THIS_MODULE,
+		.client_register =   w9968cf_i2c_attach_inform,
+		.client_unregister = w9968cf_i2c_detach_inform,
+		.algo =              &algo,
+	};
+
+	memcpy(&cam->i2c_adapter, &adap, sizeof(struct i2c_adapter));
+	strcpy(cam->i2c_adapter.name, "w9968cf");
+	i2c_set_adapdata(&cam->i2c_adapter, cam);
+
+	DBG(6, "Registering I2C bus with kernel...")
+
+	rc = i2c_add_adapter(&cam->i2c_adapter);
+	if (rc)
+		DBG(5, "Failed to register the I2C bus.")
+	else
+		DBG(5, "I2C bus registered.")
+
+	return rc;
+}
+
+
+
+/****************************************************************************
+ * Helper functions                                                         *
+ ****************************************************************************/
+
+/*--------------------------------------------------------------------------
+  Turn on the LED on some webcams. A beep should be heard too.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_turn_on_led(struct w9968cf_device* cam)
+{
+	int err = 0;
+
+	err += w9968cf_write_reg(cam, 0xff00, 0x00); /* power-down */
+	err += w9968cf_write_reg(cam, 0xbf17, 0x00); /* reset everything */
+	err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* normal operation */
+	err += w9968cf_write_reg(cam, 0x0010, 0x01); /* serial bus, SDS high */
+	err += w9968cf_write_reg(cam, 0x0000, 0x01); /* serial bus, SDS low */
+	err += w9968cf_write_reg(cam, 0x0010, 0x01); /* ..high 'beep-beep' */
+
+	if (err)
+		DBG(2, "Couldn't turn on the LED.")
+
+	DBG(5, "LED turned on.")
+
+	return err;
+}
+
+
+/*--------------------------------------------------------------------------
+  Write some registers for the device initialization.
+  This function is called once on open().
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_init_chip(struct w9968cf_device* cam)
+{
+	int err = 0, rc = 0;
+
+	err += w9968cf_write_reg(cam, 0xff00, 0x00); /* power off */
+	err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* power on */
+
+	err += w9968cf_write_reg(cam, 0x405d, 0x03); /* DRAM timings */
+	err += w9968cf_write_reg(cam, 0x0030, 0x04); /* SDRAM timings */
+
+	err += w9968cf_write_reg(cam, 0x0000, 0x20); /* Y frame buf.0, low */
+	err += w9968cf_write_reg(cam, 0x0000, 0x21); /* Y frame buf.0, high */
+	err += w9968cf_write_reg(cam, 0xb000, 0x22); /* Y frame buf.1, low */
+	err += w9968cf_write_reg(cam, 0x0004, 0x23); /* Y frame buf.1, high */
+	err += w9968cf_write_reg(cam, 0x5800, 0x24); /* U frame buf.0, low */
+	err += w9968cf_write_reg(cam, 0x0002, 0x25); /* U frame buf.0, high */
+	err += w9968cf_write_reg(cam, 0x0800, 0x26); /* U frame buf.1, low */
+	err += w9968cf_write_reg(cam, 0x0007, 0x27); /* U frame buf.1, high */
+	err += w9968cf_write_reg(cam, 0x8400, 0x28); /* V frame buf.0, low */
+	err += w9968cf_write_reg(cam, 0x0003, 0x29); /* V frame buf.0, high */
+	err += w9968cf_write_reg(cam, 0x3400, 0x2a); /* V frame buf.1, low */
+	err += w9968cf_write_reg(cam, 0x0008, 0x2b); /* V frame buf.1, high */
+
+	err += w9968cf_write_reg(cam, 0x6000, 0x32); /* JPEG bitstream buf 0 */
+	err += w9968cf_write_reg(cam, 0x0009, 0x33); /* JPEG bitstream buf 0 */
+	err += w9968cf_write_reg(cam, 0x2000, 0x34); /* JPEG bitstream buf 1 */
+	err += w9968cf_write_reg(cam, 0x000d, 0x35); /* JPEG bitstream buf 1 */
+
+	err += w9968cf_write_reg(cam, 0x0000, 0x36);/* JPEG restart interval */
+	err += w9968cf_write_reg(cam, 0x0804, 0x37);/*JPEG VLE FIFO threshold*/
+	err += w9968cf_write_reg(cam, 0x0000, 0x38);/* disable hw up-scaling */
+	err += w9968cf_write_reg(cam, 0x0000, 0x3f); /* JPEG/MCTL test data */
+
+	err += w9968cf_set_picture(cam, cam->picture); /* this before */
+	err += w9968cf_set_window(cam, cam->window);
+
+	if (err)
+		goto error;
+
+	rc = w9968cf_sensor_change_settings(cam);
+	if (rc)
+		goto error;
+
+	DBG(5, "Chip successfully initialized.");
+	
+	return 0;
+
+error:
+	DBG(1, "Chip initialization failed.")
+	if (err)
+		return err;
+	else
+		return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+  Change the picture settings of the camera.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int
+w9968cf_set_picture(struct w9968cf_device* cam, struct video_picture pict)
+{
+	u16 fmt, hw_depth, hw_palette, reg_v = 0x0000;
+	int err = 0, rc = 0;
+
+	/* Make sure we are using a valid depth */
+	pict.depth = w9968cf_valid_depth(pict.palette);
+
+	fmt = pict.palette;
+
+	hw_depth = pict.depth; /* depth used by the winbond chip */
+	hw_palette = pict.palette; /* palette used by the winbond chip */
+
+	/* VS & HS polarities */
+	reg_v = (cam->vs_polarity << 12) | (cam->hs_polarity << 11);
+
+	switch (fmt)
+	{
+		case VIDEO_PALETTE_UYVY:
+			reg_v |= 0x0000;
+			cam->vpp_flag = VPP_NONE;
+			break;
+		case VIDEO_PALETTE_YUV422P:
+			reg_v |= 0x0002;
+			cam->vpp_flag = VPP_DECOMPRESSION;
+			break;
+		case VIDEO_PALETTE_YUV420:
+		case VIDEO_PALETTE_YUV420P:
+			reg_v |= 0x0003;
+			cam->vpp_flag = VPP_DECOMPRESSION;
+			break;
+		case VIDEO_PALETTE_YUYV:
+		case VIDEO_PALETTE_YUV422:
+			reg_v |= 0x0000;
+			cam->vpp_flag = VPP_SWAP_YUV_BYTES;
+			hw_palette = VIDEO_PALETTE_UYVY;
+			break;
+		/* Original video is used instead of RGBX palettes. 
+		   Software conversion later. */
+		case VIDEO_PALETTE_GREY:
+		case VIDEO_PALETTE_RGB555:
+		case VIDEO_PALETTE_RGB565:
+		case VIDEO_PALETTE_RGB24:
+		case VIDEO_PALETTE_RGB32:
+			reg_v |= 0x0000; /* UYVY 16 bit is used */
+			hw_depth = 16;
+			hw_palette = VIDEO_PALETTE_UYVY;
+			cam->vpp_flag = VPP_UYVY_TO_RGBX;
+			break;
+	}
+
+	/* FIXME: 'hardware double buffer' doesn't work when compressed video
+	          is enabled (corrupted frames). */
+	if (cam->double_buffer && !(cam->vpp_flag & VPP_DECOMPRESSION))
+		reg_v |= 0x0080;
+
+	if (cam->clamping)
+		reg_v |= 0x0020;
+
+	if (cam->filter_type == 1)
+		reg_v |= 0x0008;
+	else if (cam->filter_type == 2)
+		reg_v |= 0x000c;
+
+	err = w9968cf_write_reg(cam, reg_v, 0x16);
+	if (err)
+		goto error;
+
+	rc = w9968cf_sensor_set_picture(cam, pict);
+	if (rc)
+		goto error;
+
+	/* If all went well, update the device data structure */
+	memcpy(&cam->picture, &pict, sizeof(pict));
+	cam->hw_depth = hw_depth;
+	cam->hw_palette = hw_palette;
+
+	/* Settings changed, so we clear the frame buffers */
+	memset(cam->frame[0].buffer, 0, 
+	       cam->nbuffers*w9968cf_get_max_bufsize(cam));
+
+	DBG(4, "Palette is %s, depth is %d bpp.",
+	    symbolic(v4l1_plist, pict.palette), pict.depth)
+
+	return 0;
+
+error:
+	DBG(1, "Failed to change picture settings.")
+	if (err)
+		return err;
+	else 
+		return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+  Change the capture area size of the camera.
+  This function _must_ be called _after_ w9968cf_set_picture().
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int
+w9968cf_set_window(struct w9968cf_device* cam, struct video_window win)
+{
+	u16 x, y, w, h, scx, scy, cw, ch, ax, ay;
+	unsigned long fw, fh;
+	struct ovcamchip_window s_win;
+	int err=0, rc=0;
+
+	/* Work around to avoid FP arithmetics */
+	#define __SC(x) ((x) << 10)
+	#define __UNSC(x) ((x) >> 10)
+
+	/* Make sure we are using a supported resolution */
+	if ((err = w9968cf_adjust_window_size(cam, (u16*)&win.width, 
+	                                      (u16*)&win.height)))
+		goto error;
+
+	/* Scaling factors */
+	fw = __SC(win.width) / cam->maxwidth;
+	fh = __SC(win.height) / cam->maxheight;
+
+	/* Set up the width and height values used by the chip */
+	if ((win.width > cam->maxwidth) || (win.height > cam->maxheight)) {
+		cam->vpp_flag |= VPP_UPSCALE;
+		/* Calculate largest w,h mantaining the same w/h ratio */
+		w = (fw >= fh) ? cam->maxwidth : __SC(win.width)/fh;
+		h = (fw >= fh) ? __SC(win.height)/fw : cam->maxheight;
+		if (w < cam->minwidth) /* just in case */
+			w = cam->minwidth;
+		if (h < cam->minheight) /* just in case */
+			h = cam->minheight;
+	} else {
+		cam->vpp_flag &= ~VPP_UPSCALE;
+		w = win.width;
+		h = win.height;
+	}
+
+	/* x,y offsets of the cropped area */
+	scx = cam->start_cropx;
+	scy = cam->start_cropy;
+
+	/* Calculate cropped area manteining the right w/h ratio */
+	if (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE)) {
+		cw = (fw >= fh) ? cam->maxwidth : __SC(win.width)/fh;
+		ch = (fw >= fh) ? __SC(win.height)/fw : cam->maxheight;
+	} else {
+		cw = w;
+		ch = h;
+	}
+
+	/* Setup the sensor window */
+	s_win.format = SENSOR_FORMAT;
+	s_win.width = cam->maxwidth;
+	s_win.height = cam->maxheight;
+	s_win.quarter = 0; /* full progressive video */
+
+	/* Center it */
+	s_win.x = (s_win.width - cw) / 2;
+	s_win.y = (s_win.height - ch) / 2;
+
+	/* Clock divisor */
+	if (cam->clockdiv >= 0)
+		s_win.clockdiv = cam->clockdiv; /* manual override */
+	else
+		switch (cam->sensor) {
+			case CC_OV6620:
+				s_win.clockdiv = 0;
+				break;
+			case CC_OV6630:
+				s_win.clockdiv = 0;
+				break;
+			case CC_OV76BE:
+			case CC_OV7610:
+			case CC_OV7620:
+				s_win.clockdiv = 0;
+				break;
+			default:
+				s_win.clockdiv = W9968CF_DEF_CLOCKDIVISOR;
+		}
+
+	/* We have to scale win.x and win.y offsets */	
+	if ( (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE))
+	     || (cam->vpp_flag & VPP_UPSCALE) ) {
+		ax = __SC(win.x)/fw;
+		ay = __SC(win.y)/fh;
+	} else {
+		ax = win.x;
+		ay = win.y;
+	}
+
+	if ((ax + cw) > cam->maxwidth)
+		ax = cam->maxwidth - cw;
+
+	if ((ay + ch) > cam->maxheight)
+		ay = cam->maxheight - ch;
+
+	/* Adjust win.x, win.y */
+	if ( (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE))
+	     || (cam->vpp_flag & VPP_UPSCALE) ) {
+		win.x = __UNSC(ax*fw);
+		win.y = __UNSC(ay*fh);
+	} else {
+		win.x = ax;
+		win.y = ay;
+	}
+
+	/* Offsets used by the chip */
+	x = ax + s_win.x;
+	y = ay + s_win.y;
+
+	/* Go ! */
+	if ((rc = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_S_MODE, &s_win)))
+		goto error;
+
+	err += w9968cf_write_reg(cam, scx + x, 0x10);
+	err += w9968cf_write_reg(cam, scy + y, 0x11);
+	err += w9968cf_write_reg(cam, scx + x + cw, 0x12);
+	err += w9968cf_write_reg(cam, scy + y + ch, 0x13);
+	err += w9968cf_write_reg(cam, w, 0x14);
+	err += w9968cf_write_reg(cam, h, 0x15);
+
+	/* JPEG width & height */
+	err += w9968cf_write_reg(cam, w, 0x30);
+	err += w9968cf_write_reg(cam, h, 0x31);
+
+	/* Y & UV frame buffer strides (in WORD) */
+	if (cam->vpp_flag & VPP_DECOMPRESSION) {
+		err += w9968cf_write_reg(cam, w/2, 0x2c);
+		err += w9968cf_write_reg(cam, w/4, 0x2d);
+	} else
+		err += w9968cf_write_reg(cam, w, 0x2c);
+
+	if (err)
+		goto error;
+
+	/* If all went well, update the device data structure */
+	memcpy(&cam->window, &win, sizeof(win));
+	cam->hw_width = w;
+	cam->hw_height = h;
+
+	/* Settings changed, so we clear the frame buffers */
+	memset(cam->frame[0].buffer, 0, 
+	       cam->nbuffers*w9968cf_get_max_bufsize(cam));
+
+	DBG(4, "The capture area is %dx%d, Offset (x,y)=(%d,%d).", 
+	    win.width, win.height, win.x, win.y)
+
+	PDBGG("x=%d ,y=%d, w=%d, h=%d, ax=%d, ay=%d, s_win.x=%d, s_win.y=%d, "
+	      "cw=%d, ch=%d, win.x=%d ,win.y=%d, win.width=%d, win.height=%d",
+	      x, y, w, h, ax, ay, s_win.x, s_win.y, cw, ch, win.x, win.y,
+	      win.width, win.height)
+
+	return 0;
+
+error:
+	DBG(1, "Failed to change the capture area size.")
+	if (err)
+		return err;
+	else
+		return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+  Return non-zero if the palette is supported, 0 otherwise.
+  --------------------------------------------------------------------------*/
+static inline u16 w9968cf_valid_palette(u16 palette)
+{
+	u8 i = 0;
+	while (w9968cf_formatlist[i].palette != 0) {
+		if (palette == w9968cf_formatlist[i].palette)
+			return palette;
+		i++;
+	}
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Return the depth corresponding to the given palette.
+  Palette _must_ be supported !
+  --------------------------------------------------------------------------*/
+static inline u16 w9968cf_valid_depth(u16 palette)
+{
+	u8 i=0;
+	while (w9968cf_formatlist[i].palette != palette)
+		i++;
+
+	return w9968cf_formatlist[i].depth;
+}
+
+
+/*--------------------------------------------------------------------------
+  Return non-zero if the format requires decompression, 0 otherwise.
+  --------------------------------------------------------------------------*/
+static inline u8 w9968cf_need_decompression(u16 palette)
+{
+	u8 i = 0;
+	while (w9968cf_formatlist[i].palette != 0) {
+		if (palette == w9968cf_formatlist[i].palette)
+			return w9968cf_formatlist[i].compression;
+		i++;
+	}
+	return 0;
+}
+
+
+/*-------------------------------------------------------------------------- 
+  Adjust the asked values for window width and height.
+  Return 0 on success, -1 otherwise.
+  --------------------------------------------------------------------------*/
+static int 
+w9968cf_adjust_window_size(struct w9968cf_device* cam, u16* width, u16* height)
+{
+	u16 maxw, maxh;
+
+	if ((*width < cam->minwidth) || (*height < cam->minheight))
+		return -ERANGE;
+
+	maxw = cam->upscaling && !(cam->vpp_flag & VPP_DECOMPRESSION)
+	       && w9968cf_vppmod_present ? W9968CF_MAX_WIDTH : cam->maxwidth;
+	maxh = cam->upscaling && !(cam->vpp_flag & VPP_DECOMPRESSION)
+	       && w9968cf_vppmod_present ? W9968CF_MAX_HEIGHT : cam->maxheight;
+
+	if (*width > maxw)
+		*width = maxw;
+	if (*height > maxh)
+		*height = maxh;
+
+	if (cam->vpp_flag & VPP_DECOMPRESSION) {
+		*width  &= ~15L; /* multiple of 16 */
+		*height &= ~15L;
+	}
+
+	PDBGG("Window size adjusted w=%d, h=%d ", *width, *height)
+
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Initialize the FIFO list of requested frames.
+  --------------------------------------------------------------------------*/
+static void w9968cf_init_framelist(struct w9968cf_device* cam)
+{
+	u8 i;
+
+	for (i = 0; i < cam->nbuffers; i++) {
+		cam->requested_frame[i] = NULL;
+		cam->frame[i].queued = 0;
+		cam->frame[i].status = F_UNUSED;
+	}
+}
+
+
+/*--------------------------------------------------------------------------
+  Add a frame in the FIFO list of requested frames.
+  This function is called in process context.
+  --------------------------------------------------------------------------*/
+static void w9968cf_push_frame(struct w9968cf_device* cam, u8 f_num)
+{
+	u8 f;
+	unsigned long lock_flags;
+
+	spin_lock_irqsave(&cam->flist_lock, lock_flags);
+
+	for (f=0; cam->requested_frame[f] != NULL; f++);
+	cam->requested_frame[f] = &cam->frame[f_num];
+	cam->frame[f_num].queued = 1;
+	cam->frame[f_num].status = F_UNUSED; /* clear the status */
+
+	spin_unlock_irqrestore(&cam->flist_lock, lock_flags);
+
+	DBG(6, "Frame #%d pushed into the FIFO list. Position %d.", f_num, f)
+}
+
+
+/*--------------------------------------------------------------------------
+  Read, store and remove the first pointer in the FIFO list of requested
+  frames. This function is called in interrupt context.
+  --------------------------------------------------------------------------*/
+static void 
+w9968cf_pop_frame(struct w9968cf_device* cam, struct w9968cf_frame_t** framep)
+{
+	u8 i;
+
+	spin_lock(&cam->flist_lock);
+
+	*framep = cam->requested_frame[0];
+
+	/* Shift the list of pointers */
+	for (i = 0; i < cam->nbuffers-1; i++)
+		cam->requested_frame[i] = cam->requested_frame[i+1];
+	cam->requested_frame[i] = NULL;
+
+	spin_unlock(&cam->flist_lock);
+
+	DBG(6,"Popped frame #%d from the list.",*framep-&cam->frame[0])
+}
+
+
+/*--------------------------------------------------------------------------
+  High-level video post-processing routine on grabbed frames.
+  Return 0 on success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int 
+w9968cf_postprocess_frame(struct w9968cf_device* cam, 
+                          struct w9968cf_frame_t* fr)
+{
+	void *pIn = fr->buffer, *pOut = cam->vpp_buffer, *tmp;
+	u16 w = cam->window.width,
+	    h = cam->window.height,
+	    d = cam->picture.depth,
+	    fmt = cam->picture.palette,
+	    rgb = cam->force_rgb,
+	    hw_w = cam->hw_width,
+	    hw_h = cam->hw_height,
+	    hw_d = cam->hw_depth;
+	int err = 0;
+
+	#define _PSWAP(pIn, pOut) {tmp = (pIn); (pIn) = (pOut); (pOut) = tmp;}
+
+	if (cam->vpp_flag & VPP_DECOMPRESSION) {
+		memcpy(pOut, pIn, fr->length);
+		_PSWAP(pIn, pOut)
+		err = (*w9968cf_vpp_decode)(pIn, fr->length, hw_w, hw_h, pOut);
+		PDBGG("Compressed frame length: %li",(unsigned long)fr->length)
+		fr->length = (hw_w*hw_h*hw_d)/8;
+		_PSWAP(pIn, pOut)
+		if (err) {
+			DBG(4, "An error occurred while decoding the frame: "
+			       "%s.", symbolic(decoder_errlist, err))
+			return err;
+		} else
+			DBG(6, "Frame decoded")
+	}
+
+	if (cam->vpp_flag & VPP_SWAP_YUV_BYTES) {
+		(*w9968cf_vpp_swap_yuvbytes)(pIn, fr->length);
+		DBG(6, "Original UYVY component ordering changed.")
+	}
+
+	if (cam->vpp_flag & VPP_UPSCALE) {
+		(*w9968cf_vpp_scale_up)(pIn, pOut, hw_w, hw_h, hw_d, w, h);
+		fr->length = (w*h*hw_d)/8;
+		_PSWAP(pIn, pOut)
+		DBG(6, "Vertical up-scaling done: %d,%d,%dbpp->%d,%d",
+		    hw_w, hw_h, hw_d, w, h)
+	}
+
+	if (cam->vpp_flag & VPP_UYVY_TO_RGBX) {
+		(*w9968cf_vpp_uyvy_to_rgbx)(pIn, fr->length, pOut, fmt, rgb);
+		fr->length = (w*h*d)/8;
+		_PSWAP(pIn, pOut)
+		DBG(6, "UYVY-16bit to %s conversion done.", 
+		    symbolic(v4l1_plist, fmt))
+	}
+
+	if (pOut == fr->buffer)
+		memcpy(fr->buffer, cam->vpp_buffer, fr->length);
+
+	return 0;
+}
+
+
+
+/****************************************************************************
+ * CMOS sensor control routines                                             *
+ ****************************************************************************/
+
+static int 
+w9968cf_sensor_set_control(struct w9968cf_device* cam, int cid, int val)
+{
+	struct ovcamchip_control ctl;
+	int rc;
+
+	ctl.id = cid;
+	ctl.value = val;
+
+	rc = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_S_CTRL, &ctl);
+
+	return rc;
+}
+
+static int 
+w9968cf_sensor_get_control(struct w9968cf_device* cam, int cid, int *val)
+{
+	struct ovcamchip_control ctl;
+	int rc;
+
+	ctl.id = cid;
+
+	rc = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_G_CTRL, &ctl);
+	if (rc >= 0)
+		*val = ctl.value;
+
+	return rc;
+}
+
+
+static inline int
+w9968cf_sensor_cmd(struct w9968cf_device* cam, unsigned int cmd, void *arg)
+{
+	struct i2c_client* c = cam->sensor_client;
+
+	DBG(6, "Executing CMOS sensor command...")
+
+	if (c && c->driver->command)
+		return c->driver->command(cam->sensor_client, cmd, arg);
+	else
+		return -ENODEV;
+}
+
+
+/*--------------------------------------------------------------------------
+  Change some settings of the CMOS sensor.
+  Returns: 0 for success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int w9968cf_sensor_change_settings(struct w9968cf_device* cam)
+{
+	int rc;
+
+	/* Auto brightness */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_AUTOBRIGHT, 
+	                                cam->auto_brt);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	/* Auto exposure */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_AUTOEXP, 
+	                                cam->auto_exp);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	/* Banding filter */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BANDFILT, 
+	                                cam->bandfilt);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	/* Light frequency */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_FREQ,
+	                                cam->lightfreq);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	/* Back light */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BACKLIGHT,
+	                                cam->backlight);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	/* Mirror */
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_MIRROR,
+	                                cam->mirror);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Get some current picture settings from the CMOS sensor.
+  Returns: 0 for success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int
+w9968cf_sensor_get_picture(struct w9968cf_device* cam, 
+                           struct video_picture* pict)
+{
+	int rc, v;
+
+	/* Don't return error if a setting is unsupported, or rest of settings
+	   will not be performed */
+
+	rc = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_CONT, &v);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+	pict->contrast = v;
+
+	rc = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_BRIGHT, &v);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+	pict->brightness = v;
+
+	rc = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_SAT, &v);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+	pict->colour = v;
+
+	rc = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_HUE, &v);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+	pict->hue = v;
+
+	pict->whiteness = W9968CF_WHITENESS; /* to do! */
+
+	DBG(5, "Got picture settings from the CMOS sensor.")
+
+	PDBGG("Brightness, contrast, hue, colour, whiteness are "
+	      "%d,%d,%d,%d,%d.", pict->brightness, pict->contrast,
+	      pict->hue, pict->colour, pict->whiteness)
+
+	return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+  Change picture settings of the CMOS sensor.
+  Returns: 0 for success, a negative number otherwise.
+  --------------------------------------------------------------------------*/
+static int
+w9968cf_sensor_set_picture(struct w9968cf_device* cam, 
+                           struct video_picture pict)
+{
+	int rc;
+
+	rc = w9968cf_sensor_set_control(cam,OVCAMCHIP_CID_CONT, pict.contrast);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	if (!cam->auto_brt) {
+		rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BRIGHT, 
+	                                        pict.brightness);
+		if (SENSOR_FATAL_ERROR(rc))
+			return rc;
+	}
+
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_SAT, pict.colour);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	rc = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_HUE, pict.hue);
+	if (SENSOR_FATAL_ERROR(rc))
+		return rc;
+
+	PDBGG("Brightness, contrast, hue, colour, whiteness are "
+	      "%d,%d,%d,%d,%d.", pict.brightness, pict.contrast,
+	      pict.hue, pict.colour, pict.whiteness)
+
+	return 0;
+}
+
+
+
+/****************************************************************************
+ * Camera configuration                                                     *
+ ****************************************************************************/
+
+/*--------------------------------------------------------------------------
+  This function is called when the CMOS sensor is detected.
+  --------------------------------------------------------------------------*/
+static void w9968cf_sensor_configure(struct w9968cf_device* cam)
+{
+	/* NOTE: Make sure width and height are a multiple of 16 */
+
+	switch (cam->sensor_client->addr) {
+		case OV6xx0_SID:
+			cam->maxwidth = 352;
+			cam->maxheight = 288;
+			cam->minwidth = 64;
+			cam->minheight = 48;
+			break;
+		case OV7xx0_SID:
+			cam->maxwidth = 640;
+			cam->maxheight = 480;
+			cam->minwidth = 64;
+			cam->minheight = 48;
+			break;
+	}
+
+	/* These values depend on the ones in the ovxxx0.c sources */
+	switch (cam->sensor) {
+		case CC_OV7620:
+			cam->start_cropx = 287;
+			cam->start_cropy = 35;
+			/* Seems to work around a bug in the CMOS sensor */
+			cam->vs_polarity = 1;
+			cam->hs_polarity = 1;
+			break;
+		default:
+			cam->start_cropx = 320;
+			cam->start_cropy = 35;
+			cam->vs_polarity = 1;
+			cam->hs_polarity = 0;
+	}
+
+	DBG(5, "CMOS sensor %s configured.", symbolic(senlist, cam->sensor))
+}
+
+
+/*--------------------------------------------------------------------------
+  Fill some basic fields in the main device data structure.
+  This function is called once on w9968cf_usb_probe() for each recognized 
+  camera.
+  --------------------------------------------------------------------------*/
+static void
+w9968cf_configure_camera(struct w9968cf_device* cam,
+                         struct usb_device* udev,
+                         enum w9968cf_model_id mod_id,
+                         const unsigned short dev_nr)
+{
+	init_MUTEX(&cam->fileop_sem);
+	init_waitqueue_head(&cam->open);
+	spin_lock_init(&cam->urb_lock);
+	spin_lock_init(&cam->flist_lock);
+
+	cam->users = 0;
+	cam->disconnected = 0;
+	cam->usbdev = udev;
+	cam->id = mod_id;
+	cam->sensor = CC_UNKNOWN;
+
+	strcpy(cam->v4ldev.name, symbolic(camlist, mod_id));
+	cam->v4ldev.type = VID_TYPE_CAPTURE | VID_TYPE_SCALES;
+	cam->v4ldev.hardware = VID_HARDWARE_W9968CF;
+	cam->v4ldev.fops = &w9968cf_fops;
+	cam->v4ldev.priv = (void*)cam;
+	cam->v4ldev.minor = video_nr[dev_nr];
+
+	/* Calculate the alternate setting number (from 1 to 16)
+	   according to the 'packet_size' module parameter */
+	if (packet_size[dev_nr] < W9968CF_MIN_PACKET_SIZE)
+		packet_size[dev_nr] = W9968CF_MIN_PACKET_SIZE;
+	for (cam->altsetting = 1;
+	     packet_size[dev_nr] < wMaxPacketSize[cam->altsetting-1];
+	     cam->altsetting++);
+
+	cam->max_buffers = (max_buffers[dev_nr] < 2 || 
+	                    max_buffers[dev_nr] > W9968CF_MAX_BUFFERS)
+	                   ? W9968CF_BUFFERS : max_buffers[dev_nr];
+
+	cam->double_buffer = (double_buffer[dev_nr] == 0 || 
+	                      double_buffer[dev_nr] == 1)
+	                     ? double_buffer[dev_nr] : W9968CF_DOUBLE_BUFFER;
+
+	cam->clamping = (clamping[dev_nr] == 0 || clamping[dev_nr] == 1)
+	                ? clamping[dev_nr] : W9968CF_CLAMPING;
+	
+	cam->filter_type = (filter_type[dev_nr] == 0 ||
+	                    filter_type[dev_nr] == 1 ||
+	                    filter_type[dev_nr] == 2)
+	                   ? filter_type[dev_nr] : W9968CF_FILTER_TYPE;
+
+	cam->capture = 1;
+
+	cam->largeview = (largeview[dev_nr] == 0 || largeview[dev_nr] == 1)
+	                 ? largeview[dev_nr] : W9968CF_LARGEVIEW;
+
+	cam->decompression = (decompression[dev_nr] == 0 || 
+	                      decompression[dev_nr] == 1 ||
+	                      decompression[dev_nr] == 2)
+	                     ? decompression[dev_nr] : W9968CF_DECOMPRESSION;
+
+	cam->upscaling = (upscaling[dev_nr] == 0 || 
+	                  upscaling[dev_nr] == 1)
+	                 ? upscaling[dev_nr] : W9968CF_UPSCALING;
+
+	cam->auto_brt = (autobright[dev_nr] == 0 || autobright[dev_nr] == 1)
+	                ? autobright[dev_nr] : W9968CF_AUTOBRIGHT;
+
+	cam->auto_exp = (autoexp[dev_nr] == 0 || autoexp[dev_nr] == 1)
+	                ? autoexp[dev_nr] : W9968CF_AUTOEXP;
+
+	cam->lightfreq = (lightfreq[dev_nr] == 50 || lightfreq[dev_nr] == 60)
+	                 ? lightfreq[dev_nr] : W9968CF_LIGHTFREQ;
+
+	cam->bandfilt = (bandingfilter[dev_nr] == 0 || 
+	                 bandingfilter[dev_nr] == 1)
+	                ? bandingfilter[dev_nr] : W9968CF_BANDINGFILTER;
+
+	cam->backlight = (backlight[dev_nr] == 0 || backlight[dev_nr] == 1)
+	                 ? backlight[dev_nr] : W9968CF_BACKLIGHT;
+
+	cam->clockdiv = (clockdiv[dev_nr] == -1 || clockdiv[dev_nr] >= 0)
+	                ? clockdiv[dev_nr] : W9968CF_CLOCKDIV;
+
+	cam->mirror = (mirror[dev_nr] == 0 || mirror[dev_nr] == 1)
+	              ? mirror[dev_nr] : W9968CF_MIRROR;
+
+	cam->sensor_mono = (sensor_mono[dev_nr]==0 || sensor_mono[dev_nr]==1)
+	                   ? sensor_mono[dev_nr] : W9968CF_SENSOR_MONO;
+
+	cam->picture.brightness = brightness[dev_nr];
+	cam->picture.hue = hue[dev_nr];
+	cam->picture.colour = colour[dev_nr];
+	cam->picture.contrast = contrast[dev_nr];
+	cam->picture.whiteness = whiteness[dev_nr];
+	if (w9968cf_valid_palette(force_palette[dev_nr])) {
+		cam->picture.palette = force_palette[dev_nr];
+		cam->force_palette = 1;
+	} else {
+		cam->force_palette = 0;
+		if (cam->decompression == 0)
+			cam->picture.palette = W9968CF_PALETTE_DECOMP_OFF;
+		else if (cam->decompression == 1)
+			cam->picture.palette = W9968CF_PALETTE_DECOMP_FORCE;
+		else
+			cam->picture.palette = W9968CF_PALETTE_DECOMP_ON;
+	}
+
+	cam->force_rgb = (force_rgb[dev_nr] == 0 || force_rgb[dev_nr] == 1)
+	                 ? force_rgb[dev_nr] : W9968CF_FORCE_RGB;
+
+	cam->window.x = 0;
+	cam->window.y = 0;
+	cam->window.width = W9968CF_WIDTH;
+	cam->window.height = W9968CF_HEIGHT;
+	cam->window.chromakey = 0;
+	cam->window.clipcount = 0;
+	cam->window.flags = 0;
+
+	/* If the video post-processing module is not present, some paramaters
+	   must be overridden: */
+	if (!w9968cf_vppmod_present) {
+		if (cam->decompression == 1)
+			cam->decompression = 2;
+		cam->upscaling = 0;
+		if (cam->picture.palette != VIDEO_PALETTE_UYVY)
+			cam->force_palette = 0;
+		cam->picture.palette = VIDEO_PALETTE_UYVY;
+	}
+
+	cam->picture.depth = w9968cf_valid_depth(cam->picture.palette);
+
+	DBG(3, "%s configured with settings #%d:", 
+	    symbolic(camlist, cam->id), dev_nr)
+	
+	DBG(3, "- Data packet size for USB isochrnous transfer: %d bytes.",
+	    wMaxPacketSize[cam->altsetting-1])
+	
+	DBG(3, "- Number of requested video frame buffers: %d", 
+	    cam->max_buffers)
+
+	if (cam->double_buffer)
+		DBG(3, "- Hardware double buffering enabled.")
+	else 
+		DBG(3, "- Hardware double buffering disabled.")
+
+	if (cam->filter_type == 0)
+		DBG(3, "- Video filtering disabled.")
+	else if (cam->filter_type == 1)
+		DBG(3, "- Video filtering enabled: type 1-2-1.")
+	else if (cam->filter_type == 2)
+		DBG(3, "- Video filtering enabled: type 2-3-6-3-2.")
+
+	if (cam->clamping)
+		DBG(3, "- Video data clamping (CCIR-601 format) enabled.")
+	else
+		DBG(3, "- Video data clamping (CCIR-601 format) disabled.")
+
+	if (cam->largeview)
+		DBG(3, "- Large view enabled.")
+	else
+		DBG(3, "- Large view disabled.")
+
+	if ((cam->decompression) == 0 && (!cam->force_palette))
+		DBG(3, "- Decompression disabled.")
+	else if ((cam->decompression) == 1 && (!cam->force_palette))
+		DBG(3, "- Decompression forced.")
+	else if ((cam->decompression) == 2 && (!cam->force_palette))
+		DBG(3, "- Decompression allowed.")
+
+	if (cam->upscaling)
+		DBG(3, "- Software image scaling enabled.")
+	else
+		DBG(3, "- Software image scaling disabled.")
+
+	if (cam->force_palette)
+		DBG(3, "- Image palette forced to %s.",
+		    symbolic(v4l1_plist, cam->picture.palette))
+
+	if (cam->force_rgb)
+		DBG(3, "- RGB component ordering will be used instead of BGR.")
+
+	if (cam->auto_brt)
+		DBG(3, "- Auto brightness enabled.")
+	else
+		DBG(3, "- Auto brightness disabled.")
+
+	if (cam->auto_exp)
+		DBG(3, "- Auto exposure enabled.")
+	else
+		DBG(3, "- Auto exposure disabled.")
+
+	if (cam->backlight)
+		DBG(3, "- Backlight exposure algorithm enabled.")
+	else
+		DBG(3, "- Backlight exposure algorithm disabled.")
+
+	if (cam->mirror)
+		DBG(3, "- Mirror enabled.")
+	else
+		DBG(3, "- Mirror disabled.")
+
+	if (cam->bandfilt)
+		DBG(3, "- Banding filter enabled.")
+	else
+		DBG(3, "- Banding filter disabled.")
+
+	DBG(3, "- Power lighting frequency: %d", cam->lightfreq)
+
+	if (cam->clockdiv == -1)
+		DBG(3, "- Automatic clock divisor enabled.")
+	else
+		DBG(3, "- Clock divisor: %d", cam->clockdiv)
+
+	if (cam->sensor_mono)
+		DBG(3, "- CMOS sensor used as monochrome.")
+	else
+		DBG(3, "- CMOS sensor not used as monochrome.")
+}
+
+
+/*--------------------------------------------------------------------------
+  Release the resources used by the driver.
+  This function is called on disconnect 
+  (or on close if deallocation has been deferred)
+  --------------------------------------------------------------------------*/
+static void w9968cf_release_resources(struct w9968cf_device* cam)
+{
+	down(&w9968cf_devlist_sem);
+
+	DBG(2, "V4L device deregistered: /dev/video%d", cam->v4ldev.minor)
+
+	video_unregister_device(&cam->v4ldev);
+	list_del(&cam->v4llist);
+	i2c_del_adapter(&cam->i2c_adapter);
+	w9968cf_deallocate_memory(cam);
+	kfree(cam->control_buffer);
+	kfree(cam->data_buffer);
+
+	up(&w9968cf_devlist_sem);
+
+	DBG(5, "Resources released.")
+}
+
+
+
+/****************************************************************************
+ * Video4Linux interface                                                    *
+ ****************************************************************************/
+
+static int w9968cf_open(struct inode* inode, struct file* filp)
+{
+	struct w9968cf_device* cam =
+	  (struct w9968cf_device*)video_devdata(filp)->priv;    
+	int err;
+
+	down(&cam->dev_sem);
+
+	if (cam->sensor == CC_UNKNOWN) {
+		DBG(2, "No supported CMOS sensor has been detected by the "
+		       "'ovcamchip' module for the %s (/dev/video%d). Make "
+		       "sure it is loaded *before* the 'w9968cf' module.", 
+		    symbolic(camlist, cam->id),cam->v4ldev.minor)
+		up(&cam->dev_sem);
+		return -ENODEV;
+	}
+
+	if (cam->users) {
+		DBG(2, "%s (/dev/video%d) has been already occupied by '%s'.",
+		    symbolic(camlist, cam->id),cam->v4ldev.minor, cam->command)
+		if ((filp->f_flags & O_NONBLOCK)||(filp->f_flags & O_NDELAY)) {
+			up(&cam->dev_sem);
+			return -EWOULDBLOCK;
+		}
+		up(&cam->dev_sem);
+		err = wait_event_interruptible(cam->open, cam->disconnected ||
+		                               (cam->users == 0));
+		if (err)
+			return err;
+		if (cam->disconnected)
+			return -ENODEV;
+		down(&cam->dev_sem);
+	}
+
+	DBG(5, "Opening the %s, /dev/video%d ...",
+	    symbolic(camlist, cam->id), cam->v4ldev.minor)
+
+	cam->streaming = 0;
+	cam->misconfigured = 0;
+
+	if (!w9968cf_vppmod_present)
+		w9968cf_vppmod_detect();
+
+	if ((err = w9968cf_allocate_memory(cam)))
+		goto deallocate_memory;
+
+	if ((err = w9968cf_init_chip(cam)))
+		goto deallocate_memory;
+
+	if ((err = w9968cf_start_transfer(cam)))
+		goto deallocate_memory;
+
+	filp->private_data = (void*)cam;
+
+	cam->users++;
+	strcpy(cam->command, current->comm);
+
+	init_waitqueue_head(&cam->wait_queue);
+
+	up(&cam->dev_sem);
+
+	DBG(5, "Video device is open.")
+	return 0;
+
+deallocate_memory:
+	w9968cf_deallocate_memory(cam);
+	DBG(2, "Failed to open the video device.")
+	up(&cam->dev_sem);
+	return err;
+}
+
+
+static int w9968cf_release(struct inode* inode, struct file* filp)
+{
+	struct w9968cf_device* cam = 
+	  (struct w9968cf_device*)video_devdata(filp)->priv;
+
+	down(&cam->dev_sem); /* prevent disconnect() to be called */
+
+	w9968cf_stop_transfer(cam);
+
+	if (cam->disconnected) {
+		w9968cf_release_resources(cam);
+		up(&cam->dev_sem);
+		kfree(cam);
+		return 0;
+	}
+
+	cam->users--;
+	w9968cf_deallocate_memory(cam);
+
+	if (waitqueue_active(&cam->open))
+		wake_up_interruptible(&cam->open);
+
+	DBG(5, "Video device closed.")
+	up(&cam->dev_sem);
+	return 0;
+}
+
+
+static ssize_t
+w9968cf_read(struct file* filp, char* buf, size_t count, loff_t* f_pos)
+{
+	struct w9968cf_device* cam =
+	  (struct w9968cf_device*)video_devdata(filp)->priv;
+	struct w9968cf_frame_t* fr;
+	int err = 0;
+
+	if (filp->f_flags & O_NONBLOCK)
+		return -EWOULDBLOCK;
+
+	if (down_interruptible(&cam->fileop_sem))
+		return -ERESTARTSYS;
+
+	if (cam->disconnected) {
+		DBG(2, "Device not present.")
+		up(&cam->fileop_sem);
+		return -ENODEV;
+	}
+
+	if (cam->misconfigured) {
+		DBG(2, "The camera is misconfigured. Close and open it again.")
+		up(&cam->fileop_sem);
+		return -EIO;
+	}
+
+	if (!cam->frame[0].queued)
+		w9968cf_push_frame(cam, 0);
+
+	if (!cam->frame[1].queued)
+		w9968cf_push_frame(cam, 1);
+
+	err = wait_event_interruptible(cam->wait_queue,
+	                               cam->frame[0].status == F_READY ||
+	                               cam->frame[1].status == F_READY ||
+	                               cam->disconnected);
+	if (err) {
+		up(&cam->fileop_sem);
+		return err;
+	}
+	if (cam->disconnected) {
+		up(&cam->fileop_sem);
+		return -ENODEV;
+	}
+
+	fr = (cam->frame[0].status == F_READY) ? &cam->frame[0]:&cam->frame[1];
+
+	if (w9968cf_vppmod_present)
+		w9968cf_postprocess_frame(cam, fr);
+
+	if (count > fr->length)
+		count = fr->length;
+
+	if (copy_to_user(buf, fr->buffer, count)) {
+		fr->status = F_UNUSED;
+		up(&cam->fileop_sem);
+		return -EFAULT;
+	}
+	*f_pos += count;
+
+	fr->status = F_UNUSED;
+
+	DBG(5, "%d bytes read.", count)
+
+	up(&cam->fileop_sem);
+	return count;
+}
+
+
+static int w9968cf_mmap(struct file* filp, struct vm_area_struct *vma)
+{
+	struct w9968cf_device* cam =
+	  (struct w9968cf_device*)video_devdata(filp)->priv;
+
+	unsigned long vsize = vma->vm_end - vma->vm_start,
+	              psize = cam->nbuffers * w9968cf_get_max_bufsize(cam),
+	              start = vma->vm_start,
+	              pos = (unsigned long)cam->frame[0].buffer,
+	              page;
+
+	if (cam->disconnected) {
+		DBG(2, "Device not present.")
+		return -ENODEV;
+	}
+
+	if (cam->misconfigured) {
+		DBG(2, "The camera is misconfigured. Close and open it again.")
+		return -EIO;
+	}
+
+	PDBGG("mmapping %li bytes...", vsize)
+
+        if (vsize > psize - (vma->vm_pgoff << PAGE_SHIFT))
+		return -EAGAIN;
+
+	while (vsize > 0) {
+		page = kvirt_to_pa(pos) + vma->vm_pgoff;
+		if (remap_page_range(vma, start, page, PAGE_SIZE, 
+		                     vma->vm_page_prot))
+			return -EAGAIN;
+		start += PAGE_SIZE;
+		pos += PAGE_SIZE;
+		vsize = (vsize > PAGE_SIZE) ? vsize-PAGE_SIZE : 0;
+	}
+
+	DBG(5, "mmap method successfully called.")
+	return 0;
+}
+
+
+static int
+w9968cf_ioctl(struct inode* inode, struct file* filp,
+              unsigned int cmd, unsigned long arg)
+{
+	struct w9968cf_device* cam =
+	  (struct w9968cf_device*)video_devdata(filp)->priv;
+	int err;
+
+	if (down_interruptible(&cam->fileop_sem))
+		return -ERESTARTSYS;
+
+	if (cam->disconnected) {
+		DBG(2, "Device not present.")
+		up(&cam->fileop_sem);
+		return -ENODEV;
+	}
+
+	if (cam->misconfigured) {
+		DBG(2, "The camera is misconfigured. Close and open it again.")
+		up(&cam->fileop_sem);
+		return -EIO;
+	}
+
+	err = w9968cf_do_ioctl(cam, cmd, (void*)arg);
+
+	up(&cam->fileop_sem);
+	return err;
+}
+
+
+static int 
+w9968cf_do_ioctl(struct w9968cf_device* cam, unsigned cmd, void* arg)
+{
+	const char* v4l1_ioctls[] = {
+		"?", "CGAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", 
+		"GPICT", "SPICT", "CCAPTURE", "GWIN", "SWIN", "GFBUF",
+		"SFBUF", "KEY", "GFREQ", "SFREQ", "GAUDIO", "SAUDIO",
+		"SYNC", "MCAPTURE", "GMBUF", "GUNIT", "GCAPTURE", "SCAPTURE",
+		"SPLAYMODE", "SWRITEMODE", "GPLAYINFO", "SMICROCODE", 
+		"GVBIFMT", "SVBIFMT" 
+	};
+
+	#define V4L1_IOCTL(cmd) \
+	        ((_IOC_NR((cmd)) < sizeof(v4l1_ioctls)/sizeof(char*)) ? \
+	        v4l1_ioctls[_IOC_NR((cmd))] : "???")
+
+	switch (cmd) {
+
+	case VIDIOCGCAP: /* get video capability */
+	{
+		struct video_capability cap = {
+			.type = VID_TYPE_CAPTURE | VID_TYPE_SCALES,
+			.channels = 1,
+			.audios = 0,
+			.minwidth = cam->minwidth,
+			.minheight = cam->minheight,
+		};
+		sprintf(cap.name, "W996[87]CF USB Camera #%d", 
+		        cam->v4ldev.minor);
+		cap.maxwidth = (cam->upscaling && w9968cf_vppmod_present)
+		               ? W9968CF_MAX_WIDTH : cam->maxwidth;
+		cap.maxheight = (cam->upscaling && w9968cf_vppmod_present)
+		                ? W9968CF_MAX_HEIGHT : cam->maxheight;
+
+		if (copy_to_user(arg, &cap, sizeof(cap)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGCAP successfully called.")
+		return 0;
+	}
+
+	case VIDIOCGCHAN: /* get video channel informations */
+	{
+		struct video_channel chan;
+		if (copy_from_user(&chan, arg, sizeof(chan)))
+			return -EFAULT;
+
+		if (chan.channel != 0)
+			return -EINVAL;
+
+		strcpy(chan.name, "Camera");
+		chan.tuners = 0;
+		chan.flags = 0;
+		chan.type = VIDEO_TYPE_CAMERA;
+		chan.norm = VIDEO_MODE_AUTO;
+
+		if (copy_to_user(arg, &chan, sizeof(chan)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGCHAN successfully called.")
+		return 0;
+	}
+
+	case VIDIOCSCHAN: /* set active channel */
+	{
+		struct video_channel chan;
+
+		if (copy_from_user(&chan, arg, sizeof(chan)))
+			return -EFAULT;
+
+		if (chan.channel != 0)
+			return -EINVAL;
+
+		DBG(5, "VIDIOCSCHAN successfully called.")
+		return 0;
+	}
+
+	case VIDIOCGPICT: /* get image properties of the picture */
+	{
+		struct video_picture pict;
+
+		if (w9968cf_sensor_get_picture(cam, &pict))
+			return -EIO;
+
+		pict.depth = cam->picture.depth;
+		pict.palette = cam->picture.palette;
+
+		if (copy_to_user(arg, &pict, sizeof(pict)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGPICT successfully called.")
+		return 0;
+	}
+
+	case VIDIOCSPICT: /* change picture settings */
+	{
+		struct video_picture pict;
+		int err = 0;
+
+		if (copy_from_user(&pict, arg, sizeof(pict)))
+			return -EFAULT;
+
+		if ( (cam->force_palette || !w9968cf_vppmod_present) 
+		     && pict.palette != cam->picture.palette ) {
+			DBG(4, "Palette %s rejected. Only %s is allowed.",
+			    symbolic(v4l1_plist, pict.palette),
+			    symbolic(v4l1_plist, cam->picture.palette))
+			return -EINVAL;
+		}
+
+		if (!w9968cf_valid_palette(pict.palette)) {
+			DBG(4, "Palette %s not supported. VIDIOCSPICT failed.",
+			    symbolic(v4l1_plist, pict.palette))
+			return -EINVAL;
+		}
+
+		if (pict.depth != w9968cf_valid_depth(pict.palette)) {
+			DBG(4, "Depth %d bpp is not supported for %s palette. "
+			       "VIDIOCSPICT failed.", 
+			    pict.depth, symbolic(v4l1_plist, pict.palette))
+			return -EINVAL;
+		}
+
+		if (!cam->force_palette) {
+		   if (cam->decompression == 0) {
+		      if (w9968cf_need_decompression(pict.palette)) {
+		         DBG(4, "Decompression disabled: palette %s is not "
+		                "allowed. VIDIOCSPICT failed.",
+		             symbolic(v4l1_plist, pict.palette))
+		         return -EINVAL;
+		      }
+		   } else if (cam->decompression == 1) {
+		      if (!w9968cf_need_decompression(pict.palette)) {
+		         DBG(4, "Decompression forced: palette %s is not "
+		                "allowed. VIDIOCSPICT failed.",
+		             symbolic(v4l1_plist, pict.palette))
+		         return -EINVAL;
+		      }
+		   }
+		}
+
+		if (pict.palette != cam->picture.palette ||
+		    pict.depth   != cam->picture.depth)
+		{
+			if(*cam->requested_frame
+			   || cam->frame_current->queued) {
+				err = wait_event_interruptible
+				      ( cam->wait_queue,
+				        cam->disconnected ||
+				        (!*cam->requested_frame &&
+				         !cam->frame_current->queued) );
+				if (err)
+					return err;
+				if (cam->disconnected)
+					return -ENODEV;
+			}
+
+			if (w9968cf_stop_transfer(cam))
+				goto ioctl_fail;
+
+			if (w9968cf_set_picture(cam, pict))
+				goto ioctl_fail;
+
+			if (w9968cf_start_transfer(cam))
+				goto ioctl_fail;
+
+		} else if ( ((pict.brightness != cam->picture.brightness) &&
+		            (!cam->auto_brt)) ||
+		            pict.hue != cam->picture.hue ||
+		            pict.colour != cam->picture.colour ||
+		            pict.contrast != cam->picture.contrast ||
+		            pict.whiteness != cam->picture.whiteness ) {
+			if (w9968cf_sensor_set_picture(cam, pict))
+				return -EIO;
+		}
+
+		DBG(5, "VIDIOCSPICT successfully called.")
+		return 0;
+	}
+
+	case VIDIOCSWIN: /* set capture area */
+	{
+		struct video_window win;
+		int err = 0;
+
+		if (copy_from_user(&win, arg, sizeof(win)))
+			return -EFAULT;
+
+		DBG(6, "VIDIOCSWIN called: clipcount=%d, flags=%d, "
+		       "x=%d, y=%d, %dx%d", win.clipcount, win.flags,
+		    win.x, win.y, win.width, win.height)
+
+		if (win.clipcount != 0 || win.flags != 0)
+			return -EINVAL;
+
+		if ((err = w9968cf_adjust_window_size(cam, (u16*)&win.width,
+		                                      (u16*)&win.height))) {
+			DBG(4, "Resolution not supported (%dx%d)."
+			       "VIDIOCSWIN failed.", win.width, win.height)
+			return err;
+		}
+
+		if (win.x != cam->window.x ||
+		    win.y != cam->window.y ||
+		    win.width != cam->window.width ||
+		    win.height != cam->window.height) {
+
+			if(*cam->requested_frame
+			   || cam->frame_current->queued) {
+				err = wait_event_interruptible
+				      ( cam->wait_queue,
+				        cam->disconnected ||
+				        (!*cam->requested_frame &&
+				         !cam->frame_current->queued) );
+				if (err)
+					return err;
+				if (cam->disconnected)
+					return -ENODEV;
+			}
+
+			if (w9968cf_stop_transfer(cam))
+				goto ioctl_fail;
+
+			/* This _must_ be called before set_window() */
+			if (w9968cf_set_picture(cam, cam->picture))
+				goto ioctl_fail;
+
+			if (w9968cf_set_window(cam, win))
+				goto ioctl_fail;
+
+			if (w9968cf_start_transfer(cam))
+				goto ioctl_fail;
+		}
+
+		DBG(5, "VIDIOCSWIN successfully called. ")
+		return 0;
+	}
+
+	case VIDIOCGWIN: /* get current window properties */
+	{
+		if (copy_to_user(arg,&cam->window,sizeof(struct video_window)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGWIN successfully called.")
+		return 0;
+	}
+
+	case VIDIOCGMBUF: /* request for memory (mapped) buffer */
+	{
+		struct video_mbuf mbuf;
+		u8 i;
+
+		mbuf.size = cam->nbuffers * w9968cf_get_max_bufsize(cam);
+		mbuf.frames = cam->nbuffers;
+		for (i = 0; i < cam->nbuffers; i++)
+			mbuf.offsets[i] = (unsigned long)cam->frame[i].buffer -
+			                  (unsigned long)cam->frame[0].buffer;
+
+		if (copy_to_user(arg, &mbuf, sizeof(mbuf)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGMBUF successfully called.")
+		return 0;
+	}
+
+	case VIDIOCMCAPTURE: /* start the capture to a frame */
+	{
+		struct video_mmap mmap;
+		struct w9968cf_frame_t* fr;
+		int err = 0;
+
+		if (copy_from_user(&mmap, arg, sizeof(mmap)))
+			return -EFAULT;
+
+		DBG(6, "VIDIOCMCAPTURE called: frame #%d, format=%s, %dx%d",
+		    mmap.frame, symbolic(v4l1_plist, mmap.format), 
+		    mmap.width, mmap.height)
+
+		if (mmap.frame >= cam->nbuffers) {
+			DBG(4, "Invalid frame number (%d). "
+			       "VIDIOCMCAPTURE failed.", mmap.frame)
+			return -EINVAL;
+		}
+
+		if (mmap.format!=cam->picture.palette && 
+		    (cam->force_palette || !w9968cf_vppmod_present)) {
+			DBG(4, "Palette %s rejected. Only %s is allowed.",
+			    symbolic(v4l1_plist, mmap.format),
+			    symbolic(v4l1_plist, cam->picture.palette))
+			return -EINVAL;
+		}
+
+		if (!w9968cf_valid_palette(mmap.format)) {
+			DBG(4, "Palette %s not supported. "
+			       "VIDIOCMCAPTURE failed.", 
+			    symbolic(v4l1_plist, mmap.format))
+			return -EINVAL;
+		}
+
+		if (!cam->force_palette) {
+		   if (cam->decompression == 0) {
+		      if (w9968cf_need_decompression(mmap.format)) {
+		         DBG(4, "Decompression disabled: palette %s is not "
+		                "allowed. VIDIOCSPICT failed.",
+		             symbolic(v4l1_plist, mmap.format))
+		         return -EINVAL;
+		      }
+		   } else if (cam->decompression == 1) {
+		      if (!w9968cf_need_decompression(mmap.format)) {
+		         DBG(4, "Decompression forced: palette %s is not "
+		                "allowed. VIDIOCSPICT failed.",
+		             symbolic(v4l1_plist, mmap.format))
+		         return -EINVAL;
+		      }
+		   }
+		}
+
+		if (w9968cf_adjust_window_size(cam, (u16*)&mmap.width, 
+		                               (u16*)&mmap.height)) {
+			DBG(4, "Resolution not supported (%dx%d). "
+			       "VIDIOCMCAPTURE failed.",
+			    mmap.width, mmap.height)
+			return -EINVAL;
+		}
+
+		fr = &cam->frame[mmap.frame];
+
+		if (mmap.width  != cam->window.width ||
+		    mmap.height != cam->window.height ||
+		    mmap.format != cam->picture.palette) {
+
+			struct video_window win;
+			struct video_picture pict;
+
+			if(*cam->requested_frame
+			   || cam->frame_current->queued) {
+				DBG(6, "VIDIOCMCAPTURE. Change settings for "
+				       "frame #%d: %dx%d, format %s. Wait...",
+				    mmap.frame, mmap.width, mmap.height,
+			            symbolic(v4l1_plist, mmap.format))
+				err = wait_event_interruptible
+				      ( cam->wait_queue,
+				        cam->disconnected ||
+				        (!*cam->requested_frame &&
+				         !cam->frame_current->queued) );
+				if (err)
+					return err;
+				if (cam->disconnected)
+					return -ENODEV;
+			}
+
+			memcpy(&win, &cam->window, sizeof(win));
+			memcpy(&pict, &cam->picture, sizeof(pict));
+			win.width = mmap.width;
+			win.height = mmap.height;
+			pict.palette = mmap.format;
+
+			if (w9968cf_stop_transfer(cam))
+				goto ioctl_fail;
+
+			/* This before set_window */
+			if (w9968cf_set_picture(cam, pict)) 
+				goto ioctl_fail;
+
+			if (w9968cf_set_window(cam, win))
+				goto ioctl_fail;
+
+			if (w9968cf_start_transfer(cam))
+				goto ioctl_fail;
+
+		} else 	if (fr->queued) {
+
+			DBG(6, "Wait until frame #%d is free.", mmap.frame)
+			
+			err = wait_event_interruptible(cam->wait_queue, 
+			                               cam->disconnected ||
+			                               (!fr->queued));
+			if (err)
+				return err;
+			if (cam->disconnected)
+				return -ENODEV;
+		}
+
+		w9968cf_push_frame(cam, mmap.frame);
+		DBG(5, "VIDIOCMCAPTURE(%d): successfully called.", mmap.frame)
+		return 0;
+	}
+
+	case VIDIOCSYNC: /* wait until the capture of a frame is finished */
+	{
+		unsigned int f_num = *((unsigned int *) arg);
+		struct w9968cf_frame_t* fr;
+		int err = 0;
+
+		if (f_num >= cam->nbuffers) {
+			DBG(4, "Invalid frame number (%d). "
+			       "VIDIOCMCAPTURE failed.", f_num)
+			return -EINVAL;
+		}
+
+		DBG(6, "VIDIOCSYNC called for frame #%d", f_num)
+
+		fr = &cam->frame[f_num];
+
+		switch (fr->status) {
+		case F_UNUSED:
+			if (!fr->queued) {
+				DBG(4, "VIDIOSYNC: Frame #%d not requested!",
+				    f_num)
+				return -EFAULT;
+			}
+		case F_ERROR:
+		case F_GRABBING:
+			err = wait_event_interruptible(cam->wait_queue, 
+			                               (fr->status == F_READY)
+			                               || cam->disconnected);
+			if (err)
+				return err;
+			if (cam->disconnected)
+				return -ENODEV;
+			break;
+		case F_READY:
+			break;
+		}
+
+		if (w9968cf_vppmod_present)
+			w9968cf_postprocess_frame(cam, fr);
+
+		fr->status = F_UNUSED;
+
+		DBG(5, "VIDIOCSYNC(%d) successfully called.", f_num)
+		return 0;
+	}
+
+	case VIDIOCGUNIT:/* report the unit numbers of the associated devices*/
+	{
+		struct video_unit unit = {
+			.video = cam->v4ldev.minor,
+			.vbi = VIDEO_NO_UNIT,
+			.radio = VIDEO_NO_UNIT,
+			.audio = VIDEO_NO_UNIT,
+			.teletext = VIDEO_NO_UNIT,
+		};
+
+		if (copy_to_user(arg, &unit, sizeof(unit)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGUNIT successfully called.")
+		return 0;
+	}
+
+	case VIDIOCKEY:
+		return 0;
+
+	case VIDIOCGFBUF:
+	{
+		struct video_buffer* buffer = (struct video_buffer*)arg;
+
+		memset(buffer, 0, sizeof(struct video_buffer));
+
+		DBG(5, "VIDIOCGFBUF successfully called.")
+		return 0;
+	}
+
+	case VIDIOCGTUNER:
+	{
+		struct video_tuner tuner;
+		if (copy_from_user(&tuner, arg, sizeof(tuner)))
+			return -EFAULT;
+
+		if (tuner.tuner != 0);
+			return -EINVAL;
+
+		strcpy(tuner.name, "no_tuner");
+		tuner.rangelow = 0;
+		tuner.rangehigh = 0;
+		tuner.flags = VIDEO_TUNER_NORM;
+		tuner.mode = VIDEO_MODE_AUTO;
+		tuner.signal = 0xffff;
+
+		if (copy_to_user(arg, &tuner, sizeof(tuner)))
+			return -EFAULT;
+
+		DBG(5, "VIDIOCGTUNER successfully called.")
+		return 0;
+	}
+
+	case VIDIOCSTUNER:
+	{
+		struct video_tuner tuner;
+		if (copy_from_user(&tuner, arg, sizeof(tuner)))
+			return -EFAULT;
+
+		if (tuner.tuner != 0)
+			return -EINVAL;
+
+		if (tuner.mode != VIDEO_MODE_AUTO)
+			return -EINVAL;
+
+		DBG(5, "VIDIOCSTUNER successfully called.")
+		return 0;
+	}
+
+	case VIDIOCSFBUF:
+	case VIDIOCCAPTURE:
+	case VIDIOCGFREQ:
+	case VIDIOCSFREQ:
+	case VIDIOCGAUDIO:
+	case VIDIOCSAUDIO:
+	case VIDIOCSPLAYMODE:
+	case VIDIOCSWRITEMODE:
+	case VIDIOCGPLAYINFO:
+	case VIDIOCSMICROCODE:
+	case VIDIOCGVBIFMT:
+	case VIDIOCSVBIFMT:
+		DBG(4, "Unsupported V4L1 IOCtl: VIDIOC%s "
+		       "(type 0x%01X, "
+		       "n. 0x%01X, "
+		       "dir. 0x%01X, " 
+		       "size 0x%02X).",
+		    V4L1_IOCTL(cmd),
+		    _IOC_TYPE(cmd),_IOC_NR(cmd),_IOC_DIR(cmd),_IOC_SIZE(cmd))
+
+		return -EINVAL;
+
+	default:
+		DBG(4, "Invalid V4L1 IOCtl: VIDIOC%s "
+		       "type 0x%01X, "
+		       "n. 0x%01X, "
+		       "dir. 0x%01X, "
+		       "size 0x%02X.",
+		    V4L1_IOCTL(cmd),
+		    _IOC_TYPE(cmd),_IOC_NR(cmd),_IOC_DIR(cmd),_IOC_SIZE(cmd))
+
+		return -ENOIOCTLCMD;
+
+	} /* end of switch */
+
+ioctl_fail:
+	cam->misconfigured = 1;
+	DBG(1, "VIDIOC%s failed because of hardware problems. "
+	       "To use the camera, close and open it again.", V4L1_IOCTL(cmd))
+	return -EFAULT;
+}
+
+
+static struct file_operations w9968cf_fops = {
+	.owner =   THIS_MODULE,
+	.open =    w9968cf_open,
+	.release = w9968cf_release,
+	.read =    w9968cf_read,
+	.ioctl =   w9968cf_ioctl,
+	.mmap =    w9968cf_mmap,
+	.llseek =  no_llseek,
+};
+
+
+
+/****************************************************************************
+ * USB probe and V4L registration, disconnect and id_table[] definition     *
+ ****************************************************************************/
+
+static int
+w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
+{
+	struct usb_device *udev = interface_to_usbdev(intf);
+	struct w9968cf_device* cam;
+	int err = 0;
+	enum w9968cf_model_id mod_id;
+	struct list_head* ptr;
+	u8 sc = 0; /* number of simultaneous cameras */
+	static unsigned short dev_nr = 0; /* we are handling device number n */
+
+	if (udev->descriptor.idVendor  == winbond_id_table[0].idVendor &&
+	    udev->descriptor.idProduct == winbond_id_table[0].idProduct)
+		mod_id = W9968CF_MOD_CLVBWGP; /* see camlist[] table */
+
+	else if (udev->descriptor.idVendor  == winbond_id_table[1].idVendor &&
+	         udev->descriptor.idProduct == winbond_id_table[1].idProduct)
+		mod_id = W9968CF_MOD_GENERIC; /* see camlist[] table */
+
+	else
+		return -ENODEV;
+
+	/* We don't handle multi-config cameras */
+	if (udev->descriptor.bNumConfigurations != 1)
+		return -ENODEV;
+
+	DBG(2, "%s detected.", symbolic(camlist, mod_id))
+
+	if (simcams > W9968CF_MAX_DEVICES)
+		simcams = W9968CF_SIMCAMS;
+
+	/* How many cameras are connected ? */
+	down(&w9968cf_devlist_sem);
+	list_for_each(ptr, &w9968cf_dev_list)
+		sc++;
+	up(&w9968cf_devlist_sem);
+
+	if (sc >= simcams) {
+		DBG(2, "Device rejected: too many connected cameras "
+		       "(max. %d)", simcams)
+		return -EPERM;
+	}
+
+	err = usb_set_configuration(udev, 1);
+	err += usb_set_interface(udev, 0, 0);
+
+	if (err) {
+		DBG(1, "Device configuration failed.")
+		return -EIO;
+	}
+
+	cam = (struct w9968cf_device*)
+	          kmalloc(sizeof(struct w9968cf_device), GFP_KERNEL);
+
+	if (!cam) {
+		DBG(1, "Couldn't allocate %d bytes of kernel memory.",
+		    sizeof(struct w9968cf_device))
+		err = -ENOMEM;
+		goto fail;
+	}
+	memset(cam, 0, sizeof(*cam));
+
+	init_MUTEX(&cam->dev_sem);
+	down(&cam->dev_sem);
+
+	/* Allocate 2 bytes of memory for camera control USB transfers */
+	if (!(cam->control_buffer = (u16*)kmalloc(2, GFP_KERNEL))) {
+		DBG(1,"Couldn't allocate memory for camera control transfers.")
+		err = -ENOMEM;
+		goto fail;
+	}
+	memset(cam->control_buffer, 0, 2);
+
+	/* Allocate 8 bytes of memory for USB data transfers to the FSB */
+	if (!(cam->data_buffer = (u16*)kmalloc(8, GFP_KERNEL))) {
+		DBG(1, "Couldn't allocate memory for data "
+		       "transfers to the FSB.")
+		err = -ENOMEM;
+		goto fail;
+	}
+	memset(cam->data_buffer, 0, 8);
+
+	/* Set some basic constants */
+	w9968cf_configure_camera(cam, udev, mod_id, dev_nr);
+
+	err = video_register_device(&cam->v4ldev, VFL_TYPE_GRABBER,
+	                            video_nr[dev_nr]);
+	if (err) {
+		DBG(1, "V4L device registration failed.")
+		if (err == -ENFILE && video_nr[dev_nr] == -1)
+			DBG(2, "Couldn't find a free /dev/videoX node.")
+		video_nr[dev_nr] = -1;
+		dev_nr = (dev_nr < W9968CF_MAX_DEVICES-1) ? dev_nr+1 : 0;
+		goto fail;
+	}
+
+	DBG(2, "V4L device registered as /dev/video%d", cam->v4ldev.minor)
+
+	/* Ok, add a new entry into the list of V4L registered devices */
+	down(&w9968cf_devlist_sem);
+	list_add(&cam->v4llist, &w9968cf_dev_list);
+	up(&w9968cf_devlist_sem);
+
+	dev_nr = (dev_nr < W9968CF_MAX_DEVICES-1) ? dev_nr+1 : 0;
+
+	w9968cf_turn_on_led(cam);
+
+	w9968cf_i2c_init(cam);
+
+	up(&cam->dev_sem);
+
+	dev_set_drvdata(&intf->dev, (void*)cam);
+
+	return 0;
+
+fail: /* Free unused memory */
+	if (cam) {
+		if (cam->control_buffer)
+			kfree(cam->control_buffer);
+		if (cam->data_buffer)
+			kfree(cam->data_buffer);
+		up(&cam->dev_sem);
+		kfree(cam);
+	}
+	return err;
+}
+
+
+static void w9968cf_usb_disconnect(struct usb_interface* intf)
+{
+	struct w9968cf_device* cam = 
+	   (struct w9968cf_device*)dev_get_drvdata(&intf->dev);
+
+	dev_set_drvdata(&intf->dev, NULL);
+
+	if (cam) {
+		/* Prevent concurrent accesses to data */
+		down(&cam->dev_sem); 
+
+		cam->streaming = 0;
+		cam->disconnected = 1;
+
+		DBG(2, "Disconnecting %s...", symbolic(camlist, cam->id))
+
+		if (waitqueue_active(&cam->open))
+			wake_up_interruptible(&cam->open);
+
+		if (cam->users) {
+			DBG(2, "The device is open (/dev/video%d)! "
+			       "Process name: %s. Deregistration and memory "
+			       "deallocation are deferred on close.",
+			    cam->v4ldev.minor, cam->command)
+
+			cam->misconfigured = 1;
+
+			if (waitqueue_active(&cam->wait_queue))
+				wake_up_interruptible(&cam->wait_queue);
+		} else
+			w9968cf_release_resources(cam);
+
+		up(&cam->dev_sem);
+
+		if (!cam->users)
+			kfree(cam);
+	}
+}
+
+
+static struct usb_driver w9968cf_usb_driver = {
+	.owner =      THIS_MODULE,
+	.name =       "w9968cf",
+	.id_table =   winbond_id_table,
+	.probe =      w9968cf_usb_probe,
+	.disconnect = w9968cf_usb_disconnect,
+};
+
+
+
+/****************************************************************************
+ * Module init, exit and intermodule communication                          *
+ ****************************************************************************/
+
+static int w9968cf_vppmod_detect(void)
+{
+	w9968cf_vpp_init_decoder = inter_module_get("w9968cf_init_decoder");
+
+	if (!w9968cf_vpp_init_decoder) {
+		if (vppmod_load)
+			w9968cf_vpp_init_decoder = inter_module_get_request
+		                                  ( "w9968cf_init_decoder",
+			                            "w9968cf-vpp" );
+		if (!w9968cf_vpp_init_decoder) {
+			w9968cf_vppmod_present = 0;
+			DBG(4, "Video post-processing module not detected.")
+			return -ENODEV;
+		}
+	}
+
+	w9968cf_vpp_check_headers = inter_module_get("w9968cf_check_headers");
+	w9968cf_vpp_decode = inter_module_get("w9968cf_decode");
+	w9968cf_vpp_swap_yuvbytes = inter_module_get("w9968cf_swap_yuvbytes");
+	w9968cf_vpp_uyvy_to_rgbx = inter_module_get("w9968cf_uyvy_to_rgbx");
+	w9968cf_vpp_scale_up = inter_module_get("w9968cf_scale_up");
+
+	w9968cf_vppmod_present = 1;
+
+	/* Initialization */
+	(*w9968cf_vpp_init_decoder)();
+
+	DBG(2, "Video post-processing module detected.")
+	return 0;
+}
+
+
+static void w9968cf_vppmod_release(void)
+{
+	inter_module_put("w9968cf_init_decoder");
+	inter_module_put("w9968cf_check_headers");
+	inter_module_put("w9968cf_decode");
+	inter_module_put("w9968cf_swap_yuvbytes");
+	inter_module_put("w9968cf_uyvy_to_rgbx");
+	inter_module_put("w9968cf_scale_up");
+
+	DBG(2, "Video post-processing module released.")
+}
+
+
+static int __init w9968cf_module_init(void)
+{
+	int err;
+
+	DBG(2, W9968CF_MODULE_NAME" "W9968CF_MODULE_VERSION)
+	DBG(3, W9968CF_MODULE_AUTHOR)
+
+	init_MUTEX(&w9968cf_devlist_sem);
+
+	w9968cf_vppmod_detect();
+
+	if ((err = usb_register(&w9968cf_usb_driver))) {
+		if (w9968cf_vppmod_present)
+			w9968cf_vppmod_release();
+		return err;
+	}
+
+	return 0;
+}
+
+
+static void __exit w9968cf_module_exit(void)
+{
+	/* w9968cf_usb_disconnect() will be called */
+	usb_deregister(&w9968cf_usb_driver);
+
+	if (w9968cf_vppmod_present)
+		w9968cf_vppmod_release();
+
+	DBG(2, W9968CF_MODULE_NAME" deregistered.")
+}
+
+
+module_init(w9968cf_module_init);
+module_exit(w9968cf_module_exit);
diff -Nru a/drivers/usb/media/w9968cf.h b/drivers/usb/media/w9968cf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/usb/media/w9968cf.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,312 @@
+/***************************************************************************
+ * Video4Linux driver for W996[87]CF JPEG USB Dual Mode Camera Chip.       *
+ *                                                                         *
+ * Copyright (C) 2002 2003 by Luca Risolia <luca_ing@libero.it>            *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 2 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program; if not, write to the Free Software             *
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
+ ***************************************************************************/
+
+#ifndef _W9968CF_H_
+#define _W9968CF_H_
+
+#include <linux/videodev.h>
+#include <linux/usb.h>
+#include <linux/i2c.h>
+#include <linux/spinlock.h>
+#include <linux/list.h>
+#include <linux/wait.h>
+#include <linux/config.h>
+#include <asm/semaphore.h>
+#include <asm/types.h>
+
+#include "w9968cf_externaldef.h"
+
+
+/****************************************************************************
+ * Default values                                                           *
+ ****************************************************************************/
+
+#define W9968CF_VPPMOD_LOAD     1  /* automatic 'w9968cf-vpp' module loading */
+
+/* Comment/uncomment the following line to enable/disable debugging messages */
+#define W9968CF_DEBUG
+
+/* These have effect only if W9968CF_DEBUG is defined */
+#define W9968CF_DEBUG_LEVEL    2 /* from 0 to 6. 0 for no debug informations */
+#define W9968CF_SPECIFIC_DEBUG 0 /* 0 or 1 */
+
+#define W9968CF_MAX_DEVICES    32
+#define W9968CF_SIMCAMS        W9968CF_MAX_DEVICES /* simultaneous cameras */
+
+#define W9968CF_MAX_BUFFERS   32
+#define W9968CF_BUFFERS       2 /* n. of frame buffers from 2 to MAX_BUFFERS */
+
+/* Maximum data payload sizes in bytes for alternate settings */
+static const u16 wMaxPacketSize[] = {1023, 959, 895, 831, 767, 703, 639, 575,
+                                      511, 447, 383, 319, 255, 191, 127,  63};
+#define W9968CF_PACKET_SIZE      1023 /* according to wMaxPacketSizes[] */
+#define W9968CF_MIN_PACKET_SIZE  63 /* minimum value */
+#define W9968CF_ISO_PACKETS      5 /* n.of packets for isochronous transfers */
+#define W9968CF_USB_CTRL_TIMEOUT HZ /* timeout for usb control commands */
+#define W9968CF_URBS             2 /* n. of scheduled URBs for ISO transfer */
+
+#define W9968CF_I2C_BUS_DELAY    4 /* delay in us for I2C bit r/w operations */
+#define W9968CF_I2C_RW_RETRIES   15 /* number of max I2C r/w retries */
+
+/* Available video formats */
+struct w9968cf_format {
+	const u16 palette;
+	const u16 depth;
+	const u8 compression;
+};
+
+static const struct w9968cf_format w9968cf_formatlist[] = {
+	{ VIDEO_PALETTE_UYVY,    16, 0 }, /* original video */
+	{ VIDEO_PALETTE_YUV422P, 16, 1 }, /* with JPEG compression */
+	{ VIDEO_PALETTE_YUV420P, 12, 1 }, /* with JPEG compression */
+	{ VIDEO_PALETTE_YUV420,  12, 1 }, /* same as YUV420P */
+	{ VIDEO_PALETTE_YUYV,    16, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_YUV422,  16, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_GREY,     8, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_RGB555,  16, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_RGB565,  16, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_RGB24,   24, 0 }, /* software conversion */
+	{ VIDEO_PALETTE_RGB32,   32, 0 }, /* software conversion */
+	{ 0,                      0, 0 }  /* 0 is a terminating entry */
+};
+
+#define W9968CF_DECOMPRESSION    2 /* decomp:0=disable,1=force,2=any formats */
+#define W9968CF_PALETTE_DECOMP_OFF   VIDEO_PALETTE_UYVY    /* when decomp=0 */
+#define W9968CF_PALETTE_DECOMP_FORCE VIDEO_PALETTE_YUV420P /* when decomp=1 */
+#define W9968CF_PALETTE_DECOMP_ON    VIDEO_PALETTE_UYVY    /* when decomp=2 */
+
+#define W9968CF_FORCE_RGB        0  /* read RGB instead of BGR, yes=1/no=0 */
+
+#define W9968CF_MAX_WIDTH      800 /* should be >= 640 */
+#define W9968CF_MAX_HEIGHT     600 /* should be >= 480 */
+#define W9968CF_WIDTH          320 /* from 128 to 352, multiple of 16 */
+#define W9968CF_HEIGHT         240 /* from  96 to 288, multiple of 16 */
+
+#define W9968CF_CLAMPING       0 /* 0 disable, 1 enable video data clamping */
+#define W9968CF_FILTER_TYPE    0 /* 0 disable  1 (1-2-1), 2 (2-3-6-3-2) */
+#define W9968CF_DOUBLE_BUFFER  1 /* 0 disable, 1 enable double buffer */
+#define W9968CF_LARGEVIEW      1 /* 0 disable, 1 enable */
+#define W9968CF_UPSCALING      0 /* 0 disable, 1 enable */
+
+#define W9968CF_SENSOR_MONO    0 /* 0 not monochrome, 1 monochrome sensor */
+#define W9968CF_BRIGHTNESS     31000 /* from 0 to 65535 */
+#define W9968CF_HUE            32768 /* from 0 to 65535 */
+#define W9968CF_COLOUR         32768 /* from 0 to 65535 */
+#define W9968CF_CONTRAST       50000 /* from 0 to 65535 */
+#define W9968CF_WHITENESS      32768 /* from 0 to 65535 */
+
+#define W9968CF_AUTOBRIGHT     0 /* 0 disable, 1 enable automatic brightness */
+#define W9968CF_AUTOEXP        1 /* 0 disable, 1 enable automatic exposure */
+#define W9968CF_LIGHTFREQ      50 /* light frequency. 50Hz (Europe) or 60Hz */
+#define W9968CF_BANDINGFILTER  0 /* 0 disable, 1 enable banding filter */
+#define W9968CF_BACKLIGHT      0 /* 0 or 1, 1=object is lit from behind */
+#define W9968CF_MIRROR         0 /* 0 or 1 [don't] reverse image horizontally*/
+
+#define W9968CF_CLOCKDIV         -1 /* -1 = automatic clock divisor */
+#define W9968CF_DEF_CLOCKDIVISOR  0 /* default sensor clock divisor value */
+
+
+/****************************************************************************
+ * Globals                                                                  *
+ ****************************************************************************/
+
+#define W9968CF_MODULE_NAME     "V4L driver for W996[87]CF JPEG USB " \
+                                "Dual Mode Camera Chip"
+#define W9968CF_MODULE_VERSION  "v1.22"
+#define W9968CF_MODULE_AUTHOR   "(C) 2002 2003 Luca Risolia"
+#define W9968CF_AUTHOR_EMAIL    "<luca_ing@libero.it>"
+
+static u8 w9968cf_vppmod_present; /* status flag: yes=1, no=0 */
+
+static const struct usb_device_id winbond_id_table[] = {
+	{
+		/* Creative Labs Video Blaster WebCam Go Plus */
+		USB_DEVICE(0x041e, 0x4003),
+		.driver_info = (unsigned long)"w9968cf",
+	},
+	{
+		/* Generic W996[87]CF JPEG USB Dual Mode Camera */
+		USB_DEVICE(0x1046, 0x9967),
+		.driver_info = (unsigned long)"w9968cf",
+	},
+	{ } /* terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, winbond_id_table);
+
+/* W996[87]CF camera models, internal ids: */
+enum w9968cf_model_id {
+	W9968CF_MOD_GENERIC = 1, /* Generic W996[87]CF based device */
+	W9968CF_MOD_CLVBWGP = 11,/*Creative Labs Video Blaster WebCam Go Plus*/
+	W9968CF_MOD_ADPA5R = 21, /* Aroma Digi Pen ADG-5000 Refurbished */
+	W9986CF_MOD_AU = 31,     /* AVerTV USB */
+	W9968CF_MOD_CLVBWG = 34, /* Creative Labs Video Blaster WebCam Go */
+	W9968CF_MOD_DLLDK = 37,  /* Die Lebon LDC-D35A Digital Kamera */
+	W9968CF_MOD_EEEMC = 40,   /* Ezonics EZ-802 EZMega Cam */
+	W9968CF_MOD_ODPVDMPC = 43,/* OPCOM Digi Pen VGA Dual Mode Pen Camera */
+};
+
+enum w9968cf_frame_status {
+	F_READY,            /* finished grabbing & ready to be read/synced */
+	F_GRABBING,         /* in the process of being grabbed into */
+	F_ERROR,            /* something bad happened while processing */
+	F_UNUSED            /* unused (no VIDIOCMCAPTURE) */
+};
+
+struct w9968cf_frame_t {
+	void* buffer;
+	u32 length;
+	enum w9968cf_frame_status status;
+	struct w9968cf_frame_t* next;
+	u8 queued;
+};
+
+enum w9968cf_vpp_flag {
+	VPP_NONE = 0x00,
+	VPP_UPSCALE = 0x01,
+	VPP_SWAP_YUV_BYTES = 0x02,
+	VPP_DECOMPRESSION = 0x04,
+	VPP_UYVY_TO_RGBX = 0x08,
+};
+
+struct list_head w9968cf_dev_list; /* head of V4L registered cameras list */
+LIST_HEAD(w9968cf_dev_list);
+struct semaphore w9968cf_devlist_sem; /* semaphore for list traversal */
+
+/* Main device driver structure */
+struct w9968cf_device {
+	enum w9968cf_model_id id;   /* private device identifier */
+
+	struct video_device v4ldev; /* V4L structure */
+	struct list_head v4llist;   /* entry of the list of V4L cameras */
+
+	struct usb_device* usbdev;           /* -> main USB structure */
+	struct urb* urb[W9968CF_URBS];       /* -> USB request block structs */
+	void* transfer_buffer[W9968CF_URBS]; /* -> ISO transfer buffers */
+	u16* control_buffer;                 /* -> buffer for control req.*/
+	u16* data_buffer;                    /* -> data to send to the FSB */
+
+	struct w9968cf_frame_t frame[W9968CF_MAX_BUFFERS];
+	struct w9968cf_frame_t frame_tmp;  /* temporary frame */
+	struct w9968cf_frame_t* frame_current; /* -> frame being grabbed */
+	struct w9968cf_frame_t* requested_frame[W9968CF_MAX_BUFFERS];
+	void* vpp_buffer; /* -> helper buffer for post-processing routines */
+
+	u8 max_buffers,   /* number of requested buffers */	   
+	   force_palette, /* yes=1/no=0 */
+	   force_rgb,     /* read RGB instead of BGR, yes=1, no=0 */
+	   double_buffer, /* hardware double buffering yes=1/no=0 */
+	   clamping,      /* video data clamping yes=1/no=0 */
+	   filter_type,   /* 0=disabled, 1=3 tap, 2=5 tap filter */
+	   capture,       /* 0=disabled, 1=enabled */
+	   largeview,     /* 0=disabled, 1=enabled */
+	   decompression, /* 0=disabled, 1=forced, 2=allowed */
+	   upscaling;     /* software image scaling, 0=enabled, 1=disabled */
+
+	struct video_picture picture; /* current window settings */
+	struct video_window window;   /* current picture settings */
+
+	u16 hw_depth,    /* depth (used by the chip) */
+	    hw_palette,  /* palette (used by the chip) */
+	    hw_width,    /* width (used by the chip) */
+	    hw_height,   /* height (used by the chip) */
+	    hs_polarity, /* 0=negative sync pulse, 1=positive sync pulse */
+	    vs_polarity; /* 0=negative sync pulse, 1=positive sync pulse */
+
+	enum w9968cf_vpp_flag vpp_flag; /* post-processing routines in use */
+
+	u8 nbuffers,      /* number of allocated frame buffers */
+	   altsetting,    /* camera alternate setting */
+	   disconnected,  /* flag: yes=1, no=0 */
+	   misconfigured, /* flag: yes=1, no=0 */
+	   users,         /* flag: number of users holding the device */
+	   streaming;     /* flag: yes=1, no=0 */
+
+	int sensor; /* type of image CMOS sensor chip (CC_*) */
+
+	/* Determined by CMOS sensor type */
+	u16 maxwidth,
+	    maxheight,
+	    minwidth,
+	    minheight,
+	    start_cropx,
+	    start_cropy;
+
+	u8  auto_brt,     /* auto brightness enabled flag */
+	    auto_exp,     /* auto exposure enabled flag */
+	    backlight,    /* backlight exposure algorithm flag */
+	    mirror,       /* image is reversed horizontally */
+	    lightfreq,    /* power (lighting) frequency */
+	    bandfilt;     /* banding filter enabled flag */
+	s8  clockdiv;     /* clock divisor */
+	int sensor_mono;  /* CMOS sensor is (probably) monochrome */
+
+	/* I2C interface to kernel */
+	struct i2c_adapter i2c_adapter;
+	struct i2c_client* sensor_client;
+
+	/* Locks */
+	struct semaphore dev_sem,    /* for probe, disconnect,open and close */
+	                 fileop_sem; /* for read and ioctl */
+	spinlock_t urb_lock,   /* for submit_urb() and unlink_urb() */
+	           flist_lock; /* for requested frame list accesses */
+	char command[16]; /* name of the program holding the device */
+	wait_queue_head_t open, wait_queue;
+};
+
+#define W9968CF_HW_BUF_SIZE 640*480*2 /* buf. size for original video frames */
+
+#define SENSOR_FORMAT          VIDEO_PALETTE_UYVY
+#define SENSOR_FATAL_ERROR(rc) ((rc) < 0 && (rc) != -EPERM)
+
+
+/****************************************************************************
+ * Macros and other constants                                               *
+ ****************************************************************************/
+
+#undef DBG
+#ifdef W9968CF_DEBUG
+#	define DBG(level, fmt, args...) \
+{ \
+if ( ((specific_debug) && (debug == (level))) || \
+     ((!specific_debug) && (debug >= (level))) ) { \
+	if ((level) == 1) \
+		err(fmt, ## args); \
+	else if ((level) == 2 || (level) == 3) \
+		info(fmt, ## args); \
+	else if ((level) == 4) \
+		warn(fmt, ## args); \
+	else if ((level) >= 5) \
+		info("[%s,%d] " fmt, \
+		     __PRETTY_FUNCTION__, __LINE__ , ## args); \
+} \
+}
+#else
+	/* Not debugging: nothing */
+#	define DBG(level, fmt, args...) do {;} while(0);
+#endif
+
+#undef PDBG
+#undef PDBGG
+#define PDBG(fmt, args...) info("[%s, %d] "fmt, \
+	                        __PRETTY_FUNCTION__, __LINE__ , ## args);
+#define PDBGG(fmt, args...) do {;} while(0); /* nothing: it's a placeholder */
+
+#endif /* _W9968CF_H_ */
diff -Nru a/drivers/usb/media/w9968cf_decoder.h b/drivers/usb/media/w9968cf_decoder.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/usb/media/w9968cf_decoder.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Video decoder for the W996[87]CF driver for Linux.                      *
+ *                                                                         *
+ * Copyright (C) 2003 by Luca Risolia <luca_ing@libero.it>                 *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 2 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program; if not, write to the Free Software             *
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
+ ***************************************************************************/
+
+#ifndef _W9968CF_DECODER_H_
+#define _W9968CF_DECODER_H_
+
+/* Comment/uncomment this for high/low quality of compressed video */
+#define W9968CF_DEC_FAST_LOWQUALITY_VIDEO
+
+#ifdef W9968CF_DEC_FAST_LOWQUALITY_VIDEO
+static const unsigned char Y_QUANTABLE[64] = {
+	16,  11,  10,  16,  24,  40,  51,  61,
+	12,  12,  14,  19,  26,  58,  60,  55,
+	14,  13,  16,  24,  40,  57,  69,  56,
+	14,  17,  22,  29,  51,  87,  80,  62,
+	18,  22,  37,  56,  68, 109, 103,  77,
+	24,  35,  55,  64,  81, 104, 113,  92,
+	49,  64,  78,  87, 103, 121, 120, 101,
+	72,  92,  95,  98, 112, 100, 103,  99
+};
+
+static const unsigned char UV_QUANTABLE[64] = {
+	17,  18,  24,  47,  99,  99,  99,  99,
+	18,  21,  26,  66,  99,  99,  99,  99,
+	24,  26,  56,  99,  99,  99,  99,  99,
+	47,  66,  99,  99,  99,  99,  99,  99,
+	99,  99,  99,  99,  99,  99,  99,  99,
+	99,  99,  99,  99,  99,  99,  99,  99,
+	99,  99,  99,  99,  99,  99,  99,  99,
+	99,  99,  99,  99,  99,  99,  99,  99
+};
+#else
+static const unsigned char Y_QUANTABLE[64] = {
+	 8,   5,   5,   8,  12,  20,  25,  30,
+	 6,   6,   7,   9,  13,  29,  30,  27,
+	 7,   6,   8,  12,  20,  28,  34,  28,
+	 7,   8,  11,  14,  25,  43,  40,  31,
+	 9,  11,  18,  28,  34,  54,  51,  38,
+	12,  17,  27,  32,  40,  52,  56,  46,
+	24,  32,  39,  43,  51,  60,  60,  50,
+	36,  46,  47,  49,  56,  50,  51,  49
+};
+
+static const unsigned char UV_QUANTABLE[64] = {
+	 8,   9,  12,  23,  49,  49,  49,  49,
+	 9,  10,  13,  33,  49,  49,  49,  49,
+	12,  13,  28,  49,  49,  49,  49,  49,
+	23,  33,  49,  49,  49,  49,  49,  49,
+	49,  49,  49,  49,  49,  49,  49,  49,
+	49,  49,  49,  49,  49,  49,  49,  49,
+	49,  49,  49,  49,  49,  49,  49,  49,
+	49,  49,  49,  49,  49,  49,  49,  49
+};
+#endif
+
+#define W9968CF_DEC_ERR_CORRUPTED_DATA  -1
+#define W9968CF_DEC_ERR_BUF_OVERFLOW    -2
+#define W9968CF_DEC_ERR_NO_SOI          -3
+#define W9968CF_DEC_ERR_NO_SOF0         -4
+#define W9968CF_DEC_ERR_NO_SOS          -5
+#define W9968CF_DEC_ERR_NO_EOI          -6
+
+extern void w9968cf_init_decoder(void);
+extern int w9968cf_check_headers(const unsigned char* Pin, 
+                                 const unsigned long BUF_SIZE);
+extern int w9968cf_decode(const char* Pin, const unsigned long BUF_SIZE, 
+                          const unsigned W, const unsigned H, char* Pout);
+
+#endif /* _W9968CF_DECODER_H_ */
diff -Nru a/drivers/usb/media/w9968cf_externaldef.h b/drivers/usb/media/w9968cf_externaldef.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/usb/media/w9968cf_externaldef.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,95 @@
+/***************************************************************************
+ * Various definitions for compatibility with external modules.            *
+ * This file is part of the W996[87]CF driver for Linux.                   *
+ *                                                                         *
+ * Copyright (C) 2002 2003 by Luca Risolia <luca_ing@libero.it>            *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License as published by    *
+ * the Free Software Foundation; either version 2 of the License, or       *
+ * (at your option) any later version.                                     *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License       *
+ * along with this program; if not, write to the Free Software             *
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
+ ***************************************************************************/
+
+#ifndef _W9968CF_EXTERNALDEF_H_
+#define _W9968CF_EXTERNALDEF_H_
+
+#include <linux/videodev.h>
+#include <linux/i2c.h>
+#include <asm/ioctl.h>
+#include <asm/types.h>
+
+/* The following values have been copied from the "ovcamchip" module. */
+
+#ifndef I2C_DRIVERID_OVCAMCHIP
+#	define I2C_DRIVERID_OVCAMCHIP   0xf00f
+#endif
+
+/* Controls */
+enum {
+	OVCAMCHIP_CID_CONT,       /* Contrast */
+	OVCAMCHIP_CID_BRIGHT,     /* Brightness */
+	OVCAMCHIP_CID_SAT,        /* Saturation */
+	OVCAMCHIP_CID_HUE,        /* Hue */
+	OVCAMCHIP_CID_EXP,        /* Exposure */
+	OVCAMCHIP_CID_FREQ,       /* Light frequency */
+	OVCAMCHIP_CID_BANDFILT,   /* Banding filter */
+	OVCAMCHIP_CID_AUTOBRIGHT, /* Auto brightness */
+	OVCAMCHIP_CID_AUTOEXP,    /* Auto exposure */
+	OVCAMCHIP_CID_BACKLIGHT,  /* Back light compensation */
+	OVCAMCHIP_CID_MIRROR,     /* Mirror horizontally */
+};
+
+/* I2C addresses */
+#define OV7xx0_SID   (0x42 >> 1)
+#define OV6xx0_SID   (0xC0 >> 1)
+
+/* Sensor types */
+enum {
+	CC_UNKNOWN,
+	CC_OV76BE,
+	CC_OV7610,
+	CC_OV7620,
+	CC_OV7620AE,
+	CC_OV6620,
+	CC_OV6630,
+	CC_OV6630AE,
+	CC_OV6630AF,
+};
+
+/* API */
+struct ovcamchip_control {
+	__u32 id;
+	__s32 value;
+};
+
+struct ovcamchip_window {
+	int x;
+	int y;
+	int width;
+	int height;
+	int format;
+	int quarter;   /* Scale width and height down 2x */
+
+	/* This stuff will be removed eventually */
+	int clockdiv;  /* Clock divisor setting */
+};
+
+/* Commands. 
+   You must call OVCAMCHIP_CMD_INITIALIZE before any of other commands */
+#define OVCAMCHIP_CMD_Q_SUBTYPE  _IOR  (0x88, 0x00, int)
+#define OVCAMCHIP_CMD_INITIALIZE _IOW  (0x88, 0x01, int)
+#define OVCAMCHIP_CMD_S_CTRL     _IOW  (0x88, 0x02, struct ovcamchip_control)
+#define OVCAMCHIP_CMD_G_CTRL     _IOWR (0x88, 0x03, struct ovcamchip_control)
+#define OVCAMCHIP_CMD_S_MODE     _IOW  (0x88, 0x04, struct ovcamchip_window)
+#define OVCAMCHIP_MAX_CMD        _IO   (0x88, 0x3f)
+
+#endif /* _W9968CF_EXTERNALDEF_H_ */
diff -Nru a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig
--- a/drivers/usb/misc/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/misc/Kconfig	Thu Jan  8 23:00:24 2004
@@ -58,6 +58,18 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called rio500.
 
+config USB_LEGOTOWER
+	tristate "USB Lego Infrared Tower support (EXPERIMENTAL)"
+	depends on USB && EXPERIMENTAL
+	help
+	  Say Y here if you want to connect a USB Lego Infrared Tower to your
+	  computer's USB port.
+
+	  This code is also available as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called legousbtower. If you want to compile it as
+	  a module, say M here and read <file:Documentation/modules.txt>.
+
 config USB_BRLVGER
 	tristate "Tieman Voyager USB Braille display support (EXPERIMENTAL)"
 	depends on USB && EXPERIMENTAL
diff -Nru a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile
--- a/drivers/usb/misc/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/misc/Makefile	Thu Jan  8 23:00:24 2004
@@ -12,3 +12,4 @@
 obj-$(CONFIG_USB_TEST)		+= usbtest.o
 obj-$(CONFIG_USB_TIGL)		+= tiglusb.o
 obj-$(CONFIG_USB_USS720)	+= uss720.o
+obj-$(CONFIG_USB_LEGOTOWER)	+= legousbtower.o
diff -Nru a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/usb/misc/legousbtower.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,878 @@
+/*
+ * LEGO USB Tower driver
+ *
+ * Copyright (C) 2003 David Glance <davidgsf@sourceforge.net> 
+ *               2001 Juergen Stuber <stuber@loria.fr>
+ *
+ *	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.
+ *
+ * derived from USB Skeleton driver - 0.5
+ * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
+ *
+ * History:
+ *
+ * 2001-10-13 - 0.1 js
+ *   - first version
+ * 2001-11-03 - 0.2 js
+ *   - simplified buffering, one-shot URBs for writing
+ * 2001-11-10 - 0.3 js
+ *   - removed IOCTL (setting power/mode is more complicated, postponed)
+ * 2001-11-28 - 0.4 js
+ *   - added vendor commands for mode of operation and power level in open
+ * 2001-12-04 - 0.5 js
+ *   - set IR mode by default (by oversight 0.4 set VLL mode)
+ * 2002-01-11 - 0.5? pcchan
+ *   - make read buffer reusable and work around bytes_to_write issue between
+ *     uhci and legusbtower
+ * 2002-09-23 - 0.52 david (david@csse.uwa.edu.au)
+ *   - imported into lejos project
+ *   - changed wake_up to wake_up_interruptible
+ *   - changed to use lego0 rather than tower0
+ *   - changed dbg() to use __func__ rather than deprecated __FUNCTION__
+ * 2003-01-12 - 0.53 david (david@csse.uwa.edu.au)
+ *   - changed read and write to write everything or timeout (from a patch by Chris Riesen and 
+ *     Brett Thaeler driver)
+ *   - added ioctl functionality to set timeouts
+ * 2003-07-18 - 0.54 davidgsf (david@csse.uwa.edu.au) 
+ *   - initial import into LegoUSB project
+ *   - merge of existing LegoUSB.c driver
+ * 2003-07-18 - 0.56 davidgsf (david@csse.uwa.edu.au) 
+ *   - port to 2.6 style driver
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/smp_lock.h>
+#include <linux/completion.h>
+#include <asm/uaccess.h>
+#include <linux/usb.h>
+
+
+#ifdef CONFIG_USB_DEBUG
+	static int debug = 4;
+#else
+	static int debug = 1;
+#endif
+
+/* Use our own dbg macro */
+#undef dbg
+#define dbg(lvl, format, arg...) do { if (debug >= lvl) printk(KERN_DEBUG  __FILE__ " : " format " \n", ## arg); } while (0)
+
+
+/* Version Information */
+#define DRIVER_VERSION "v0.56"
+#define DRIVER_AUTHOR "David Glance, davidgsf@sourceforge.net"
+#define DRIVER_DESC "LEGO USB Tower Driver"
+
+/* Module paramaters */
+MODULE_PARM(debug, "i");
+MODULE_PARM_DESC(debug, "Debug enabled or not");
+
+
+/* Define these values to match your device */
+#define LEGO_USB_TOWER_VENDOR_ID	0x0694
+#define LEGO_USB_TOWER_PRODUCT_ID	0x0001
+
+/* table of devices that work with this driver */
+static struct usb_device_id tower_table [] = {
+	{ USB_DEVICE(LEGO_USB_TOWER_VENDOR_ID, LEGO_USB_TOWER_PRODUCT_ID) },
+	{ }					/* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE (usb, tower_table);
+
+#define LEGO_USB_TOWER_MINOR_BASE	160
+
+/* we can have up to this number of device plugged in at once */
+#define MAX_DEVICES		16
+
+#define COMMAND_TIMEOUT		(2*HZ)  /* 2 second timeout for a command */
+
+/* Structure to hold all of our device specific stuff */
+struct lego_usb_tower {
+	struct semaphore	sem;		/* locks this structure */
+	struct usb_device* 	udev;		/* save off the usb device pointer */
+	struct usb_interface*   interface;
+	unsigned char		minor;		/* the starting minor number for this device */
+
+	int			open_count;	/* number of times this port has been opened */
+
+	char*			read_buffer;
+	int			read_buffer_length;
+
+	wait_queue_head_t	read_wait;
+	wait_queue_head_t	write_wait;
+
+	char*			interrupt_in_buffer;
+	struct usb_endpoint_descriptor* interrupt_in_endpoint;
+	struct urb*		interrupt_in_urb;
+
+	char*			interrupt_out_buffer;
+	struct usb_endpoint_descriptor* interrupt_out_endpoint;
+	struct urb*		interrupt_out_urb;
+
+};
+
+/* Note that no locking is needed:
+ * read_buffer is arbitrated by read_buffer_length == 0
+ * interrupt_out_buffer is arbitrated by interrupt_out_urb->status == -EINPROGRESS
+ * interrupt_in_buffer belongs to urb alone and is overwritten on overflow
+ */
+
+/* local function prototypes */
+static ssize_t tower_read	(struct file *file, char *buffer, size_t count, loff_t *ppos);
+static ssize_t tower_write	(struct file *file, const char *buffer, size_t count, loff_t *ppos);
+static inline void tower_delete (struct lego_usb_tower *dev);
+static int tower_open		(struct inode *inode, struct file *file);
+static int tower_release	(struct inode *inode, struct file *file);
+static int tower_release_internal (struct lego_usb_tower *dev);
+static void tower_abort_transfers (struct lego_usb_tower *dev);
+static void tower_interrupt_in_callback (struct urb *urb, struct pt_regs *regs);
+static void tower_interrupt_out_callback (struct urb *urb, struct pt_regs *regs);
+
+static int  tower_probe	(struct usb_interface *interface, const struct usb_device_id *id);
+static void tower_disconnect	(struct usb_interface *interface);
+
+
+/* prevent races between open() and disconnect */
+static DECLARE_MUTEX (disconnect_sem);
+
+/* file operations needed when we register this driver */
+static struct file_operations tower_fops = {
+	.owner = 	THIS_MODULE,
+	.read  = 	tower_read,
+	.write =	tower_write,
+	.open =		tower_open,
+	.release = 	tower_release,
+};
+
+/* 
+ * usb class driver info in order to get a minor number from the usb core,
+ * and to have the device registered with devfs and the driver core
+ */
+static struct usb_class_driver tower_class = {
+	.name =		"usb/legousbtower%d",
+	.fops =		&tower_fops,
+	.mode =		S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
+	.minor_base =	LEGO_USB_TOWER_MINOR_BASE,
+};
+
+
+/* usb specific object needed to register this driver with the usb subsystem */
+static struct usb_driver tower_driver = {
+	.owner =        THIS_MODULE,
+	.name =	        "legousbtower",
+	.probe = 	tower_probe,
+	.disconnect = 	tower_disconnect,
+	.id_table = 	tower_table,
+};
+
+
+/**
+ *	lego_usb_tower_debug_data
+ */
+static inline void lego_usb_tower_debug_data (int level, const char *function, int size, const unsigned char *data)
+{
+	int i;
+
+	if (debug < level)
+		return; 
+	
+	printk (KERN_DEBUG __FILE__": %s - length = %d, data = ", function, size);
+	for (i = 0; i < size; ++i) {
+		printk ("%.2x ", data[i]);
+	}
+	printk ("\n");
+}
+
+
+/**
+ *	tower_delete
+ */
+static inline void tower_delete (struct lego_usb_tower *dev)
+{
+	dbg(2, "%s enter", __func__);
+
+	tower_abort_transfers (dev);
+
+	/* free data structures */
+	if (dev->interrupt_in_urb != NULL) {
+		usb_free_urb (dev->interrupt_in_urb);
+	}
+	if (dev->interrupt_out_urb != NULL) {
+		usb_free_urb (dev->interrupt_out_urb);
+	}
+	kfree (dev->read_buffer);
+	kfree (dev->interrupt_in_buffer);
+	kfree (dev->interrupt_out_buffer);
+	kfree (dev);
+
+	dbg(2, "%s : leave", __func__);
+}
+
+
+/**
+ *	tower_open
+ */
+static int tower_open (struct inode *inode, struct file *file)
+{
+	struct lego_usb_tower *dev = NULL;
+	int subminor;
+	int retval = 0;
+	struct usb_interface *interface;
+
+	dbg(2,"%s : enter", __func__);
+
+	subminor = iminor(inode);
+
+	down (&disconnect_sem);
+
+	interface = usb_find_interface (&tower_driver, subminor);
+
+	if (!interface) {
+		err ("%s - error, can't find device for minor %d",
+		     __FUNCTION__, subminor);
+		retval = -ENODEV;
+		goto exit_no_device;
+	}
+
+	dev = usb_get_intfdata(interface);
+
+	if (!dev) {
+		retval = -ENODEV;
+		goto exit_no_device;
+	}
+
+	/* lock this device */
+	down (&dev->sem);
+
+	
+	/* increment our usage count for the device */
+	++dev->open_count;
+
+	/* save device in the file's private structure */
+	file->private_data = dev;
+
+
+	/* initialize in direction */
+	dev->read_buffer_length = 0;
+
+	up (&dev->sem);
+
+exit_no_device:
+
+	up (&disconnect_sem);
+
+	dbg(2,"%s : leave, return value %d ", __func__, retval);
+
+	return retval;
+}
+
+/**
+ *	tower_release
+ */
+static int tower_release (struct inode *inode, struct file *file)
+{
+	struct lego_usb_tower *dev;
+	int retval = 0;
+
+	dbg(2," %s : enter", __func__);
+
+	dev = (struct lego_usb_tower *)file->private_data;
+
+	if (dev == NULL) {
+		dbg(1," %s : object is NULL", __func__);
+		retval = -ENODEV;
+		goto exit;
+	}
+
+
+	/* lock our device */
+	down (&dev->sem);
+
+ 	if (dev->open_count <= 0) {
+		dbg(1," %s : device not opened", __func__);
+		retval = -ENODEV;
+		goto exit;
+	}
+
+	/* do the work */
+	retval = tower_release_internal (dev);
+
+exit:
+	up (&dev->sem);
+	dbg(2," %s : leave, return value %d", __func__, retval);
+	return retval;
+}
+
+
+/**
+ *	tower_release_internal
+ */
+static int tower_release_internal (struct lego_usb_tower *dev)
+{
+	int retval = 0;
+
+	dbg(2," %s : enter", __func__);
+
+	if (dev->udev == NULL) {
+		/* the device was unplugged before the file was released */
+		tower_delete (dev);
+		goto exit;
+	}
+
+	/* decrement our usage count for the device */
+	--dev->open_count;
+	if (dev->open_count <= 0) {
+		tower_abort_transfers (dev);
+		dev->open_count = 0;
+	}
+
+exit:
+	dbg(2," %s : leave", __func__);
+	return retval;
+}
+
+
+/**
+ *	tower_abort_transfers
+ *      aborts transfers and frees associated data structures
+ */
+static void tower_abort_transfers (struct lego_usb_tower *dev)
+{
+	dbg(2," %s : enter", __func__);
+
+	if (dev == NULL) {
+		dbg(1," %s : dev is null", __func__);
+	        goto exit;
+	}
+
+	/* shutdown transfer */
+	if (dev->interrupt_in_urb != NULL) {
+		usb_unlink_urb (dev->interrupt_in_urb);
+	}
+	if (dev->interrupt_out_urb != NULL) {
+		usb_unlink_urb (dev->interrupt_out_urb);
+	}
+
+exit:
+	dbg(2," %s : leave", __func__);
+}
+
+
+/**
+ *	tower_read
+ */
+static ssize_t tower_read (struct file *file, char *buffer, size_t count, loff_t *ppos)
+{
+	struct lego_usb_tower *dev;
+	size_t bytes_read = 0;
+	size_t bytes_to_read;
+	int i;
+	int retval = 0;
+	int timeout = 0;
+
+	dbg(2," %s : enter, count = %Zd", __func__, count);
+
+	dev = (struct lego_usb_tower *)file->private_data;
+	
+	/* lock this object */
+	down (&dev->sem);
+
+	/* verify that the device wasn't unplugged */
+	if (dev->udev == NULL) {
+		retval = -ENODEV;
+		err("No device or device unplugged %d", retval);
+		goto exit;
+	}
+
+	/* verify that we actually have some data to read */
+	if (count == 0) {
+		dbg(1," %s : read request of 0 bytes", __func__);
+		goto exit;
+	}
+
+
+	timeout = COMMAND_TIMEOUT;
+
+	while (1) {
+		if (dev->read_buffer_length == 0) {
+
+			/* start reading */
+			usb_fill_int_urb (dev->interrupt_in_urb,dev->udev,
+					  usb_rcvintpipe(dev->udev, dev->interrupt_in_endpoint->bEndpointAddress),
+					  dev->interrupt_in_buffer,
+					  dev->interrupt_in_endpoint->wMaxPacketSize,
+					  tower_interrupt_in_callback,
+					  dev,
+					  dev->interrupt_in_endpoint->bInterval);
+			
+			retval = usb_submit_urb (dev->interrupt_in_urb, GFP_KERNEL);
+			
+			if (retval < 0) {
+				err("Couldn't submit interrupt_in_urb");
+				goto exit;
+			}
+
+			if (timeout <= 0) {
+			        retval = -ETIMEDOUT;
+			        goto exit;
+			}
+
+			if (signal_pending(current)) {
+				retval = -EINTR;
+				goto exit;
+			}
+
+			up (&dev->sem);
+			timeout = interruptible_sleep_on_timeout (&dev->read_wait, timeout);
+			down (&dev->sem);
+
+		} else {
+			/* copy the data from read_buffer into userspace */
+			bytes_to_read = count > dev->read_buffer_length ? dev->read_buffer_length : count;
+			if (copy_to_user (buffer, dev->read_buffer, bytes_to_read) != 0) {
+				retval = -EFAULT;
+				goto exit;
+			}
+			dev->read_buffer_length -= bytes_to_read;
+			for (i=0; i<dev->read_buffer_length; i++) {
+				dev->read_buffer[i] = dev->read_buffer[i+bytes_to_read];
+			}
+
+			buffer += bytes_to_read;
+			count -= bytes_to_read;
+			bytes_read += bytes_to_read;
+			if (count == 0) {
+				break;
+			}
+		}
+	}
+
+	retval = bytes_read;
+
+exit:
+	/* unlock the device */
+	up (&dev->sem);
+
+	dbg(2," %s : leave, return value %d", __func__, retval);
+	return retval;
+}
+
+
+/**
+ *	tower_write
+ */
+static ssize_t tower_write (struct file *file, const char *buffer, size_t count, loff_t *ppos)
+{
+	struct lego_usb_tower *dev;
+	size_t bytes_written = 0;
+	size_t bytes_to_write;
+	size_t buffer_size;
+	int retval = 0;
+	int timeout = 0;
+
+	dbg(2," %s : enter, count = %Zd", __func__, count);
+
+	dev = (struct lego_usb_tower *)file->private_data;
+
+	/* lock this object */
+	down (&dev->sem);
+
+	/* verify that the device wasn't unplugged */
+	if (dev->udev == NULL) {
+		retval = -ENODEV;
+		err("No device or device unplugged %d", retval);
+		goto exit;
+	}
+
+	/* verify that we actually have some data to write */
+	if (count == 0) {
+		dbg(1," %s : write request of 0 bytes", __func__);
+		goto exit;
+	}
+
+
+	while (count > 0) {
+		if (dev->interrupt_out_urb->status == -EINPROGRESS) {
+			timeout = COMMAND_TIMEOUT;
+
+			while (timeout > 0) {
+				if (signal_pending(current)) {
+					dbg(1," %s : interrupted", __func__);
+					retval = -EINTR;
+					goto exit;
+				}
+				up (&dev->sem);
+				timeout = interruptible_sleep_on_timeout (&dev->write_wait, timeout);
+				down (&dev->sem);
+				if (timeout > 0) {
+					break;
+				}
+				dbg(1," %s : interrupted timeout: %d", __func__, timeout);
+			}
+
+
+			dbg(1," %s : final timeout: %d", __func__, timeout);
+
+			if (timeout == 0) {
+				dbg(1, "%s - command timed out.", __func__);
+				retval = -ETIMEDOUT;
+				goto exit;
+			}
+
+			dbg(4," %s : in progress, count = %Zd", __func__, count);
+		} else {
+			dbg(4," %s : sending, count = %Zd", __func__, count);
+
+			/* write the data into interrupt_out_buffer from userspace */
+			buffer_size = dev->interrupt_out_endpoint->wMaxPacketSize;
+			bytes_to_write = count > buffer_size ? buffer_size : count;
+			dbg(4," %s : buffer_size = %Zd, count = %Zd, bytes_to_write = %Zd", __func__, buffer_size, count, bytes_to_write);
+
+			if (copy_from_user (dev->interrupt_out_buffer, buffer, bytes_to_write) != 0) {
+				retval = -EFAULT;
+				goto exit;
+			}
+
+			/* send off the urb */
+			usb_fill_int_urb(dev->interrupt_out_urb,
+					dev->udev, 
+					usb_sndintpipe(dev->udev, dev->interrupt_out_endpoint->bEndpointAddress),
+					dev->interrupt_out_buffer,
+					bytes_to_write,
+					tower_interrupt_out_callback,
+					dev,
+					dev->interrupt_in_endpoint->bInterval);
+
+			dev->interrupt_out_urb->actual_length = bytes_to_write;
+			retval = usb_submit_urb (dev->interrupt_out_urb, GFP_KERNEL);
+
+			if (retval < 0) {
+				err("Couldn't submit interrupt_out_urb %d", retval);
+				goto exit;
+			}
+
+			buffer += bytes_to_write;
+			count -= bytes_to_write;
+
+			bytes_written += bytes_to_write;
+		}
+	}
+
+	retval = bytes_written;
+
+exit:
+	/* unlock the device */
+	up (&dev->sem);
+
+	dbg(2," %s : leave, return value %d", __func__, retval);
+
+	return retval;
+}
+
+
+/**
+ *	tower_interrupt_in_callback
+ */
+static void tower_interrupt_in_callback (struct urb *urb, struct pt_regs *regs)
+{
+	struct lego_usb_tower *dev = (struct lego_usb_tower *)urb->context;
+
+	dbg(4," %s : enter, status %d", __func__, urb->status);
+
+	lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
+
+	if (urb->status != 0) {
+		if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)) {
+			dbg(1," %s : nonzero status received: %d", __func__, urb->status);
+		}
+		goto exit;
+	}
+
+	down (&dev->sem);
+
+	if (urb->actual_length > 0) {
+		if (dev->read_buffer_length < (4 * dev->interrupt_in_endpoint->wMaxPacketSize) - (urb->actual_length)) {
+
+			memcpy (dev->read_buffer+dev->read_buffer_length, dev->interrupt_in_buffer, urb->actual_length);
+
+			dev->read_buffer_length += urb->actual_length;
+			dbg(1," %s reading  %d ", __func__, urb->actual_length);
+			wake_up_interruptible (&dev->read_wait);
+
+		} else {
+			dbg(1," %s : read_buffer overflow", __func__);
+		}
+	}
+
+	up (&dev->sem);
+
+exit:
+	lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
+	dbg(4," %s : leave, status %d", __func__, urb->status);
+}
+
+
+/**
+ *	tower_interrupt_out_callback
+ */
+static void tower_interrupt_out_callback (struct urb *urb, struct pt_regs *regs)
+{
+	struct lego_usb_tower *dev = (struct lego_usb_tower *)urb->context;
+
+	dbg(4," %s : enter, status %d", __func__, urb->status);
+	lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
+
+	if (urb->status != 0) {
+		if ((urb->status != -ENOENT) && 
+		    (urb->status != -ECONNRESET)) {
+			dbg(1, " %s :nonzero status received: %d", __func__, urb->status);
+		}
+		goto exit;
+	}                        
+
+	wake_up_interruptible(&dev->write_wait);
+exit:
+
+	lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
+	dbg(4," %s : leave, status %d", __func__, urb->status);
+}
+
+
+/**
+ *	tower_probe
+ *
+ *	Called by the usb core when a new device is connected that it thinks
+ *	this driver might be interested in.
+ */
+static int tower_probe (struct usb_interface *interface, const struct usb_device_id *id)
+{
+	struct usb_device *udev = interface_to_usbdev(interface);
+	struct lego_usb_tower *dev = NULL;
+	struct usb_host_interface *iface_desc;
+	struct usb_endpoint_descriptor* endpoint;
+	int i;
+	int retval = -ENOMEM;
+
+	dbg(2," %s : enter", __func__);
+
+	if (udev == NULL) {
+		info ("udev is NULL.");
+	}
+	
+	/* See if the device offered us matches what we can accept */
+	if ((udev->descriptor.idVendor != LEGO_USB_TOWER_VENDOR_ID) ||
+	    (udev->descriptor.idProduct != LEGO_USB_TOWER_PRODUCT_ID)) {
+		return -ENODEV;
+	}
+
+
+	/* allocate memory for our device state and intialize it */
+
+	dev = kmalloc (sizeof(struct lego_usb_tower), GFP_KERNEL);
+
+	if (dev == NULL) {
+		err ("Out of memory");
+		goto exit;
+	}
+
+	init_MUTEX (&dev->sem);
+
+	dev->udev = udev;
+	dev->open_count = 0;
+
+	dev->read_buffer = NULL;
+	dev->read_buffer_length = 0;
+
+	init_waitqueue_head (&dev->read_wait);
+	init_waitqueue_head (&dev->write_wait);
+
+	dev->interrupt_in_buffer = NULL;
+	dev->interrupt_in_endpoint = NULL;
+	dev->interrupt_in_urb = NULL;
+
+	dev->interrupt_out_buffer = NULL;
+	dev->interrupt_out_endpoint = NULL;
+	dev->interrupt_out_urb = NULL;
+
+
+	iface_desc = &interface->altsetting[0];
+
+	/* set up the endpoint information */
+	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
+		endpoint = &iface_desc->endpoint[i].desc;
+
+		if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) &&
+		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
+			dev->interrupt_in_endpoint = endpoint;
+		}
+		
+		if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) &&
+		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
+			dev->interrupt_out_endpoint = endpoint;
+		}
+	}
+	if(dev->interrupt_in_endpoint == NULL) {
+		err("interrupt in endpoint not found");
+		goto error;
+	}
+	if (dev->interrupt_out_endpoint == NULL) {
+		err("interrupt out endpoint not found");
+		goto error;
+	}
+
+	dev->read_buffer = kmalloc ((4*dev->interrupt_in_endpoint->wMaxPacketSize), GFP_KERNEL);
+	if (!dev->read_buffer) {
+		err("Couldn't allocate read_buffer");
+		goto error;
+	}
+	dev->interrupt_in_buffer = kmalloc (dev->interrupt_in_endpoint->wMaxPacketSize, GFP_KERNEL);
+	if (!dev->interrupt_in_buffer) {
+		err("Couldn't allocate interrupt_in_buffer");
+		goto error;
+	}
+	dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!dev->interrupt_in_urb) {
+		err("Couldn't allocate interrupt_in_urb");
+		goto error;
+	}
+	dev->interrupt_out_buffer = kmalloc (dev->interrupt_out_endpoint->wMaxPacketSize, GFP_KERNEL);
+	if (!dev->interrupt_out_buffer) {
+		err("Couldn't allocate interrupt_out_buffer");
+		goto error;
+	}
+	dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!dev->interrupt_out_urb) {
+		err("Couldn't allocate interrupt_out_urb");
+		goto error;
+	}                
+
+	/* we can register the device now, as it is ready */
+	usb_set_intfdata (interface, dev);
+
+	retval = usb_register_dev (interface, &tower_class);
+
+	if (retval) {
+		/* something prevented us from registering this driver */
+		err ("Not able to get a minor for this device.");
+		usb_set_intfdata (interface, NULL);
+		goto error;
+	}
+
+	dev->minor = interface->minor;
+
+	/* let the user know what node this device is now attached to */
+	info ("LEGO USB Tower device now attached to /dev/usb/lego%d", (dev->minor - LEGO_USB_TOWER_MINOR_BASE));
+
+
+
+exit:
+	dbg(2," %s : leave, return value 0x%.8lx (dev)", __func__, (long) dev);
+
+	return retval;
+
+error:
+	tower_delete(dev);
+	return retval;
+}
+
+
+/**
+ *	tower_disconnect
+ *
+ *	Called by the usb core when the device is removed from the system.
+ */
+static void tower_disconnect (struct usb_interface *interface)
+{
+	struct lego_usb_tower *dev;
+	int minor;
+
+	dbg(2," %s : enter", __func__);
+
+	down (&disconnect_sem);
+
+	dev = usb_get_intfdata (interface);
+	usb_set_intfdata (interface, NULL);
+
+
+	down (&dev->sem);
+
+	minor = dev->minor;
+
+	/* give back our minor */
+	usb_deregister_dev (interface, &tower_class);
+
+	/* if the device is not opened, then we clean up right now */
+	if (!dev->open_count) {
+		up (&dev->sem);
+		tower_delete (dev);
+	} else {
+		dev->udev = NULL;
+		up (&dev->sem);
+	}
+
+	up (&disconnect_sem);
+
+	info("LEGO USB Tower #%d now disconnected", (minor - LEGO_USB_TOWER_MINOR_BASE));
+
+	dbg(2," %s : leave", __func__);
+}
+
+
+
+/**
+ *	lego_usb_tower_init
+ */
+static int __init lego_usb_tower_init(void)
+{
+	int result;
+	int retval = 0;
+
+	dbg(2," %s : enter", __func__);
+
+	/* register this driver with the USB subsystem */
+	result = usb_register(&tower_driver);
+	if (result < 0) {
+		err("usb_register failed for the "__FILE__" driver. Error number %d", result);
+		retval = -1;
+		goto exit;
+	}
+
+	info(DRIVER_DESC " " DRIVER_VERSION);
+
+exit:
+	dbg(2," %s : leave, return value %d", __func__, retval);
+
+	return retval;
+}
+
+
+/**
+ *	lego_usb_tower_exit
+ */
+static void __exit lego_usb_tower_exit(void)
+{
+	dbg(2," %s : enter", __func__);
+
+	/* deregister this driver with the USB subsystem */
+	usb_deregister (&tower_driver);
+
+	dbg(2," %s : leave", __func__);
+}
+
+module_init (lego_usb_tower_init);
+module_exit (lego_usb_tower_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
diff -Nru a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig
--- a/drivers/usb/net/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/net/Kconfig	Thu Jan  8 23:00:24 2004
@@ -69,7 +69,7 @@
 
 config USB_PEGASUS
 	tristate "USB Pegasus/Pegasus-II based ethernet device support"
-	depends on USB && NET
+	depends on USB && NET_ETHERNET
 	select MII
 	---help---
 	  Say Y here if you know you have Pegasus or Pegasus-II based adapter.
@@ -96,8 +96,6 @@
 config USB_USBNET
 	tristate "Multi-purpose USB Networking Framework"
 	depends on USB && NET
-	select CRC32
-	select MII
 	---help---
 	  This driver supports several kinds of network links over USB,
 	  with "minidrivers" built around a common network driver core
@@ -206,6 +204,7 @@
 config USB_ZAURUS
 	boolean "Sharp Zaurus (stock ROMs)"
 	depends on USB_USBNET
+	select CRC32
 	default y
 	help
 	  Choose this option to support the usb networking links used by
@@ -217,9 +216,7 @@
 
 config USB_CDCETHER
 	boolean "CDC Ethernet support (smart devices such as cable modems)"
-	# experimental primarily because cdc-ether was.
-	# make it non-experimental after more interop testing
-	depends on USB_USBNET && EXPERIMENTAL
+	depends on USB_USBNET
 	default y
 	help
 	  This option supports devices conforming to the Communication Device
@@ -247,7 +244,9 @@
 
 config USB_AX8817X
 	boolean "ASIX AX88172 Based USB 2.0 Ethernet Devices"
-	depends on USB_USBNET && EXPERIMENTAL
+	depends on USB_USBNET && NET_ETHERNET
+	select CRC32
+	select MII
 	default y
 	help
 
diff -Nru a/drivers/usb/net/pegasus.h b/drivers/usb/net/pegasus.h
--- a/drivers/usb/net/pegasus.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/net/pegasus.h	Thu Jan  8 23:00:24 2004
@@ -137,6 +137,7 @@
 #define	VENDOR_MELCO		0x0411
 #define	VENDOR_MOBILITY		0x1342
 #define	VENDOR_NETGEAR		0x0846
+#define	VENDOR_OCT		0x0b39
 #define	VENDOR_SMARTBRIDGES	0x08d1
 #define	VENDOR_SMC		0x0707
 #define	VENDOR_SOHOWARE		0x15e8
@@ -173,7 +174,7 @@
 		DEFAULT_GPIO_RESET | PEGASUS_II )
 PEGASUS_DEV( "ADMtek ADM8511 \"Pegasus II\" USB Ethernet",
 		VENDOR_ADMTEK, 0x8511,
-		DEFAULT_GPIO_RESET | PEGASUS_II )
+		DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA )
 PEGASUS_DEV( "ADMtek ADM8513 \"Pegasus II\" USB Ethernet",
 		VENDOR_ADMTEK, 0x8513,
 		DEFAULT_GPIO_RESET | PEGASUS_II )
@@ -259,6 +260,8 @@
 PEGASUS_DEV( "MELCO/BUFFALO LUA2-TX", VENDOR_MELCO, 0x0009,
 		DEFAULT_GPIO_RESET | PEGASUS_II )
 PEGASUS_DEV( "NETGEAR FA101", VENDOR_NETGEAR, 0x1020,
+		DEFAULT_GPIO_RESET | PEGASUS_II )
+PEGASUS_DEV( "OCT Inc.", VENDOR_OCT, 0x0109,
 		DEFAULT_GPIO_RESET | PEGASUS_II )
 PEGASUS_DEV( "smartNIC 2 PnP Adapter", VENDOR_SMARTBRIDGES, 0x0003,
 		DEFAULT_GPIO_RESET | PEGASUS_II )
diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
--- a/drivers/usb/net/usbnet.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/net/usbnet.c	Thu Jan  8 23:00:24 2004
@@ -637,6 +637,27 @@
 	info->eedump_len = 0x3e;
 }
 
+static u32 ax8817x_get_link (struct net_device *net)
+{
+	struct usbnet *dev = (struct usbnet *)net->priv;
+
+	return (u32)mii_link_ok(&dev->mii);
+}
+
+static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd)
+{
+	struct usbnet *dev = (struct usbnet *)net->priv;
+
+	return mii_ethtool_gset(&dev->mii,cmd);
+}
+
+static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd)
+{
+	struct usbnet *dev = (struct usbnet *)net->priv;
+
+	return mii_ethtool_sset(&dev->mii,cmd);
+}
+
 static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
 {
 	int ret;
@@ -670,16 +691,6 @@
 	}
 	memcpy(dev->net->dev_addr, buf, ETH_ALEN);
 
-	/* Get IPG values */
-	if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_IPG012, 0, 0, 3, buf)) < 0) {
-		dbg("Error reading IPG values: %d", ret);
-		return ret;
-	}
-
-	for(i = 0;i < 3;i++) {
-		ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0 + i, 0, 0, 1, &buf[i]);
-	}
-
 	/* Get the PHY id */
 	if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) {
 		dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret);
@@ -735,9 +746,12 @@
 	dev->net->set_multicast_list = ax8817x_set_multicast;
 
 	usbnet_ethtool_ops.get_drvinfo = &ax8817x_get_drvinfo;
+	usbnet_ethtool_ops.get_link = &ax8817x_get_link;
 	usbnet_ethtool_ops.get_wol = &ax8817x_get_wol;
 	usbnet_ethtool_ops.set_wol = &ax8817x_set_wol;
 	usbnet_ethtool_ops.get_eeprom = &ax8817x_get_eeprom;
+	usbnet_ethtool_ops.get_settings = &ax8817x_get_settings;
+	usbnet_ethtool_ops.set_settings = &ax8817x_set_settings;
 
 	return 0;
 }
@@ -909,8 +923,7 @@
 	memset (info, 0, sizeof *info);
 	info->control = intf;
 	while (len > 3) {
-		/* ignore bDescriptorType != CS_INTERFACE */
-		if (buf [1] != 0x24)
+		if (buf [1] != USB_DT_CS_INTERFACE)
 			goto next_desc;
 
 		/* bDescriptorSubType identifies three "must have" descriptors;
diff -Nru a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
--- a/drivers/usb/serial/cyberjack.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/cyberjack.c	Thu Jan  8 23:00:24 2004
@@ -295,7 +295,6 @@
 {
 	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
 	struct cyberjack_private *priv = usb_get_serial_port_data(port);
-	unsigned long flags;
 	struct usb_serial *serial;
 	unsigned char *data = urb->transfer_buffer;
 	int result;
@@ -323,13 +322,13 @@
 		/* This is a announcement of coming bulk_ins. */
 		unsigned short size = ((unsigned short)data[3]<<8)+data[2]+3;
 
-		spin_lock_irqsave(&priv->lock, flags);
+		spin_lock(&priv->lock);
 
 		old_rdtodo = priv->rdtodo;
 
 		if( (old_rdtodo+size)<(old_rdtodo) ) {
 			dbg( "To many bulk_in urbs to do." );
-			spin_unlock_irqrestore(&priv->lock, flags);
+			spin_unlock(&priv->lock);
 			goto resubmit;
 		}
 
@@ -338,11 +337,11 @@
 
 		dbg("%s - rdtodo: %d", __FUNCTION__, priv->rdtodo);
 
-		spin_unlock_irqrestore(&priv->lock, flags);
+		spin_unlock(&priv->lock);
 
 		if( !old_rdtodo ) {
 			port->read_urb->dev = port->serial->dev;
-			result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+			result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 			if( result )
 				err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
 			dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);
@@ -351,7 +350,7 @@
 
 resubmit:
 	port->interrupt_in_urb->dev = port->serial->dev;
-	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
 	if (result)
 		err(" usb_submit_urb(read int) failed");
 	dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);
@@ -361,7 +360,6 @@
 {
 	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
 	struct cyberjack_private *priv = usb_get_serial_port_data(port);
-	unsigned long flags;
 	struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
 	struct tty_struct *tty;
 	unsigned char *data = urb->transfer_buffer;
@@ -397,7 +395,7 @@
 	  	tty_flip_buffer_push(tty);
 	}
 
-	spin_lock_irqsave(&priv->lock, flags);
+	spin_lock(&priv->lock);
 
 	/* Reduce urbs to do by one. */
 	priv->rdtodo-=urb->actual_length;
@@ -405,14 +403,14 @@
 	if ( priv->rdtodo<0 ) priv->rdtodo = 0;
 	todo = priv->rdtodo;
 
-	spin_unlock_irqrestore(&priv->lock, flags);
+	spin_unlock(&priv->lock);
 
 	dbg("%s - rdtodo: %d", __FUNCTION__, todo);
 
 	/* Continue to read if we have still urbs to do. */
 	if( todo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) {
 		port->read_urb->dev = port->serial->dev;
-		result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+		result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
 		if (result)
 			err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
 		dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);
@@ -423,7 +421,6 @@
 {
 	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
 	struct cyberjack_private *priv = usb_get_serial_port_data(port);
-	unsigned long flags;
 	struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
 
 	dbg("%s - port %d", __FUNCTION__, port->number);
@@ -438,7 +435,7 @@
 		return;
 	}
 
-	spin_lock_irqsave(&priv->lock, flags);
+	spin_lock(&priv->lock);
 
 	/* only do something if we have more data to send */
 	if( priv->wrfilled ) {
@@ -446,7 +443,7 @@
 
 		if (port->write_urb->status == -EINPROGRESS) {
 			dbg("%s - already writing", __FUNCTION__);
-			spin_unlock_irqrestore(&priv->lock, flags);
+			spin_unlock(&priv->lock);
 			return;
 		}
 
@@ -492,7 +489,7 @@
 	}
 
 exit:
-	spin_unlock_irqrestore(&priv->lock, flags);
+	spin_unlock(&priv->lock);
 	schedule_work(&port->work);
 }
 
diff -Nru a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
--- a/drivers/usb/serial/ftdi_sio.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/ftdi_sio.c	Thu Jan  8 23:00:24 2004
@@ -342,6 +342,10 @@
 	{ USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0, 0x3ff) },
 	{ USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0, 0x3ff) },
 	{ USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0, 0x3ff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0, 0x3ff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0, 0x3ff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) },
 	{ }						/* Terminating entry */
 };
 
@@ -416,6 +420,10 @@
 	{ USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0x400, 0xffff) },
 	{ USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0x400, 0xffff) },
 	{ USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0x400, 0xffff) },
 	{ }						/* Terminating entry */
 };
 
@@ -505,6 +513,10 @@
 	{ USB_DEVICE(OCT_VID, OCT_US101_PID) },
 	{ USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) },
 	{ USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) },
+	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
+	{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
+	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
+	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
 	{ }						/* Terminating entry */
 };
 
diff -Nru a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
--- a/drivers/usb/serial/ftdi_sio.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/ftdi_sio.h	Thu Jan  8 23:00:24 2004
@@ -145,6 +145,14 @@
 /* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
 #define OCT_US101_PID		0x0421	/* OCT US101 USB to RS-232 */
 
+/*
+ * Protego product ids
+ */
+#define PROTEGO_SPECIAL_1	0xFC70	/* special/unknown device */
+#define PROTEGO_R2X0		0xFC71	/* R200-USB TRNG unit (R210, R220, and R230) */
+#define PROTEGO_SPECIAL_3	0xFC72	/* special/unknown device */
+#define PROTEGO_SPECIAL_4	0xFC73	/* special/unknown device */ 
+
 /* Commands */
 #define FTDI_SIO_RESET 		0 /* Reset the port */
 #define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */
diff -Nru a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
--- a/drivers/usb/serial/io_edgeport.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/serial/io_edgeport.c	Thu Jan  8 23:00:23 2004
@@ -1488,16 +1488,20 @@
 		       usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint),
 		       buffer, count+2, edge_bulk_out_data_callback, edge_port);
 
+	/* decrement the number of credits we have by the number we just sent */
+	edge_port->txCredits -= count;
+	edge_port->icount.tx += count;
+
 	urb->dev = edge_serial->serial->dev;
 	status = usb_submit_urb(urb, GFP_ATOMIC);
 	if (status) {
 		/* something went wrong */
 		dbg("%s - usb_submit_urb(write bulk) failed", __FUNCTION__);
 		edge_port->write_in_progress = FALSE;
-	} else {
-		/* decrement the number of credits we have by the number we just sent */
-		edge_port->txCredits -= count;
-		edge_port->icount.tx += count;
+
+		/* revert the credits as something bad happened. */
+		edge_port->txCredits += count;
+		edge_port->icount.tx -= count;
 	}
 	dbg("%s wrote %d byte(s) TxCredit %d, Fifo %d", __FUNCTION__, count, edge_port->txCredits, fifo->count);
 }
diff -Nru a/drivers/usb/serial/io_fw_boot.h b/drivers/usb/serial/io_fw_boot.h
--- a/drivers/usb/serial/io_fw_boot.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/io_fw_boot.h	Thu Jan  8 23:00:24 2004
@@ -17,7 +17,7 @@
 		unsigned short Addr;
 		unsigned short Len;
 		unsigned char  Data[0];
-	};
+	} __attribute__ ((packed));
 
 	struct edge_firmware_version_info {
 		unsigned char	 MajorVersion;
diff -Nru a/drivers/usb/serial/io_fw_boot2.h b/drivers/usb/serial/io_fw_boot2.h
--- a/drivers/usb/serial/io_fw_boot2.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/serial/io_fw_boot2.h	Thu Jan  8 23:00:23 2004
@@ -17,7 +17,7 @@
 		unsigned short Addr;
 		unsigned short Len;
 		unsigned char  Data[0];
-	};
+	} __attribute__ ((packed));
 
 	struct edge_firmware_version_info {
 		unsigned char	 MajorVersion;
diff -Nru a/drivers/usb/serial/io_fw_down.h b/drivers/usb/serial/io_fw_down.h
--- a/drivers/usb/serial/io_fw_down.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/io_fw_down.h	Thu Jan  8 23:00:24 2004
@@ -17,7 +17,7 @@
 		unsigned short	Addr;
 		unsigned short	Len;
 		unsigned char	Data[0];
-	};
+	} __attribute ((packed));
 
 	struct edge_firmware_version_info {
 		unsigned char	MajorVersion;
diff -Nru a/drivers/usb/serial/io_fw_down2.h b/drivers/usb/serial/io_fw_down2.h
--- a/drivers/usb/serial/io_fw_down2.h	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/serial/io_fw_down2.h	Thu Jan  8 23:00:23 2004
@@ -17,7 +17,7 @@
 		unsigned short Addr;
 		unsigned short Len;
 		unsigned char  Data[0];
-	};
+	} __attribute__ ((packed));
 
 	struct edge_firmware_version_info {
 		unsigned char  MajorVersion;
diff -Nru a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
--- a/drivers/usb/serial/mct_u232.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/mct_u232.c	Thu Jan  8 23:00:24 2004
@@ -24,6 +24,11 @@
  *   Basic tests have been performed with minicom/zmodem transfers and
  *   modem dialing under Linux 2.4.0-test10 (for me it works fine).
  *
+ * 04-Nov-2003 Bill Marr <marr at flex dot com>
+ *   - Mimic Windows driver by sending 2 USB 'device request' messages
+ *     following normal 'baud rate change' message.  This allows data to be
+ *     transmitted to RS-232 devices which don't assert the 'CTS' signal.
+ *
  * 10-Nov-2001 Wolfgang Grandegger
  *   - Fixed an endianess problem with the baudrate selection for PowerPC.
  *
@@ -85,7 +90,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.1"
+#define DRIVER_VERSION "v1.2"
 #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
 
@@ -216,6 +221,7 @@
 {
 	unsigned int divisor;
         int rc;
+        unsigned char zero_byte = 0;
 	divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value));
         rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
                              MCT_U232_SET_BAUD_RATE_REQUEST,
@@ -225,6 +231,35 @@
 	if (rc < 0)
 		err("Set BAUD RATE %d failed (error = %d)", value, rc);
 	dbg("set_baud_rate: value: %d, divisor: 0x%x", value, divisor);
+
+	/* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
+	   always sends two extra USB 'device request' messages after the
+	   'baud rate change' message.  The actual functionality of the
+	   request codes in these messages is not fully understood but these
+	   particular codes are never seen in any operation besides a baud
+	   rate change.  Both of these messages send a single byte of data
+	   whose value is always zero.  The second of these two extra messages
+	   is required in order for data to be properly written to an RS-232
+	   device which does not assert the 'CTS' signal. */
+
+	rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
+			     MCT_U232_SET_UNKNOWN1_REQUEST, 
+			     MCT_U232_SET_REQUEST_TYPE,
+			     0, 0, &zero_byte, MCT_U232_SET_UNKNOWN1_SIZE, 
+			     WDR_TIMEOUT);
+	if (rc < 0)
+		err("Sending USB device request code %d failed (error = %d)", 
+		    MCT_U232_SET_UNKNOWN1_REQUEST, rc);
+
+	rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
+			     MCT_U232_SET_UNKNOWN2_REQUEST, 
+			     MCT_U232_SET_REQUEST_TYPE,
+			     0, 0, &zero_byte, MCT_U232_SET_UNKNOWN2_SIZE, 
+			     WDR_TIMEOUT);
+	if (rc < 0)
+		err("Sending USB device request code %d failed (error = %d)", 
+		    MCT_U232_SET_UNKNOWN2_REQUEST, rc);
+
         return rc;
 } /* mct_u232_set_baud_rate */
 
diff -Nru a/drivers/usb/serial/mct_u232.h b/drivers/usb/serial/mct_u232.h
--- a/drivers/usb/serial/mct_u232.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/mct_u232.h	Thu Jan  8 23:00:24 2004
@@ -57,6 +57,21 @@
 #define MCT_U232_SET_MODEM_CTRL_REQUEST	10 /* Set Modem Control Register (MCR) */
 #define MCT_U232_SET_MODEM_CTRL_SIZE    1
 
+/* This USB device request code is not well understood.  It is transmitted by
+   the MCT-supplied Windows driver whenever the baud rate changes. 
+*/
+#define MCT_U232_SET_UNKNOWN1_REQUEST   11  /* Unknown functionality */
+#define MCT_U232_SET_UNKNOWN1_SIZE       1
+
+/* This USB device request code is not well understood.  It is transmitted by
+   the MCT-supplied Windows driver whenever the baud rate changes. 
+   
+   Without this USB device request, the USB/RS-232 adapter will not write to
+   RS-232 devices which do not assert the 'CTS' signal.
+*/
+#define MCT_U232_SET_UNKNOWN2_REQUEST   12  /* Unknown functionality */
+#define MCT_U232_SET_UNKNOWN2_SIZE       1
+
 /*
  * Baud rate (divisor)
  */
@@ -137,22 +152,31 @@
  * Baud rate (divisor)
  * -------------------
  *
- *   BmRequestType:  0x4 (0100 0000B)
- *   bRequest:       0x5
- *   wValue:         0x0
- *   wIndex:         0x0
- *   wLength:        0x4
+ *   BmRequestType:  0x40 (0100 0000B)
+ *   bRequest:       0x05
+ *   wValue:         0x0000
+ *   wIndex:         0x0000
+ *   wLength:        0x0004
  *   Data:           divisor = 115200 / baud_rate
  *
+ *   SniffUSB observations (Nov 2003): Contrary to the 'wLength' value of 4
+ *   shown above, observations with a Belkin F5U109 adapter, using the
+ *   MCT-supplied Windows98 driver (U2SPORT.VXD, "File version: 1.21P.0104 for
+ *   Win98/Me"), show this request has a length of 1 byte, presumably because
+ *   of the fact that the Belkin adapter and the 'Sitecom U232-P25' adapter
+ *   use a baud-rate code instead of a conventional RS-232 baud rate divisor.
+ *   The current source code for this driver does not reflect this fact, but
+ *   the driver works fine with this adapter/driver combination nonetheless.
+ *
  *
  * Line Control Register (LCR)
  * ---------------------------
  *
- *  BmRequestType:  0x4 (0100 0000B)    0xc (1100 0000B)
- *  bRequest:       0x7                 0x6
- *  wValue:         0x0
- *  wIndex:         0x0
- *  wLength:        0x1
+ *  BmRequestType:  0x40 (0100 0000B)    0xc0 (1100 0000B)
+ *  bRequest:       0x07                 0x06
+ *  wValue:         0x0000
+ *  wIndex:         0x0000
+ *  wLength:        0x0001
  *  Data:           LCR (see below)
  *
  *  Bit 7: Divisor Latch Access Bit (DLAB). When set, access to the data
@@ -186,18 +210,18 @@
  *
  *  SniffUSB observations: Bit 7 seems not to be used. There seem to be two bugs
  *  in the Win98 driver: the break does not work (bit 6 is not asserted) and the
- *  sticky parity bit is not cleared when set once. The LCR can also be read
+ *  stick parity bit is not cleared when set once. The LCR can also be read
  *  back with USB request 6 but this has never been observed with SniffUSB.
  *
  *
  * Modem Control Register (MCR)
  * ----------------------------
  *
- *  BmRequestType:  0x4  (0100 0000B)
- *  bRequest:       0xa
- *  wValue:         0x0
- *  wIndex:         0x0
- *  wLength:        0x1
+ *  BmRequestType:  0x40  (0100 0000B)
+ *  bRequest:       0x0a
+ *  wValue:         0x0000
+ *  wIndex:         0x0000
+ *  wLength:        0x0001
  *  Data:           MCR (Bit 4..7, see below)
  *
  *  Bit 7: Reserved, always 0.
@@ -226,11 +250,11 @@
  * Modem Status Register (MSR)
  * ---------------------------
  *
- *  BmRequestType:  0xc  (1100 0000B)
- *  bRequest:       0x2
- *  wValue:         0x0
- *  wIndex:         0x0
- *  wLength:        0x1
+ *  BmRequestType:  0xc0  (1100 0000B)
+ *  bRequest:       0x02
+ *  wValue:         0x0000
+ *  wIndex:         0x0000
+ *  wLength:        0x0001
  *  Data:           MSR (see below)
  *
  *  Bit 7: Data Carrier Detect (CD). Reflects the state of the DCD line on the
@@ -285,6 +309,41 @@
  *  SniffUSB observations: the LSR is returned as second byte on the interrupt-in
  *  endpoint 0x83 to signal error conditions. Such errors have been seen with
  *  minicom/zmodem transfers (CRC errors).
+ *
+ *
+ * Unknown #1
+ * -------------------
+ *
+ *   BmRequestType:  0x40 (0100 0000B)
+ *   bRequest:       0x0b
+ *   wValue:         0x0000
+ *   wIndex:         0x0000
+ *   wLength:        0x0001
+ *   Data:           0x00
+ *
+ *   SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
+ *   (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
+ *   occurs immediately after a "Baud rate (divisor)" message.  It was not
+ *   observed at any other time.  It is unclear what purpose this message
+ *   serves.
+ *
+ *
+ * Unknown #2
+ * -------------------
+ *
+ *   BmRequestType:  0x40 (0100 0000B)
+ *   bRequest:       0x0c
+ *   wValue:         0x0000
+ *   wIndex:         0x0000
+ *   wLength:        0x0001
+ *   Data:           0x00
+ *
+ *   SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
+ *   (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
+ *   occurs immediately after the 'Unknown #1' message (see above).  It was
+ *   not observed at any other time.  It is unclear what other purpose (if
+ *   any) this message might serve, but without it, the USB/RS-232 adapter
+ *   will not write to RS-232 devices which do not assert the 'CTS' signal.
  *
  *
  * Flow control
diff -Nru a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
--- a/drivers/usb/serial/pl2303.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/pl2303.c	Thu Jan  8 23:00:24 2004
@@ -71,6 +71,7 @@
 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
 	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
 	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
+	{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
 	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
 	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
 	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
@@ -169,6 +170,7 @@
 
 struct pl2303_private {
 	spinlock_t lock;
+	wait_queue_head_t delta_msr_wait;
 	u8 line_control;
 	u8 line_status;
 	u8 termios_initialized;
@@ -186,6 +188,7 @@
 			return -ENOMEM;
 		memset (priv, 0x00, sizeof (struct pl2303_private));
 		spin_lock_init(&priv->lock);
+		init_waitqueue_head(&priv->delta_msr_wait);
 		usb_set_serial_port_data(serial->port[i], priv);
 	}
 	return 0;
@@ -556,11 +559,51 @@
 	return result;
 }
 
+static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
+{
+	struct pl2303_private *priv = usb_get_serial_port_data(port);
+	unsigned long flags;
+	unsigned int prevstatus;
+	unsigned int status;
+	unsigned int changed;
+
+	spin_lock_irqsave (&priv->lock, flags);
+	prevstatus = priv->line_status;
+	spin_unlock_irqrestore (&priv->lock, flags);
+
+	while (1) {
+		interruptible_sleep_on(&priv->delta_msr_wait);
+		/* see if a signal did it */
+		if (signal_pending(current))
+			return -ERESTARTSYS;
+		
+		spin_lock_irqsave (&priv->lock, flags);
+		status = priv->line_status;
+		spin_unlock_irqrestore (&priv->lock, flags);
+		
+		changed=prevstatus^status;
+		
+		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
+		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
+		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
+		    ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
+			return 0;
+		}
+		prevstatus = status;
+	}
+	/* NOTREACHED */
+	return 0;
+}
+
 static int pl2303_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
 {
 	dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
 
 	switch (cmd) {
+		case TIOCMIWAIT:
+			dbg("%s (%d) TIOCMIWAIT", __FUNCTION__,  port->number);
+			return wait_modem_info(port, arg);
+
 		default:
 			dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
 			break;
@@ -703,6 +746,7 @@
 	spin_lock_irqsave(&priv->lock, flags);
 	status = priv->line_status;
 	spin_unlock_irqrestore(&priv->lock, flags);
+	wake_up_interruptible (&priv->delta_msr_wait);
 
 	/* break takes precedence over parity, */
 	/* which takes precedence over framing errors */
diff -Nru a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
--- a/drivers/usb/serial/pl2303.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/pl2303.h	Thu Jan  8 23:00:24 2004
@@ -12,6 +12,7 @@
 #define PL2303_PRODUCT_ID_RSAQ2	0x04bb
 
 #define ATEN_VENDOR_ID		0x0557
+#define ATEN_VENDOR_ID2		0x0547
 #define ATEN_PRODUCT_ID		0x2008
 
 #define IODATA_VENDOR_ID	0x04bb
diff -Nru a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
--- a/drivers/usb/serial/visor.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/serial/visor.c	Thu Jan  8 23:00:23 2004
@@ -231,6 +231,8 @@
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID),
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
+	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID),
+		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID),
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID), 
@@ -266,6 +268,7 @@
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) },
+	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID) },
 	{ USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) },
 	{ USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) },
 	{ },					/* optional parameter entry */
diff -Nru a/drivers/usb/serial/visor.h b/drivers/usb/serial/visor.h
--- a/drivers/usb/serial/visor.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/serial/visor.h	Thu Jan  8 23:00:24 2004
@@ -41,6 +41,7 @@
 #define SONY_CLIE_4_1_ID		0x009A
 #define SONY_CLIE_NX60_ID		0x00DA
 #define SONY_CLIE_NZ90V_ID		0x00E9
+#define SONY_CLIE_UX50_ID		0x0144
 
 #define SAMSUNG_VENDOR_ID		0x04E8
 #define SAMSUNG_SCH_I330_ID		0x8001
diff -Nru a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile
--- a/drivers/usb/storage/Makefile	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/Makefile	Thu Jan  8 23:00:24 2004
@@ -10,14 +10,14 @@
 obj-$(CONFIG_USB_STORAGE)	+= usb-storage.o
 
 usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG)	+= debug.o
-usb-storage-obj-$(CONFIG_USB_STORAGE_HP8200e)	+= shuttle_usbat.o raw_bulk.o
-usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR09)	+= sddr09.o raw_bulk.o
-usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR55)	+= sddr55.o raw_bulk.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_HP8200e)	+= shuttle_usbat.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR09)	+= sddr09.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR55)	+= sddr55.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_FREECOM)	+= freecom.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM)	+= dpcm.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200)	+= isd200.o
-usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)	+= datafab.o raw_bulk.o
-usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)	+= jumpshot.o raw_bulk.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)	+= datafab.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)	+= jumpshot.o
 
 usb-storage-objs :=	scsiglue.o protocol.o transport.o usb.o \
 			initializers.o $(usb-storage-obj-y)
diff -Nru a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c
--- a/drivers/usb/storage/datafab.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/datafab.c	Thu Jan  8 23:00:24 2004
@@ -51,7 +51,6 @@
  */
 
 #include "transport.h"
-#include "raw_bulk.h"
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -91,16 +90,14 @@
 			     struct datafab_info *info,
 			     u32 sector,
 			     u32 sectors, 
-			     unsigned char *dest, 
+			     unsigned char *buffer, 
 			     int use_sg)
 {
 	unsigned char *command = us->iobuf;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
 	unsigned char  thistime;
-	int totallen, len, result;
-	int sg_idx = 0, sg_offset = 0;
-	int rc;
+	unsigned int totallen, alloclen;
+	int len, result;
+	unsigned int sg_idx = 0, sg_offset = 0;
 
 	// we're working in LBA mode.  according to the ATA spec, 
 	// we can support up to 28-bit addressing.  I don't know if Datafab
@@ -111,23 +108,32 @@
 		return USB_STOR_TRANSPORT_ERROR;
 
 	if (info->lun == -1) {
-		rc = datafab_determine_lun(us, info);
-		if (rc != USB_STOR_TRANSPORT_GOOD)
-			return rc;
+		result = datafab_determine_lun(us, info);
+		if (result != USB_STOR_TRANSPORT_GOOD)
+			return result;
 	}
 
 	totallen = sectors * info->ssize;
 
+	// Since we don't read more than 64 KB at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	alloclen = min(totallen, 65536u);
+	if (use_sg) {
+		buffer = kmalloc(alloclen, GFP_NOIO);
+		if (buffer == NULL)
+			return USB_STOR_TRANSPORT_ERROR;
+	}
+
 	do {
 		// loop, never allocate or transfer more than 64k at once
 		// (min(128k, 255*info->ssize) is the real limit)
 
-		len = min_t(int, totallen, 65536);
-
-		ptr = buffer = (use_sg ? kmalloc(len, GFP_NOIO) : dest);
-		if (buffer == NULL)
-			return USB_STOR_TRANSPORT_ERROR;
-
+		len = min(totallen, alloclen);
 		thistime = (len / info->ssize) & 0xff;
 
 		command[0] = 0;
@@ -135,7 +141,7 @@
 		command[2] = sector & 0xFF;
 		command[3] = (sector >> 8) & 0xFF;
 		command[4] = (sector >> 16) & 0xFF;
-	
+
 		command[5] = 0xE0 + (info->lun << 4);
 		command[5] |= (sector >> 24) & 0x0F;
 		command[6] = 0x20;
@@ -147,24 +153,23 @@
 			goto leave;
 
 		// read the result
-		result = datafab_bulk_read(us, ptr, len);
+		result = datafab_bulk_read(us, buffer, len);
 		if (result != USB_STOR_XFER_GOOD)
 			goto leave;
 
-		sectors -= thistime;
-		sector  += thistime;
-
-		if (use_sg) {
-			us_copy_to_sgbuf(buffer, len, dest,
-					 &sg_idx, &sg_offset, use_sg);
-			kfree(buffer);
-		} else {
-			dest += len;
-		}
+		// Store the data (s-g) or update the pointer (!s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					 &sg_idx, &sg_offset, TO_XFER_BUF);
+		else
+			buffer += len;
 
+		sector += thistime;
 		totallen -= len;
 	} while (totallen > 0);
 
+	if (use_sg)
+		kfree(buffer);
 	return USB_STOR_TRANSPORT_GOOD;
 
  leave:
@@ -178,16 +183,15 @@
 			      struct datafab_info *info,
 			      u32 sector,
 			      u32 sectors, 
-			      unsigned char *src, 
+			      unsigned char *buffer, 
 			      int use_sg)
 {
 	unsigned char *command = us->iobuf;
 	unsigned char *reply = us->iobuf;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
 	unsigned char thistime;
-	int totallen, len, result, rc;
-	int sg_idx = 0, sg_offset = 0;
+	unsigned int totallen, alloclen;
+	int len, result;
+	unsigned int sg_idx = 0, sg_offset = 0;
 
 	// we're working in LBA mode.  according to the ATA spec, 
 	// we can support up to 28-bit addressing.  I don't know if Datafab
@@ -198,38 +202,39 @@
 		return USB_STOR_TRANSPORT_ERROR;
 
 	if (info->lun == -1) {
-		rc = datafab_determine_lun(us, info);
-		if (rc != USB_STOR_TRANSPORT_GOOD)
-			return rc;
+		result = datafab_determine_lun(us, info);
+		if (result != USB_STOR_TRANSPORT_GOOD)
+			return result;
 	}
 
-	// If we're using scatter-gather, we have to create a new
-	// buffer to read all of the data in first, since a
-	// scatter-gather buffer could in theory start in the middle
-	// of a page, which would be bad. A developer who wants a
-	// challenge might want to write a limited-buffer
-	// version of this code.
-
 	totallen = sectors * info->ssize;
 
-	do {
-		// loop, never allocate or transfer more than 64k at once
-		// (min(128k, 255*info->ssize) is the real limit)
-
-		len = min_t(int, totallen, 65536);
-
-		// if we are using scatter-gather,
-		// first copy all to one big buffer
-
-		buffer = us_copy_from_sgbuf(src, len, &sg_idx,
-					    &sg_offset, use_sg);
+	// Since we don't write more than 64 KB at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	alloclen = min(totallen, 65536u);
+	if (use_sg) {
+		buffer = kmalloc(alloclen, GFP_NOIO);
 		if (buffer == NULL)
 			return USB_STOR_TRANSPORT_ERROR;
+	}
 
-		ptr = buffer;
+	do {
+		// loop, never allocate or transfer more than 64k at once
+		// (min(128k, 255*info->ssize) is the real limit)
 
+		len = min(totallen, alloclen);
 		thistime = (len / info->ssize) & 0xff;
 
+		// Get the data from the transfer buffer (s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&sg_idx, &sg_offset, FROM_XFER_BUF);
+
 		command[0] = 0;
 		command[1] = thistime;
 		command[2] = sector & 0xFF;
@@ -247,7 +252,7 @@
 			goto leave;
 
 		// send the data
-		result = datafab_bulk_write(us, ptr, len);
+		result = datafab_bulk_write(us, buffer, len);
 		if (result != USB_STOR_XFER_GOOD)
 			goto leave;
 
@@ -264,17 +269,16 @@
 			goto leave;
 		}
 
-		sectors -= thistime;
-		sector  += thistime;
-
-		if (use_sg)
-			kfree(buffer);
-		else
-			src += len;
+		// Update the transfer buffer pointer (!s-g)
+		if (!use_sg)
+			buffer += len;
 
+		sector += thistime;
 		totallen -= len;
 	} while (totallen > 0);
 
+	if (use_sg)
+		kfree(buffer);
 	return USB_STOR_TRANSPORT_GOOD;
 
  leave:
@@ -435,7 +439,7 @@
 	// datafab reader doesn't present a SCSI interface so we
 	// fudge the SCSI commands...
 	//
-	
+
 	if (sense_6)
 		param_len = srb->cmnd[4];
 	else
diff -Nru a/drivers/usb/storage/debug.c b/drivers/usb/storage/debug.c
--- a/drivers/usb/storage/debug.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/debug.c	Thu Jan  8 23:00:23 2004
@@ -150,65 +150,6 @@
 	US_DEBUGPX("\n");
 }
 
-void usb_stor_print_Scsi_Cmnd(Scsi_Cmnd *cmd)
-{
-	int i=0, bufferSize = cmd->request_bufflen;
-	u8 *buffer = cmd->request_buffer;
-	struct scatterlist *sg = (struct scatterlist*)cmd->request_buffer;
-
-	US_DEBUGP("Dumping information about %p.\n", cmd);
-	US_DEBUGP("cmd->cmnd[0] value is %d.\n", cmd->cmnd[0]);
-	US_DEBUGP("(MODE_SENSE is %d and MODE_SENSE_10 is %d)\n",
-		  MODE_SENSE, MODE_SENSE_10);
-
-	US_DEBUGP("buffer is %p with length %d.\n", buffer, bufferSize);
-	for (i=0; i<bufferSize; i+=16) {
-		US_DEBUGP("%02x %02x %02x %02x %02x %02x %02x %02x\n"
-			  "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-			  buffer[i],
-			  buffer[i+1],
-			  buffer[i+2],
-			  buffer[i+3],
-			  buffer[i+4],
-			  buffer[i+5],
-			  buffer[i+6],
-			  buffer[i+7],
-			  buffer[i+8],
-			  buffer[i+9],
-			  buffer[i+10],
-			  buffer[i+11],
-			  buffer[i+12],
-			  buffer[i+13],
-			  buffer[i+14],
-			  buffer[i+15] );
-	}
-
-	US_DEBUGP("Buffer has %d scatterlists.\n", cmd->use_sg );
-	for (i=0; i<cmd->use_sg; i++) {
-		char *adr = sg_address(sg[i]);
-		
-		US_DEBUGP("Length of scatterlist %d is %d.\n",i,sg[i].length);
-		US_DEBUGP("%02x %02x %02x %02x %02x %02x %02x %02x\n"
-			  "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-			  adr[0],
-			  adr[1],
-			  adr[2],
-			  adr[3],
-			  adr[4],
-			  adr[5],
-			  adr[6],
-			  adr[7],
-			  adr[8],
-			  adr[9],
-			  adr[10],
-			  adr[11],
-			  adr[12],
-			  adr[13],
-			  adr[14],
-			  adr[15]);
-	}
-}
-
 void usb_stor_show_sense(
 		unsigned char key,
 		unsigned char asc,
diff -Nru a/drivers/usb/storage/debug.h b/drivers/usb/storage/debug.h
--- a/drivers/usb/storage/debug.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/debug.h	Thu Jan  8 23:00:24 2004
@@ -53,7 +53,6 @@
 
 #ifdef CONFIG_USB_STORAGE_DEBUG
 void usb_stor_show_command(Scsi_Cmnd *srb);
-void usb_stor_print_Scsi_Cmnd( Scsi_Cmnd* cmd );
 void usb_stor_show_sense( unsigned char key,
 		unsigned char asc, unsigned char ascq );
 #define US_DEBUGP(x...) printk( KERN_DEBUG USB_STORAGE x )
diff -Nru a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
--- a/drivers/usb/storage/isd200.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/isd200.c	Thu Jan  8 23:00:24 2004
@@ -543,7 +543,6 @@
 	int result;
 
 	/* send the command to the transport layer */
-	srb->resid = 0;
 	memcpy(srb->cmnd, ataCdb, sizeof(ataCdb->generic));
 	srb->cmd_len = sizeof(ataCdb->generic);
 	transferStatus = usb_stor_Bulk_transport(srb, us);
@@ -1117,60 +1116,6 @@
 
 
 /**************************************************************************
- * isd200_data_copy
- *									 
- * Copy data into the srb request buffer.  Use scatter gather if required.
- *
- * RETURNS:
- *    void
- */
-void isd200_data_copy(Scsi_Cmnd *srb, char * src, int length)
-{
-	unsigned int len = length;
-	struct scatterlist *sg;
-
-	if (srb->use_sg) {
-		int i;
-		unsigned int total = 0;
-
-		/* Add up the sizes of all the sg segments */
-		sg = (struct scatterlist *) srb->request_buffer;
-		for (i = 0; i < srb->use_sg; i++)
-			total += sg[i].length;
-
-		if (length > total)
-			len = total;
-
-		total = 0;
-
-		/* Copy data into sg buffer(s) */
-		for (i = 0; i < srb->use_sg; i++) {
-			if ((len > total) && (len > 0)) {
-				/* transfer the lesser of the next buffer or the
-				 * remaining data */
-				if (len - total >= sg[i].length) {
-					memcpy(sg_address(sg[i]), src + total, sg[i].length);
-					total += sg[i].length;
-				} else {
-					memcpy(sg_address(sg[i]), src + total, len - total);
-					total = len;
-				}
-			} 
-			else
-				break;
-		}
-	} else	{
-		/* Make sure length does not exceed buffer length */
-		if (length > srb->request_bufflen)
-			len = srb->request_bufflen;
-
-		if (len > 0)
-			memcpy(srb->request_buffer, src, len);
-	}
-}
-
-
-/**************************************************************************
  * isd200_scsi_to_ata
  *									 
  * Translate SCSI commands to ATA commands.
@@ -1198,11 +1143,9 @@
 	case INQUIRY:
 		US_DEBUGP("   ATA OUT - INQUIRY\n");
 
-		if (srb->request_bufflen > sizeof(struct inquiry_data))
-			srb->request_bufflen = sizeof(struct inquiry_data);
-
 		/* copy InquiryData */
-		isd200_data_copy(srb, (char *) &info->InquiryData, srb->request_bufflen);
+		usb_stor_set_xfer_buf((unsigned char *) &info->InquiryData,
+				sizeof(info->InquiryData), srb);
 		srb->result = SAM_STAT_GOOD;
 		sendToTransport = FALSE;
 		break;
@@ -1211,7 +1154,7 @@
 		US_DEBUGP("   ATA OUT - SCSIOP_MODE_SENSE\n");
 
 		/* Initialize the return buffer */
-		isd200_data_copy(srb, (char *) &senseData, 8);
+		usb_stor_set_xfer_buf(senseData, sizeof(senseData), srb);
 
 		if (info->DeviceFlags & DF_MEDIA_STATUS_ENABLED)
 		{
@@ -1231,9 +1174,6 @@
 	case TEST_UNIT_READY:
 		US_DEBUGP("   ATA OUT - SCSIOP_TEST_UNIT_READY\n");
 
-		/* Initialize the return buffer */
-		isd200_data_copy(srb, (char *) &senseData, 8);
-
 		if (info->DeviceFlags & DF_MEDIA_STATUS_ENABLED)
 		{
 			ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
@@ -1266,10 +1206,8 @@
 		readCapacityData.LogicalBlockAddress = cpu_to_be32(capacity);
 		readCapacityData.BytesPerBlock = cpu_to_be32(0x200);
 
-		if (srb->request_bufflen > sizeof(struct read_capacity_data))
-			srb->request_bufflen = sizeof(struct read_capacity_data);
-
-		isd200_data_copy(srb, (char *) &readCapacityData, srb->request_bufflen);
+		usb_stor_set_xfer_buf((unsigned char *) &readCapacityData,
+				sizeof(readCapacityData), srb);
 		srb->result = SAM_STAT_GOOD;
 		sendToTransport = FALSE;
 	}
@@ -1363,9 +1301,6 @@
 		US_DEBUGP("   ATA OUT - SCSIOP_START_STOP_UNIT\n");
 		US_DEBUGP("   srb->cmnd[4] = 0x%X\n", srb->cmnd[4]);
 
-		/* Initialize the return buffer */
-		isd200_data_copy(srb, (char *) &senseData, 8);
-
 		if ((srb->cmnd[4] & 0x3) == 0x2) {
 			US_DEBUGP("   Media Eject\n");
 			ataCdb->generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
@@ -1500,6 +1435,7 @@
 		US_DEBUGP("ERROR Driver not initialized\n");
 
 	/* Convert command */
+	srb->resid = 0;
 	sendToTransport = isd200_scsi_to_ata(srb, us, &ataCdb);
 
 	/* send the command to the transport layer */
diff -Nru a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c
--- a/drivers/usb/storage/jumpshot.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/jumpshot.c	Thu Jan  8 23:00:23 2004
@@ -48,7 +48,6 @@
   */
 
 #include "transport.h"
-#include "raw_bulk.h"
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -111,15 +110,14 @@
 			      struct jumpshot_info *info,
 			      u32 sector,
 			      u32 sectors, 
-			      unsigned char *dest, 
+			      unsigned char *buffer, 
 			      int use_sg)
 {
 	unsigned char *command = us->iobuf;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
 	unsigned char  thistime;
-	int totallen, len, result;
-	int sg_idx = 0, current_sg_offset = 0;
+	unsigned int totallen, alloclen;
+	int len, result;
+	unsigned int sg_idx = 0, sg_offset = 0;
 
 	// we're working in LBA mode.  according to the ATA spec, 
 	// we can support up to 28-bit addressing.  I don't know if Jumpshot
@@ -131,20 +129,24 @@
 
 	totallen = sectors * info->ssize;
 
+	// Since we don't read more than 64 KB at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	alloclen = min(totallen, 65536u);
+	if (use_sg) {
+		buffer = kmalloc(alloclen, GFP_NOIO);
+		if (buffer == NULL)
+			return USB_STOR_TRANSPORT_ERROR;
+	}
+
 	do {
 		// loop, never allocate or transfer more than 64k at once
 		// (min(128k, 255*info->ssize) is the real limit)
-		len = min_t(int, totallen, 65536);
-
-		if (use_sg) {
-			buffer = kmalloc(len, GFP_NOIO);
-			if (buffer == NULL)
-				return USB_STOR_TRANSPORT_ERROR;
-			ptr = buffer;
-		} else {
-			ptr = dest;
-		}
-
+		len = min(totallen, alloclen);
 		thistime = (len / info->ssize) & 0xff;
 
 		command[0] = 0;
@@ -163,26 +165,25 @@
 			goto leave;
 
 		// read the result
-		result = jumpshot_bulk_read(us, ptr, len);
+		result = jumpshot_bulk_read(us, buffer, len);
 		if (result != USB_STOR_XFER_GOOD)
 			goto leave;
 
 		US_DEBUGP("jumpshot_read_data:  %d bytes\n", len);
-	
-		sectors -= thistime;
-		sector  += thistime;
-
-		if (use_sg) {
-			us_copy_to_sgbuf(buffer, len, dest,
-					 &sg_idx, &current_sg_offset, use_sg);
-			kfree(buffer);
-		} else {
-			dest += len;
-		}
 
+		// Store the data (s-g) or update the pointer (!s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					 &sg_idx, &sg_offset, TO_XFER_BUF);
+		else
+			buffer += len;
+
+		sector += thistime;
 		totallen -= len;
 	} while (totallen > 0);
 
+	if (use_sg)
+		kfree(buffer);
 	return USB_STOR_TRANSPORT_GOOD;
 
  leave:
@@ -196,15 +197,14 @@
 			       struct jumpshot_info *info,
 			       u32 sector,
 			       u32 sectors, 
-			       unsigned char *src, 
+			       unsigned char *buffer, 
 			       int use_sg)
 {
 	unsigned char *command = us->iobuf;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
 	unsigned char  thistime;
-	int totallen, len, result, waitcount;
-	int sg_idx = 0, sg_offset = 0;
+	unsigned int totallen, alloclen;
+	int len, result, waitcount;
+	unsigned int sg_idx = 0, sg_offset = 0;
 
 	// we're working in LBA mode.  according to the ATA spec, 
 	// we can support up to 28-bit addressing.  I don't know if Jumpshot
@@ -216,24 +216,32 @@
 
 	totallen = sectors * info->ssize;
 
-	do {
-		// loop, never allocate or transfer more than 64k at once
-		// (min(128k, 255*info->ssize) is the real limit)
-
-		len = min_t(int, totallen, 65536);
-
-		// if we are using scatter-gather,
-		// first copy all to one big buffer
-
-		buffer = us_copy_from_sgbuf(src, len, &sg_idx,
-					    &sg_offset, use_sg);
+	// Since we don't write more than 64 KB at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	alloclen = min(totallen, 65536u);
+	if (use_sg) {
+		buffer = kmalloc(alloclen, GFP_NOIO);
 		if (buffer == NULL)
 			return USB_STOR_TRANSPORT_ERROR;
+	}
 
-		ptr = buffer;
+	do {
+		// loop, never allocate or transfer more than 64k at once
+		// (min(128k, 255*info->ssize) is the real limit)
 
+		len = min(totallen, alloclen);
 		thistime = (len / info->ssize) & 0xff;
 
+		// Get the data from the transfer buffer (s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&sg_idx, &sg_offset, FROM_XFER_BUF);
+
 		command[0] = 0;
 		command[1] = thistime;
 		command[2] = sector & 0xFF;
@@ -250,7 +258,7 @@
 			goto leave;
 
 		// send the data
-		result = jumpshot_bulk_write(us, ptr, len);
+		result = jumpshot_bulk_write(us, buffer, len);
 		if (result != USB_STOR_XFER_GOOD)
 			goto leave;
 
@@ -269,18 +277,17 @@
 
 		if (result != USB_STOR_TRANSPORT_GOOD)
 			US_DEBUGP("jumpshot_write_data:  Gah!  Waitcount = 10.  Bad write!?\n");
-		
-		sectors -= thistime;
-		sector  += thistime;
 
-		if (use_sg)
-			kfree(buffer);
-		else
-			src += len;
+		// Update the transfer buffer pointer (!s-g)
+		if (!use_sg)
+			buffer += len;
 
+		sector += thistime;
 		totallen -= len;
 	} while (totallen > 0);
 
+	if (use_sg)
+		kfree(buffer);
 	return result;
 
  leave:
@@ -605,14 +612,14 @@
 		US_DEBUGP("jumpshot_transport:  MODE_SENSE_10 detected\n");
 		return jumpshot_handle_mode_sense(us, srb, ptr, FALSE);
 	}
-	
+
 	if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
 		// sure.  whatever.  not like we can stop the user from popping
 		// the media out of the device (no locking doors, etc)
 		//
 		return USB_STOR_TRANSPORT_GOOD;
 	}
-	
+
 	if (srb->cmnd[0] == START_STOP) {
 		/* this is used by sd.c'check_scsidisk_media_change to detect
 		   media change */
diff -Nru a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c
--- a/drivers/usb/storage/protocol.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/protocol.c	Thu Jan  8 23:00:23 2004
@@ -44,6 +44,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <linux/highmem.h>
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -54,48 +55,36 @@
  * Helper routines
  ***********************************************************************/
 
-static void *
-find_data_location(Scsi_Cmnd *srb) {
-	if (srb->use_sg) {
-		/*
-		 * This piece of code only works if the first page is
-		 * big enough to hold more than 3 bytes -- which is
-		 * _very_ likely.
-		 */
-		struct scatterlist *sg;
-
-		sg = (struct scatterlist *) srb->request_buffer;
-		return (void *) sg_address(sg[0]);
-	} else
-		return (void *) srb->request_buffer;
-}
-
 /*
  * Fix-up the return data from an INQUIRY command to show 
  * ANSI SCSI rev 2 so we don't confuse the SCSI layers above us
  */
 static void fix_inquiry_data(Scsi_Cmnd *srb)
 {
-	unsigned char *data_ptr;
+	unsigned char databuf[3];
+	unsigned int index, offset;
 
 	/* verify that it's an INQUIRY command */
 	if (srb->cmnd[0] != INQUIRY)
 		return;
 
-	/* oddly short buffer -- bail out */
-	if (srb->request_bufflen < 3)
+	index = offset = 0;
+	if (usb_stor_access_xfer_buf(databuf, sizeof(databuf), srb,
+			&index, &offset, FROM_XFER_BUF) != sizeof(databuf))
 		return;
 
-	data_ptr = find_data_location(srb);
-
-	if ((data_ptr[2] & 7) == 2)
+	if ((databuf[2] & 7) == 2)
 		return;
 
 	US_DEBUGP("Fixing INQUIRY data to show SCSI rev 2 - was %d\n",
-		  data_ptr[2] & 7);
+		  databuf[2] & 7);
 
 	/* Change the SCSI revision number */
-	data_ptr[2] = (data_ptr[2] & ~7) | 2;
+	databuf[2] = (databuf[2] & ~7) | 2;
+
+	index = offset = 0;
+	usb_stor_access_xfer_buf(databuf, sizeof(databuf), srb,
+			&index, &offset, TO_XFER_BUF);
 }
 
 /*
@@ -104,23 +93,27 @@
  */
 static void fix_read_capacity(Scsi_Cmnd *srb)
 {
-	unsigned char *dp;
+	unsigned int index, offset;
+	u32 c;
 	unsigned long capacity;
 
 	/* verify that it's a READ CAPACITY command */
 	if (srb->cmnd[0] != READ_CAPACITY)
 		return;
 
-	dp = find_data_location(srb);
+	index = offset = 0;
+	if (usb_stor_access_xfer_buf((unsigned char *) &c, 4, srb,
+			&index, &offset, FROM_XFER_BUF) != 4)
+		return;
 
-	capacity = (dp[0]<<24) + (dp[1]<<16) + (dp[2]<<8) + (dp[3]);
+	capacity = be32_to_cpu(c);
 	US_DEBUGP("US: Fixing capacity: from %ld to %ld\n",
 	       capacity+1, capacity);
-	capacity--;
-	dp[0] = (capacity >> 24);
-	dp[1] = (capacity >> 16);
-	dp[2] = (capacity >> 8);
-	dp[3] = (capacity);
+	c = cpu_to_be32(capacity - 1);
+
+	index = offset = 0;
+	usb_stor_access_xfer_buf((unsigned char *) &c, 4, srb,
+			&index, &offset, TO_XFER_BUF);
 }
 
 /***********************************************************************
@@ -233,4 +226,113 @@
 		if (us->flags & US_FL_FIX_CAPACITY)
 			fix_read_capacity(srb);
 	}
+}
+
+/***********************************************************************
+ * Scatter-gather transfer buffer access routines
+ ***********************************************************************/
+
+/* Copy a buffer of length buflen to/from the srb's transfer buffer.
+ * (Note: for scatter-gather transfers (srb->use_sg > 0), srb->request_buffer
+ * points to a list of s-g entries and we ignore srb->request_bufflen.
+ * For non-scatter-gather transfers, srb->request_buffer points to the
+ * transfer buffer itself and srb->request_bufflen is the buffer's length.)
+ * Update the *index and *offset variables so that the next copy will
+ * pick up from where this one left off. */
+
+unsigned int usb_stor_access_xfer_buf(unsigned char *buffer,
+	unsigned int buflen, Scsi_Cmnd *srb, unsigned int *index,
+	unsigned int *offset, enum xfer_buf_dir dir)
+{
+	unsigned int cnt;
+
+	/* If not using scatter-gather, just transfer the data directly.
+	 * Make certain it will fit in the available buffer space. */
+	if (srb->use_sg == 0) {
+		if (*offset >= srb->request_bufflen)
+			return 0;
+		cnt = min(buflen, srb->request_bufflen - *offset);
+		if (dir == TO_XFER_BUF)
+			memcpy((unsigned char *) srb->request_buffer + *offset,
+					buffer, cnt);
+		else
+			memcpy(buffer, (unsigned char *) srb->request_buffer +
+					*offset, cnt);
+		*offset += cnt;
+
+	/* Using scatter-gather.  We have to go through the list one entry
+	 * at a time.  Each s-g entry contains some number of pages, and
+	 * each page has to be kmap()'ed separately.  If the page is already
+	 * in kernel-addressable memory then kmap() will return its address.
+	 * If the page is not directly accessible -- such as a user buffer
+	 * located in high memory -- then kmap() will map it to a temporary
+	 * position in the kernel's virtual address space. */
+	} else {
+		struct scatterlist *sg =
+				(struct scatterlist *) srb->request_buffer
+				+ *index;
+
+		/* This loop handles a single s-g list entry, which may
+		 * include multiple pages.  Find the initial page structure
+		 * and the starting offset within the page, and update
+		 * the *offset and *index values for the next loop. */
+		cnt = 0;
+		while (cnt < buflen && *index < srb->use_sg) {
+			struct page *page = sg->page +
+					((sg->offset + *offset) >> PAGE_SHIFT);
+			unsigned int poff =
+					(sg->offset + *offset) & (PAGE_SIZE-1);
+			unsigned int sglen = sg->length - *offset;
+
+			if (sglen > buflen - cnt) {
+
+				/* Transfer ends within this s-g entry */
+				sglen = buflen - cnt;
+				*offset += sglen;
+			} else {
+
+				/* Transfer continues to next s-g entry */
+				*offset = 0;
+				++*index;
+				++sg;
+			}
+
+			/* Transfer the data for all the pages in this
+			 * s-g entry.  For each page: call kmap(), do the
+			 * transfer, and call kunmap() immediately after. */
+			while (sglen > 0) {
+				unsigned int plen = min(sglen, (unsigned int)
+						PAGE_SIZE - poff);
+				unsigned char *ptr = kmap(page);
+
+				if (dir == TO_XFER_BUF)
+					memcpy(ptr + poff, buffer + cnt, plen);
+				else
+					memcpy(buffer + cnt, ptr + poff, plen);
+				kunmap(page);
+
+				/* Start at the beginning of the next page */
+				poff = 0;
+				++page;
+				cnt += plen;
+				sglen -= plen;
+			}
+		}
+	}
+
+	/* Return the amount actually transferred */
+	return cnt;
+}
+
+/* Store the contents of buffer into srb's transfer buffer and set the
+ * SCSI residue. */
+void usb_stor_set_xfer_buf(unsigned char *buffer,
+	unsigned int buflen, Scsi_Cmnd *srb)
+{
+	unsigned int index = 0, offset = 0;
+
+	usb_stor_access_xfer_buf(buffer, buflen, srb, &index, &offset,
+			TO_XFER_BUF);
+	if (buflen < srb->request_bufflen)
+		srb->resid = srb->request_bufflen - buflen;
 }
diff -Nru a/drivers/usb/storage/protocol.h b/drivers/usb/storage/protocol.h
--- a/drivers/usb/storage/protocol.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/protocol.h	Thu Jan  8 23:00:24 2004
@@ -59,9 +59,19 @@
 
 #define US_SC_DEVICE	0xff		/* Use device's value */
 
+/* Protocol handling routines */
 extern void usb_stor_ATAPI_command(Scsi_Cmnd*, struct us_data*);
 extern void usb_stor_qic157_command(Scsi_Cmnd*, struct us_data*);
 extern void usb_stor_ufi_command(Scsi_Cmnd*, struct us_data*);
 extern void usb_stor_transparent_scsi_command(Scsi_Cmnd*, struct us_data*);
 
+/* Scsi_Cmnd transfer buffer access utilities */
+enum xfer_buf_dir	{TO_XFER_BUF, FROM_XFER_BUF};
+
+extern unsigned int usb_stor_access_xfer_buf(unsigned char *buffer,
+	unsigned int buflen, Scsi_Cmnd *srb, unsigned int *index,
+	unsigned int *offset, enum xfer_buf_dir dir);
+
+extern void usb_stor_set_xfer_buf(unsigned char *buffer,
+	unsigned int buflen, Scsi_Cmnd *srb);
 #endif
diff -Nru a/drivers/usb/storage/raw_bulk.c b/drivers/usb/storage/raw_bulk.c
--- a/drivers/usb/storage/raw_bulk.c	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,116 +0,0 @@
-/*
- * Common routines for a handful of drivers.
- * Unrelated to CF/SM - just scatter-gather stuff.
- */
-
-#include "usb.h"
-#include "raw_bulk.h"
-
-/*
- * The routines below convert scatter-gather to single buffer.
- * Some drivers claim this is necessary.
- * Nothing is done when use_sg is zero.
- */
-
-/*
- * Copy from scatter-gather buffer into a newly allocated single buffer,
- * starting at a given index and offset.
- * When done, update index and offset.
- * Return a pointer to the single buffer.
- */
-unsigned char *
-us_copy_from_sgbuf(unsigned char *content, int len,
-		   int *index, int *offset, int use_sg) {
-	struct scatterlist *sg;
-	unsigned char *buffer;
-	int transferred, i;
-
-	if (!use_sg)
-		return content;
-
-	sg = (struct scatterlist *)content;
-	buffer = kmalloc(len, GFP_NOIO);
-	if (buffer == NULL)
-		return NULL;
-
-	transferred = 0;
-	i = *index;
-	while (i < use_sg && transferred < len) {
-		unsigned char *ptr;
-		unsigned int length, room;
-
-		ptr = sg_address(sg[i]) + *offset;
-
-		room = sg[i].length - *offset;
-		length = len - transferred;
-		if (length > room)
-			length = room;
-
-		memcpy(buffer+transferred, ptr, length);
-		transferred += length;
-		*offset += length;
-		if (length == room) {
-			i++;
-			*offset = 0;
-		}
-	}
-	*index = i;
-
-	return buffer;
-}
-
-unsigned char *
-us_copy_from_sgbuf_all(unsigned char *content, int len, int use_sg) {
-	int index, offset;
-
-	index = offset = 0;
-	return us_copy_from_sgbuf(content, len, &index, &offset, use_sg);
-}
-
-/*
- * Copy from a single buffer into a scatter-gather buffer,
- * starting at a given index and offset.
- * When done, update index and offset.
- */
-void
-us_copy_to_sgbuf(unsigned char *buffer, int buflen,
-		 void *content, int *index, int *offset, int use_sg) {
-	struct scatterlist *sg;
-	int i, transferred;
-
-	if (!use_sg)
-		return;
-
-	transferred = 0;
-	sg = content;
-	i = *index;
-	while (i < use_sg && transferred < buflen) {
-		unsigned char *ptr;
-		unsigned int length, room;
-
-		ptr = sg_address(sg[i]) + *offset;
-
-		room = sg[i].length - *offset;
-		length = buflen - transferred;
-		if (length > room)
-			length = room;
-		
-		memcpy(ptr, buffer+transferred, length);
-		transferred += sg[i].length;
-		*offset += length;
-		if (length == room) {
-			i++;
-			*offset = 0;
-		}
-	}
-	*index = i;
-}
-
-void
-us_copy_to_sgbuf_all(unsigned char *buffer, int buflen,
-		     void *content, int use_sg) {
-	int index, offset;
-
-	index = offset = 0;
-	us_copy_to_sgbuf(buffer, buflen, content, &index, &offset, use_sg);
-}
diff -Nru a/drivers/usb/storage/raw_bulk.h b/drivers/usb/storage/raw_bulk.h
--- a/drivers/usb/storage/raw_bulk.h	Thu Jan  8 23:00:23 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-#ifndef _USB_STORAGE_RAW_BULK_H_
-#define _USB_STORAGE_RAW_BULK_H_
-
-/* scatter-gather */
-extern unsigned char *us_copy_from_sgbuf(
-	unsigned char *content, int buflen,
-	int *index, int *offset, int use_sg);
-
-extern unsigned char *us_copy_from_sgbuf_all(
-	unsigned char *content, int len, int use_sg);
-
-extern void us_copy_to_sgbuf(
-	unsigned char *buffer, int buflen,
-	void *content, int *index, int *offset, int use_sg);
-
-extern void us_copy_to_sgbuf_all(
-	unsigned char *buffer, int buflen,
-	void *content, int use_sg);
-
-#endif
diff -Nru a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
--- a/drivers/usb/storage/scsiglue.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/scsiglue.c	Thu Jan  8 23:00:24 2004
@@ -325,7 +325,8 @@
 	.emulated =			TRUE,
 
 	/* modify scsi_device bits on probe */
-	.flags = (BLIST_MS_SKIP_PAGE_08 | BLIST_USE_10_BYTE_MS),
+	.flags = (BLIST_MS_SKIP_PAGE_08 | BLIST_MS_SKIP_PAGE_3F |
+		  BLIST_USE_10_BYTE_MS),
 
 	/* module management */
 	.module =			THIS_MODULE
diff -Nru a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c
--- a/drivers/usb/storage/sddr09.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/sddr09.c	Thu Jan  8 23:00:24 2004
@@ -28,7 +28,6 @@
  */
 
 #include "transport.h"
-#include "raw_bulk.h"
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -66,7 +65,7 @@
  * NAND Flash Manufacturer ID Codes
  */
 #define NAND_MFR_AMD		0x01
-#define NAND_MFR_NS		0x8f
+#define NAND_MFR_NATSEMI	0x8f
 #define NAND_MFR_TOSHIBA	0x98
 #define NAND_MFR_SAMSUNG	0xec
 
@@ -74,8 +73,8 @@
 	switch(manuf_id) {
 	case NAND_MFR_AMD:
 		return "AMD";
-	case NAND_MFR_NS:
-		return "NS";
+	case NAND_MFR_NATSEMI:
+		return "NATSEMI";
 	case NAND_MFR_TOSHIBA:
 		return "Toshiba";
 	case NAND_MFR_SAMSUNG:
@@ -302,8 +301,7 @@
 	if (result != USB_STOR_XFER_GOOD) {
 		US_DEBUGP("request sense bulk in failed\n");
 		return USB_STOR_TRANSPORT_ERROR;
-	}
-	else {
+	} else {
 		US_DEBUGP("request sense worked\n");
 		return USB_STOR_TRANSPORT_GOOD;
 	}
@@ -469,6 +467,8 @@
 	unsigned char *command = us->iobuf;
 	int result;
 
+	US_DEBUGP("sddr09_erase: erase address %lu\n", Eaddress);
+
 	memset(command, 0, 12);
 	command[0] = 0xEA;
 	command[1] = LUNBITS;
@@ -663,30 +663,31 @@
 sddr09_read_data(struct us_data *us,
 		 unsigned long address,
 		 unsigned int sectors,
-		 unsigned char *content,
+		 unsigned char *buffer,
 		 int use_sg) {
 
 	struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
 	unsigned int lba, maxlba, pba;
 	unsigned int page, pages;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
-	int result, len;
-
-	// If we're using scatter-gather, we have to create a new
-	// buffer to read all of the data in first, since a
-	// scatter-gather buffer could in theory start in the middle
-	// of a page, which would be bad. A developer who wants a
-	// challenge might want to write a limited-buffer
-	// version of this code.
-
-	len = sectors*info->pagesize;
-
-	buffer = (use_sg ? kmalloc(len, GFP_NOIO) : content);
-	if (buffer == NULL)
-		return USB_STOR_TRANSPORT_ERROR;
+	unsigned int len, index, offset;
+	int result;
 
-	ptr = buffer;
+	// Since we only read in one block at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	if (use_sg) {
+		len = min(sectors, (unsigned int) info->blocksize) *
+				info->pagesize;
+		buffer = kmalloc(len, GFP_NOIO);
+		if (buffer == NULL) {
+			printk("sddr09_read_data: Out of memory\n");
+			return USB_STOR_TRANSPORT_ERROR;
+		}
+	}
 
 	// Figure out the initial LBA and page
 	lba = address >> info->blockshift;
@@ -697,13 +698,13 @@
 	// contiguous LBA's. Another exercise left to the student.
 
 	result = USB_STOR_TRANSPORT_GOOD;
+	index = offset = 0;
 
 	while (sectors > 0) {
 
 		/* Find number of pages we can read in this block */
-		pages = info->blocksize - page;
-		if (pages > sectors)
-			pages = sectors;
+		pages = min(sectors, info->blocksize - page);
+		len = pages << info->pageshift;
 
 		/* Not overflowing capacity? */
 		if (lba >= maxlba) {
@@ -726,7 +727,7 @@
 			   Instead of returning USB_STOR_TRANSPORT_ERROR
 			   it is better to return all zero data. */
 
-			memset(ptr, 0, pages << info->pageshift);
+			memset(buffer, 0, len);
 
 		} else {
 			US_DEBUGP("Read %d pages, from PBA %d"
@@ -737,37 +738,50 @@
 				info->pageshift;
 
 			result = sddr09_read20(us, address>>1,
-					       pages, info->pageshift, ptr, 0);
+					pages, info->pageshift, buffer, 0);
 			if (result != USB_STOR_TRANSPORT_GOOD)
 				break;
 		}
 
+		// Store the data (s-g) or update the pointer (!s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&index, &offset, TO_XFER_BUF);
+		else
+			buffer += len;
+
 		page = 0;
 		lba++;
 		sectors -= pages;
-		ptr += (pages << info->pageshift);
 	}
 
-	if (use_sg && result == USB_STOR_TRANSPORT_GOOD)
-		us_copy_to_sgbuf_all(buffer, len, content, use_sg);
-
 	if (use_sg)
 		kfree(buffer);
 
 	return result;
 }
 
-/* we never free blocks, so lastpba can only increase */
 static unsigned int
-sddr09_find_unused_pba(struct sddr09_card_info *info) {
+sddr09_find_unused_pba(struct sddr09_card_info *info, unsigned int lba) {
 	static unsigned int lastpba = 1;
-	int numblocks = info->capacity >> (info->blockshift + info->pageshift);
-	int i;
+	int zonestart, end, i;
 
-	for (i = lastpba+1; i < numblocks; i++) {
-		if (info->pba_to_lba[i] == UNDEF) {
+	zonestart = (lba/1000) << 10;
+	end = info->capacity >> (info->blockshift + info->pageshift);
+	end -= zonestart;
+	if (end > 1024)
+		end = 1024;
+
+	for (i = lastpba+1; i < end; i++) {
+		if (info->pba_to_lba[zonestart+i] == UNDEF) {
+			lastpba = i;
+			return zonestart+i;
+		}
+	}
+	for (i = 0; i <= lastpba; i++) {
+		if (info->pba_to_lba[zonestart+i] == UNDEF) {
 			lastpba = i;
-			return i;
+			return zonestart+i;
 		}
 	}
 	return 0;
@@ -776,29 +790,31 @@
 static int
 sddr09_write_lba(struct us_data *us, unsigned int lba,
 		 unsigned int page, unsigned int pages,
-		 unsigned char *ptr) {
+		 unsigned char *ptr, unsigned char *blockbuffer) {
 
 	struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
 	unsigned long address;
 	unsigned int pba, lbap;
-	unsigned int pagelen, blocklen;
-	unsigned char *blockbuffer, *bptr, *cptr, *xptr;
+	unsigned int pagelen;
+	unsigned char *bptr, *cptr, *xptr;
 	unsigned char ecc[3];
-	int i, result;
+	int i, result, isnew;
 
-	lbap = ((lba & 0x3ff) << 1) | 0x1000;
+	lbap = ((lba % 1000) << 1) | 0x1000;
 	if (parity[MSB_of(lbap) ^ LSB_of(lbap)])
 		lbap ^= 1;
 	pba = info->lba_to_pba[lba];
+	isnew = 0;
 
 	if (pba == UNDEF) {
-		pba = sddr09_find_unused_pba(info);
+		pba = sddr09_find_unused_pba(info, lba);
 		if (!pba) {
 			printk("sddr09_write_lba: Out of unused blocks\n");
 			return USB_STOR_TRANSPORT_ERROR;
 		}
 		info->pba_to_lba[pba] = lba;
 		info->lba_to_pba[lba] = pba;
+		isnew = 1;
 	}
 
 	if (pba == 1) {
@@ -809,22 +825,16 @@
 	}
 
 	pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
-	blocklen = (pagelen << info->blockshift);
-	blockbuffer = kmalloc(blocklen, GFP_NOIO);
-	if (!blockbuffer) {
-		printk("sddr09_write_lba: Out of memory\n");
-		return USB_STOR_TRANSPORT_ERROR;
-	}
 
 	/* read old contents */
 	address = (pba << (info->pageshift + info->blockshift));
 	result = sddr09_read22(us, address>>1, info->blocksize,
 			       info->pageshift, blockbuffer, 0);
 	if (result != USB_STOR_TRANSPORT_GOOD)
-		goto err;
+		return result;
 
-	/* check old contents */
-	for (i = 0; i < info->blockshift; i++) {
+	/* check old contents and fill lba */
+	for (i = 0; i < info->blocksize; i++) {
 		bptr = blockbuffer + i*pagelen;
 		cptr = bptr + info->pagesize;
 		nand_compute_ecc(bptr, ecc);
@@ -839,6 +849,8 @@
 				  i, pba);
 			nand_store_ecc(cptr+8, ecc);
 		}
+		cptr[6] = cptr[11] = MSB_of(lbap);
+		cptr[7] = cptr[12] = LSB_of(lbap);
 	}
 
 	/* copy in new stuff and compute ECC */
@@ -852,8 +864,6 @@
 		nand_store_ecc(cptr+13, ecc);
 		nand_compute_ecc(bptr+(info->pagesize / 2), ecc);
 		nand_store_ecc(cptr+8, ecc);
-		cptr[6] = cptr[11] = MSB_of(lbap);
-		cptr[7] = cptr[12] = LSB_of(lbap);
 	}
 
 	US_DEBUGP("Rewrite PBA %d (LBA %d)\n", pba, lba);
@@ -880,11 +890,6 @@
 		int result2 = sddr09_test_unit_ready(us);
 	}
 #endif
- err:
-	kfree(blockbuffer);
-
-	/* TODO: instead of doing kmalloc/kfree for each block,
-	   add a bufferpointer to the info structure */
 
 	return result;
 }
@@ -893,49 +898,84 @@
 sddr09_write_data(struct us_data *us,
 		  unsigned long address,
 		  unsigned int sectors,
-		  unsigned char *content,
+		  unsigned char *buffer,
 		  int use_sg) {
 
 	struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
 	unsigned int lba, page, pages;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
-	int result, len;
+	unsigned int pagelen, blocklen;
+	unsigned char *blockbuffer;
+	unsigned int len, index, offset;
+	int result;
 
-	len = sectors*info->pagesize;
+	// blockbuffer is used for reading in the old data, overwriting
+	// with the new data, and performing ECC calculations
 
-	buffer = us_copy_from_sgbuf_all(content, len, use_sg);
-	if (buffer == NULL)
+	/* TODO: instead of doing kmalloc/kfree for each write,
+	   add a bufferpointer to the info structure */
+
+	pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
+	blocklen = (pagelen << info->blockshift);
+	blockbuffer = kmalloc(blocklen, GFP_NOIO);
+	if (!blockbuffer) {
+		printk("sddr09_write_data: Out of memory\n");
 		return USB_STOR_TRANSPORT_ERROR;
+	}
 
-	ptr = buffer;
+	// Since we don't write the user data directly to the device,
+	// we have to create a bounce buffer if the transfer uses
+	// scatter-gather.  We will move the data a piece at a time
+	// between the bounce buffer and the actual transfer buffer.
+	// If we're not using scatter-gather, we can simply update
+	// the transfer buffer pointer to get the same effect.
+
+	if (use_sg) {
+		len = min(sectors, (unsigned int) info->blocksize) *
+				info->pagesize;
+		buffer = kmalloc(len, GFP_NOIO);
+		if (buffer == NULL) {
+			printk("sddr09_write_data: Out of memory\n");
+			kfree(blockbuffer);
+			return USB_STOR_TRANSPORT_ERROR;
+		}
+	}
 
 	// Figure out the initial LBA and page
 	lba = address >> info->blockshift;
 	page = (address & info->blockmask);
 
 	result = USB_STOR_TRANSPORT_GOOD;
+	index = offset = 0;
 
 	while (sectors > 0) {
 
 		// Write as many sectors as possible in this block
 
-		pages = info->blocksize - page;
-		if (pages > sectors)
-			pages = sectors;
+		pages = min(sectors, info->blocksize - page);
+		len = (pages << info->pageshift);
+
+		// Get the data from the transfer buffer (s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&index, &offset, FROM_XFER_BUF);
 
-		result = sddr09_write_lba(us, lba, page, pages, ptr);
+		result = sddr09_write_lba(us, lba, page, pages,
+				buffer, blockbuffer);
 		if (result != USB_STOR_TRANSPORT_GOOD)
 			break;
 
+		// Update the transfer buffer pointer (!s-g)
+		if (!use_sg)
+			buffer += len;
+
 		page = 0;
 		lba++;
 		sectors -= pages;
-		ptr += (pages << info->pageshift);
 	}
 
 	if (use_sg)
 		kfree(buffer);
+	kfree(blockbuffer);
 
 	return result;
 }
@@ -947,10 +987,11 @@
 		unsigned char *content,
 		int use_sg) {
 
-	US_DEBUGP("Read control address %08lX blocks %04X\n",
+	US_DEBUGP("Read control address %lu, blocks %d\n",
 		address, blocks);
 
-	return sddr09_read21(us, address, blocks, CONTROL_SHIFT, content, use_sg);
+	return sddr09_read21(us, address, blocks,
+			     CONTROL_SHIFT, content, use_sg);
 }
 
 /*
@@ -997,7 +1038,7 @@
 		US_DEBUGP("sddr09_get_wp: read_status fails\n");
 		return result;
 	}
-	US_DEBUGP("sddr09_get_wp: status %02X", status);
+	US_DEBUGP("sddr09_get_wp: status 0x%02X", status);
 	if ((status & 0x80) == 0) {
 		info->flags |= SDDR09_WP;	/* write protected */
 		US_DEBUGP(" WP");
@@ -1092,69 +1133,36 @@
 static int
 sddr09_read_map(struct us_data *us) {
 
-	struct scatterlist *sg;
 	struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
 	int numblocks, alloc_len, alloc_blocks;
 	int i, j, result;
-	unsigned char *ptr;
+	unsigned char *buffer, *buffer_end, *ptr;
 	unsigned int lba, lbact;
 
 	if (!info->capacity)
 		return -1;
 
-	// read 64 (1<<6) bytes for every block 
-	// ( 1 << ( blockshift + pageshift ) bytes)
-	//	 of capacity:
-	// (1<<6)*capacity/(1<<(b+p)) =
-	// ((1<<6)*capacity)>>(b+p) =
-	// capacity>>(b+p-6)
-
-	alloc_len = info->capacity >> 
-		(info->blockshift + info->pageshift - CONTROL_SHIFT);
-
-	// Allocate a number of scatterlist structures according to
-	// the number of 128k blocks in the alloc_len. Adding 128k-1
-	// and then dividing by 128k gives the correct number of blocks.
-	// 128k = 1<<17
-
-	alloc_blocks = (alloc_len + (1<<17) - 1) >> 17;
-	sg = kmalloc(alloc_blocks*sizeof(struct scatterlist),
-		     GFP_NOIO);
-	if (sg == NULL)
-		return 0;
-
-	for (i=0; i<alloc_blocks; i++) {
-		int alloc_req = (i < alloc_blocks-1 ? 1 << 17 : alloc_len);
-		char *vaddr = kmalloc(alloc_req, GFP_NOIO);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,3)
-		sg[i].page = virt_to_page(vaddr);
-		sg[i].offset = offset_in_page(vaddr);
-#else
-		sg[i].address = vaddr;
-#endif
-		sg[i].length = alloc_req;
-		alloc_len -= alloc_req;
-	}
-
-	for (i=0; i<alloc_blocks; i++)
-		if (sg[i].page == NULL) {
-			for (i=0; i<alloc_blocks; i++)
-				if (sg[i].page != NULL)
-					kfree(sg_address(sg[i]));
-			kfree(sg);
-			return 0;
-		}
+	// size of a block is 1 << (blockshift + pageshift) bytes
+	// divide into the total capacity to get the number of blocks
 
 	numblocks = info->capacity >> (info->blockshift + info->pageshift);
 
-	result = sddr09_read_control(us, 0, numblocks,
-				     (unsigned char *)sg, alloc_blocks);
-	if (result != USB_STOR_TRANSPORT_GOOD) {
-		for (i=0; i<alloc_blocks; i++)
-			kfree(sg_address(sg[i]));
-		kfree(sg);
-		return -1;
+	// read 64 bytes for every block (actually 1 << CONTROL_SHIFT)
+	// but only use a 64 KB buffer
+	// buffer size used must be a multiple of (1 << CONTROL_SHIFT)
+#define SDDR09_READ_MAP_BUFSZ 65536
+
+	alloc_blocks = min(numblocks, SDDR09_READ_MAP_BUFSZ >> CONTROL_SHIFT);
+	alloc_len = (alloc_blocks << CONTROL_SHIFT);
+	buffer = kmalloc(alloc_len, GFP_NOIO);
+	if (buffer == NULL) {
+		printk("sddr09_read_map: out of memory\n");
+		result = -1;
+		goto done;
 	}
+	buffer_end = buffer + alloc_len;
+
+#undef SDDR09_READ_MAP_BUFSZ
 
 	kfree(info->lba_to_pba);
 	kfree(info->pba_to_lba);
@@ -1162,29 +1170,35 @@
 	info->pba_to_lba = kmalloc(numblocks*sizeof(int), GFP_NOIO);
 
 	if (info->lba_to_pba == NULL || info->pba_to_lba == NULL) {
-		kfree(info->lba_to_pba);
-		kfree(info->pba_to_lba);
-		info->lba_to_pba = NULL;
-		info->pba_to_lba = NULL;
-		for (i=0; i<alloc_blocks; i++)
-			kfree(sg_address(sg[i]));
-		kfree(sg);
-		return 0;
+		printk("sddr09_read_map: out of memory\n");
+		result = -1;
+		goto done;
 	}
 
 	for (i = 0; i < numblocks; i++)
 		info->lba_to_pba[i] = info->pba_to_lba[i] = UNDEF;
 
-	ptr = sg_address(sg[0]);
-
 	/*
 	 * Define lba-pba translation table
 	 */
-	// Each block is 64 bytes of control data, so block i is located in
-	// scatterlist block i*64/128k = i*(2^6)*(2^-17) = i*(2^-11)
 
-	for (i=0; i<numblocks; i++) {
-		ptr = sg_address(sg[i>>11]) + ((i&0x7ff)<<6);
+	ptr = buffer_end;
+	for (i = 0; i < numblocks; i++) {
+		ptr += (1 << CONTROL_SHIFT);
+		if (ptr >= buffer_end) {
+			unsigned long address;
+
+			address = i << (info->pageshift + info->blockshift);
+			result = sddr09_read_control(
+				us, address>>1,
+				min(alloc_blocks, numblocks - i),
+				buffer, 0);
+			if (result != USB_STOR_TRANSPORT_GOOD) {
+				result = -1;
+				goto done;
+			}
+			ptr = buffer;
+		}
 
 		if (i == 0 || i == 1) {
 			info->pba_to_lba[i] = UNUSABLE;
@@ -1196,7 +1210,7 @@
 			if (ptr[j] != 0)
 				goto nonz;
 		info->pba_to_lba[i] = UNUSABLE;
-		printk("sddr09: PBA %04X has no logical mapping\n", i);
+		printk("sddr09: PBA %d has no logical mapping\n", i);
 		continue;
 
 	nonz:
@@ -1209,7 +1223,7 @@
 	nonff:
 		/* normal PBAs start with six FFs */
 		if (j < 6) {
-			printk("sddr09: PBA %04X has no logical mapping: "
+			printk("sddr09: PBA %d has no logical mapping: "
 			       "reserved area = %02X%02X%02X%02X "
 			       "data status %02X block status %02X\n",
 			       i, ptr[0], ptr[1], ptr[2], ptr[3],
@@ -1219,7 +1233,7 @@
 		}
 
 		if ((ptr[6] >> 4) != 0x01) {
-			printk("sddr09: PBA %04X has invalid address field "
+			printk("sddr09: PBA %d has invalid address field "
 			       "%02X%02X/%02X%02X\n",
 			       i, ptr[6], ptr[7], ptr[11], ptr[12]);
 			info->pba_to_lba[i] = UNUSABLE;
@@ -1228,7 +1242,7 @@
 
 		/* check even parity */
 		if (parity[ptr[6] ^ ptr[7]]) {
-			printk("sddr09: Bad parity in LBA for block %04X"
+			printk("sddr09: Bad parity in LBA for block %d"
 			       " (%02X %02X)\n", i, ptr[6], ptr[7]);
 			info->pba_to_lba[i] = UNUSABLE;
 			continue;
@@ -1247,27 +1261,32 @@
 		 */
 
 		if (lba >= 1000) {
-			unsigned long address;
-
-			printk("sddr09: Bad LBA %04X for block %04X\n",
+			printk("sddr09: Bad low LBA %d for block %d\n",
 			       lba, i);
-			info->pba_to_lba[i] = UNDEF /* UNUSABLE */;
-			if (erase_bad_lba_entries) {
-				/* some cameras cannot erase a card if it has
-				   bad entries, so we supply this function */
-				address = (i << (info->pageshift + info->blockshift));
-				sddr09_erase(us, address>>1);
-			}
-			continue;
+			goto possibly_erase;
 		}
 
 		lba += 1000*(i/0x400);
 
-		if (lba<0x10 || (lba >= 0x3E0 && lba < 0x3EF))
-			US_DEBUGP("LBA %04X <-> PBA %04X\n", lba, i);
+		if (info->lba_to_pba[lba] != UNDEF) {
+			printk("sddr09: LBA %d seen for PBA %d and %d\n",
+			       lba, info->lba_to_pba[lba], i);
+			goto possibly_erase;
+		}
 
 		info->pba_to_lba[i] = lba;
 		info->lba_to_pba[lba] = i;
+		continue;
+
+	possibly_erase:
+		if (erase_bad_lba_entries) {
+			unsigned long address;
+
+			address = (i << (info->pageshift + info->blockshift));
+			sddr09_erase(us, address>>1);
+			info->pba_to_lba[i] = UNDEF;
+		} else
+			info->pba_to_lba[i] = UNUSABLE;
 	}
 
 	/*
@@ -1292,11 +1311,17 @@
 	}
 	info->lbact = lbact;
 	US_DEBUGP("Found %d LBA's\n", lbact);
+	result = 0;
 
-	for (i=0; i<alloc_blocks; i++)
-		kfree(sg_address(sg[i]));
-	kfree(sg);
-	return 0;
+ done:
+	if (result != 0) {
+		kfree(info->lba_to_pba);
+		kfree(info->pba_to_lba);
+		info->lba_to_pba = NULL;
+		info->pba_to_lba = NULL;
+	}
+	kfree(buffer);
+	return result;
 }
 
 static void
@@ -1438,6 +1463,7 @@
 		cardinfo = sddr09_get_cardinfo(us, info->flags);
 		if (!cardinfo) {
 			/* probably no media */
+		init_error:
 			sensekey = 0x02;	/* not ready */
 			sensecode = 0x3a;	/* medium not present */
 			return USB_STOR_TRANSPORT_FAILED;
@@ -1451,7 +1477,10 @@
 		info->blockmask = info->blocksize - 1;
 
 		// map initialization, must follow get_cardinfo()
-		sddr09_read_map(us);
+		if (sddr09_read_map(us)) {
+			/* probably out of memory */
+			goto init_error;
+		}
 
 		// Report capacity
 
@@ -1472,12 +1501,13 @@
 		return USB_STOR_TRANSPORT_GOOD;
 	}
 
-	if (srb->cmnd[0] == MODE_SENSE) {
+	if (srb->cmnd[0] == MODE_SENSE || srb->cmnd[0] == MODE_SENSE_10) {
 		int modepage = (srb->cmnd[2] & 0x3F);
 		int len;
 
 		/* They ask for the Read/Write error recovery page,
 		   or for all pages. Give as much as they have room for. */
+		/* %% We should check DBD %% */
 		if (modepage == 0x01 || modepage == 0x3F) {
 
 			US_DEBUGP("SDDR09: Dummy up request for "
@@ -1496,20 +1526,14 @@
 			return USB_STOR_TRANSPORT_GOOD;
 		}
 
-		return USB_STOR_TRANSPORT_ERROR;
+		sensekey = 0x05;	/* illegal request */
+		sensecode = 0x24;	/* invalid field in CDB */
+		return USB_STOR_TRANSPORT_FAILED;
 	}
 
-	if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
-
-		US_DEBUGP(
-			"SDDR09: %s medium removal. Not that I can do"
-			" anything about it...\n",
-			(srb->cmnd[4]&0x03) ? "Prevent" : "Allow");
-
+	if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL)
 		return USB_STOR_TRANSPORT_GOOD;
 
-	}
-
 	havefakesense = 0;
 
 	if (srb->cmnd[0] == READ_10) {
@@ -1542,8 +1566,10 @@
 
 	if (srb->cmnd[0] != TEST_UNIT_READY &&
 	    srb->cmnd[0] != REQUEST_SENSE) {
+		sensekey = 0x05;	/* illegal request */
+		sensecode = 0x20;	/* invalid command */
 		havefakesense = 1;
-		return USB_STOR_TRANSPORT_ERROR;
+		return USB_STOR_TRANSPORT_FAILED;
 	}
 
 	for (; srb->cmd_len<12; srb->cmd_len++)
@@ -1555,8 +1581,7 @@
 	for (i=0; i<12; i++)
 		sprintf(string+strlen(string), "%02X ", srb->cmnd[i]);
 
-	US_DEBUGP("SDDR09: Send control for command %s\n",
-		  string);
+	US_DEBUGP("SDDR09: Send control for command %s\n", string);
 
 	result = sddr09_send_scsi_command(us, srb->cmnd, 12);
 	if (result != USB_STOR_TRANSPORT_GOOD) {
diff -Nru a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c
--- a/drivers/usb/storage/sddr55.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/sddr55.c	Thu Jan  8 23:00:23 2004
@@ -25,7 +25,6 @@
  */
 
 #include "transport.h"
-#include "raw_bulk.h"
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -155,7 +154,7 @@
 		unsigned int lba,
 		unsigned int page,
 		unsigned short sectors,
-		unsigned char *content,
+		unsigned char *buffer,
 		int use_sg) {
 
 	int result = USB_STOR_TRANSPORT_GOOD;
@@ -167,17 +166,24 @@
 	unsigned long address;
 
 	unsigned short pages;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
-	int len;
+	unsigned int len, index, offset;
 
-	len = sectors * PAGESIZE;
-
-	buffer = (use_sg ? kmalloc(len, GFP_NOIO) : content);
-	if (buffer == NULL)
-		return USB_STOR_TRANSPORT_ERROR; /* out of memory */
-
-	ptr = buffer;
+	// Since we only read in one block at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	if (use_sg) {
+		len = min((unsigned int) sectors,
+				(unsigned int) info->blocksize >>
+					info->smallpageshift) * PAGESIZE;
+		buffer = kmalloc(len, GFP_NOIO);
+		if (buffer == NULL)
+			return USB_STOR_TRANSPORT_ERROR; /* out of memory */
+	}
+	index = offset = 0;
 
 	while (sectors>0) {
 
@@ -189,9 +195,9 @@
 
 		// Read as many sectors as possible in this block
 
-		pages = info->blocksize - page;
-		if (pages > (sectors << info->smallpageshift))
-			pages = (sectors << info->smallpageshift);
+		pages = min((unsigned int) sectors << info->smallpageshift,
+				info->blocksize - page);
+		len = pages << info->pageshift;
 
 		US_DEBUGP("Read %02X pages, from PBA %04X"
 			" (LBA %04X) page %02X\n",
@@ -199,7 +205,7 @@
 
 		if (pba == NOT_ALLOCATED) {
 			/* no pba for this lba, fill with zeroes */
-			memset (ptr, 0, pages << info->pageshift);
+			memset (buffer, 0, len);
 		} else {
 
 			address = (pba << info->blockshift) + page;
@@ -228,8 +234,7 @@
 
 			/* read data */
 			result = sddr55_bulk_transport(us,
-				SCSI_DATA_READ, ptr,
-				pages<<info->pageshift);
+				SCSI_DATA_READ, buffer, len);
 
 			if (result != USB_STOR_XFER_GOOD) {
 				result = USB_STOR_TRANSPORT_ERROR;
@@ -253,13 +258,18 @@
 			}
 		}
 
+		// Store the data (s-g) or update the pointer (!s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&index, &offset, TO_XFER_BUF);
+		else
+			buffer += len;
+
 		page = 0;
 		lba++;
 		sectors -= pages >> info->smallpageshift;
-		ptr += (pages << info->pageshift);
 	}
 
-	us_copy_to_sgbuf_all(buffer, len, content, use_sg);
 	result = USB_STOR_TRANSPORT_GOOD;
 
 leave:
@@ -273,7 +283,7 @@
 		unsigned int lba,
 		unsigned int page,
 		unsigned short sectors,
-		unsigned char *content,
+		unsigned char *buffer,
 		int use_sg) {
 
 	int result = USB_STOR_TRANSPORT_GOOD;
@@ -286,9 +296,8 @@
 	unsigned long address;
 
 	unsigned short pages;
-	unsigned char *buffer = NULL;
-	unsigned char *ptr;
-	int i, len;
+	int i;
+	unsigned int len, index, offset;
 
 	/* check if we are allowed to write */
 	if (info->read_only || info->force_read_only) {
@@ -296,13 +305,22 @@
 		return USB_STOR_TRANSPORT_FAILED;
 	}
 
-	len = sectors * PAGESIZE;
-
-	buffer = us_copy_from_sgbuf_all(content, len, use_sg);
-	if (buffer == NULL)
-		return USB_STOR_TRANSPORT_ERROR;
-
-	ptr = buffer;
+	// Since we only write one block at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
+	if (use_sg) {
+		len = min((unsigned int) sectors,
+				(unsigned int) info->blocksize >>
+					info->smallpageshift) * PAGESIZE;
+		buffer = kmalloc(len, GFP_NOIO);
+		if (buffer == NULL)
+			return USB_STOR_TRANSPORT_ERROR;
+	}
+	index = offset = 0;
 
 	while (sectors > 0) {
 
@@ -314,9 +332,14 @@
 
 		// Write as many sectors as possible in this block
 
-		pages = info->blocksize - page;
-		if (pages > (sectors << info->smallpageshift))
-			pages = (sectors << info->smallpageshift);
+		pages = min((unsigned int) sectors << info->smallpageshift,
+				info->blocksize - page);
+		len = pages << info->pageshift;
+
+		// Get the data from the transfer buffer (s-g)
+		if (use_sg)
+			usb_stor_access_xfer_buf(buffer, len, us->srb,
+					&index, &offset, FROM_XFER_BUF);
 
 		US_DEBUGP("Write %02X pages, to PBA %04X"
 			" (LBA %04X) page %02X\n",
@@ -400,8 +423,7 @@
 
 		/* send the data */
 		result = sddr55_bulk_transport(us,
-			SCSI_DATA_WRITE, ptr,
-			pages<<info->pageshift);
+			SCSI_DATA_WRITE, buffer, len);
 
 		if (result != USB_STOR_XFER_GOOD) {
 			US_DEBUGP("Result for send_data in write_data %d\n",
@@ -458,10 +480,12 @@
 		/* update the pba<->lba maps for new_pba */
 		info->pba_to_lba[new_pba] = lba % 1000;
 
+		// Update the transfer buffer pointer (!s-g)
+		if (!use_sg)
+			buffer += len;
 		page = 0;
 		lba++;
 		sectors -= pages >> info->smallpageshift;
-		ptr += (pages << info->pageshift);
 	}
 	result = USB_STOR_TRANSPORT_GOOD;
 
diff -Nru a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
--- a/drivers/usb/storage/shuttle_usbat.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/shuttle_usbat.c	Thu Jan  8 23:00:23 2004
@@ -40,7 +40,6 @@
  */
 
 #include "transport.h"
-#include "raw_bulk.h"
 #include "protocol.h"
 #include "usb.h"
 #include "debug.h"
@@ -529,9 +528,8 @@
 	unsigned char *buffer;
 	unsigned int len;
 	unsigned int sector;
-	struct scatterlist *sg = NULL;
-	int sg_segment = 0;
-	int sg_offset = 0;
+	unsigned int sg_segment = 0;
+	unsigned int sg_offset = 0;
 
 	US_DEBUGP("handle_read10: transfersize %d\n",
 		srb->transfersize);
@@ -570,21 +568,29 @@
 			srb->transfersize);
 	}
 
+	// Since we only read in one block at a time, we have to create
+	// a bounce buffer if the transfer uses scatter-gather.  We will
+	// move the data a piece at a time between the bounce buffer and
+	// the actual transfer buffer.  If we're not using scatter-gather,
+	// we can simply update the transfer buffer pointer to get the
+	// same effect.
+
 	len = (65535/srb->transfersize) * srb->transfersize;
 	US_DEBUGP("Max read is %d bytes\n", len);
-	buffer = kmalloc(len, GFP_NOIO);
-	if (buffer == NULL) // bloody hell!
-		return USB_STOR_TRANSPORT_FAILED;
+	len = min(len, srb->request_bufflen);
+	if (srb->use_sg) {
+		buffer = kmalloc(len, GFP_NOIO);
+		if (buffer == NULL) // bloody hell!
+			return USB_STOR_TRANSPORT_FAILED;
+	} else
+		buffer = srb->request_buffer;
 	sector = short_pack(data[7+3], data[7+2]);
 	sector <<= 16;
 	sector |= short_pack(data[7+5], data[7+4]);
 	transferred = 0;
 
-	if (srb->use_sg) {
-		sg = (struct scatterlist *)srb->request_buffer;
-		sg_segment = 0; // for keeping track of where we are in
-		sg_offset = 0;  // the scatter/gather list
-	}
+	sg_segment = 0; // for keeping track of where we are in
+	sg_offset = 0;  // the scatter/gather list
 
 	while (transferred != srb->request_bufflen) {
 
@@ -615,13 +621,12 @@
 		if (result != USB_STOR_TRANSPORT_GOOD)
 			break;
 
-		// Transfer the received data into the srb buffer
-
+		// Store the data (s-g) or update the pointer (!s-g)
 		if (srb->use_sg)
-			us_copy_to_sgbuf(buffer, len, sg,
-					 &sg_segment, &sg_offset, srb->use_sg);
+			usb_stor_access_xfer_buf(buffer, len, srb,
+					 &sg_segment, &sg_offset, TO_XFER_BUF);
 		else
-			memcpy(srb->request_buffer+transferred, buffer, len);
+			buffer += len;
 
 		// Update the amount transferred and the sector number
 
@@ -630,7 +635,8 @@
 
 	} // while transferred != srb->request_bufflen
 
-	kfree(buffer);
+	if (srb->use_sg)
+		kfree(buffer);
 	return result;
 }
 
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/transport.c	Thu Jan  8 23:00:23 2004
@@ -760,6 +760,7 @@
 int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us)
 {
 	unsigned int transfer_length = srb->request_bufflen;
+	unsigned int pipe = 0;
 	int result;
 
 	/* COMMAND STAGE */
@@ -785,7 +786,7 @@
 	/* DATA STAGE */
 	/* transfer the data payload for this command, if one exists*/
 	if (transfer_length) {
-		unsigned int pipe = srb->sc_data_direction == SCSI_DATA_READ ? 
+		pipe = srb->sc_data_direction == SCSI_DATA_READ ? 
 				us->recv_bulk_pipe : us->send_bulk_pipe;
 		result = usb_stor_bulk_transfer_sg(us, pipe,
 					srb->request_buffer, transfer_length,
@@ -813,12 +814,9 @@
 		if (srb->cmnd[0] == REQUEST_SENSE ||
 		    srb->cmnd[0] == INQUIRY)
 			return USB_STOR_TRANSPORT_GOOD;
-		else {
-			if (us->iobuf[0])
-				return USB_STOR_TRANSPORT_FAILED;
-			else
-				return USB_STOR_TRANSPORT_GOOD;
-		}
+		if (us->iobuf[0])
+			goto Failed;
+		return USB_STOR_TRANSPORT_GOOD;
 	}
 
 	/* If not UFI, we interpret the data as a result code 
@@ -835,13 +833,17 @@
 		case 0x00: 
 			return USB_STOR_TRANSPORT_GOOD;
 		case 0x01: 
-			return USB_STOR_TRANSPORT_FAILED;
-		default: 
-			return USB_STOR_TRANSPORT_ERROR;
+			goto Failed;
 	}
-
-	/* we should never get here, but if we do, we're in trouble */
 	return USB_STOR_TRANSPORT_ERROR;
+
+	/* the CBI spec requires that the bulk pipe must be cleared
+	 * following any data-in/out command failure (section 2.4.3.1.3)
+	 */
+  Failed:
+	if (pipe)
+		usb_stor_clear_halt(us, pipe);
+	return USB_STOR_TRANSPORT_FAILED;
 }
 
 /*
@@ -924,6 +926,7 @@
 	struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
 	struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
 	unsigned int transfer_length = srb->request_bufflen;
+	unsigned int residue;
 	int result;
 	int fake_sense = 0;
 
@@ -999,9 +1002,10 @@
 		return USB_STOR_TRANSPORT_ERROR;
 
 	/* check bulk status */
-	US_DEBUGP("Bulk Status S 0x%x T 0x%x R %d Stat 0x%x\n",
+	residue = le32_to_cpu(bcs->Residue);
+	US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
 			le32_to_cpu(bcs->Signature), bcs->Tag, 
-			bcs->Residue, bcs->Status);
+			residue, bcs->Status);
 	if ((bcs->Signature != cpu_to_le32(US_BULK_CS_SIGN) &&
 		    bcs->Signature != cpu_to_le32(US_BULK_CS_OLYMPUS_SIGN)) ||
 			bcs->Tag != srb->serial_number || 
@@ -1009,6 +1013,11 @@
 		US_DEBUGP("Bulk logical error\n");
 		return USB_STOR_TRANSPORT_ERROR;
 	}
+
+	/* try to compute the actual residue, based on how much data
+	 * was really transferred and what the device tells us */
+	residue = min(residue, transfer_length);
+	srb->resid = max(srb->resid, (int) residue);
 
 	/* based on the status code, we report good or bad */
 	switch (bcs->Status) {
diff -Nru a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
--- a/drivers/usb/storage/unusual_devs.h	Thu Jan  8 23:00:24 2004
+++ b/drivers/usb/storage/unusual_devs.h	Thu Jan  8 23:00:24 2004
@@ -45,6 +45,13 @@
  *
  */
 
+/* Patch submitted by Martin Berentsen <berentsen at sent5 dot uni-duisburg dot de> */
+#define US_FL_START_STOP  0x00000004   /* ignore START_STOP commands     */
+UNUSUAL_DEV(  0x0686, 0x4014, 0x0001, 0x0001, 
+		"Minolta",
+		"Dimage S414",
+		US_SC_SCSI, US_PR_BULK, NULL, US_FL_START_STOP), 
+
 UNUSUAL_DEV(  0x03ee, 0x0000, 0x0000, 0x0245, 
 		"Mitsumi",
 		"CD-R/RW Drive",
@@ -53,7 +60,7 @@
 UNUSUAL_DEV(  0x03ee, 0x6901, 0x0000, 0x0100,
 		"Mitsumi",
 		"USB FDD",
-		US_SC_UFI, US_PR_CBI, NULL,
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_SINGLE_LUN ),
 
 UNUSUAL_DEV(  0x03f0, 0x0107, 0x0200, 0x0200, 
@@ -102,6 +109,12 @@
 		"Finecam S4",
 		US_SC_8070, US_PR_CB, NULL, US_FL_FIX_INQUIRY),
 
+/* Patch submitted by Stephane Galles <stephane.galles@free.fr> */
+UNUSUAL_DEV(  0x0482, 0x0103, 0x0100, 0x0100,
+		"Kyocera",
+		"Finecam S5",
+		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
+
 /* Reported by Paul Stewart <stewart@wetlogic.net>
  * This entry is needed because the device reports Sub=ff */
 UNUSUAL_DEV(  0x04a4, 0x0004, 0x0001, 0x0001,
@@ -257,7 +270,7 @@
 UNUSUAL_DEV(  0x054c, 0x002d, 0x0100, 0x0100, 
 		"Sony",
 		"Memorystick MSAC-US1",
-		US_SC_UFI, US_PR_CB, NULL,
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_SINGLE_LUN ),
 
 /* Submitted by Klaus Mueller <k.mueller@intershop.de> */
@@ -298,6 +311,12 @@
 		US_SC_DEVICE,  US_PR_DEVICE, NULL,
 		US_FL_SINGLE_LUN),
 
+/* Fabrizio Fellini <fello@libero.it> */
+UNUSUAL_DEV(  0x0595, 0x4343, 0x0000, 0x2210,
+		"Fujifilm",
+		"Digital Camera EX-20 DSC",
+		US_SC_8070, US_PR_CBI, NULL, 0 ),
+
 UNUSUAL_DEV(  0x059f, 0xa601, 0x0200, 0x0200, 
 		"LaCie",
 		"USB Hard Disk",
@@ -354,6 +373,13 @@
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_FIX_INQUIRY ),
 
+/* Submitted Alexander Oltu <alexander@all-2.com> */
+UNUSUAL_DEV(  0x05e3, 0x0701, 0x0000, 0xffff, 
+		"", 
+		"USB TO IDE",
+		US_SC_SCSI, US_PR_BULK, NULL,
+		US_FL_MODE_XLATE ), 
+
 /* Reported by Peter Marks <peter.marks@turner.com>
  * Like the SIIG unit above, this unit needs an INQUIRY to ask for exactly
  * 36 bytes of data.  No more, no less. That is the only reason this entry
@@ -400,6 +426,28 @@
                 "DIMAGE E223",
                 US_SC_SCSI, US_PR_DEVICE, NULL, 0 ),
 
+/* Following three Minolta cameras reported by Martin Pool
+ * <mbp@sourcefrog.net>.  Originally discovered by Kedar Petankar,
+ * Matthew Geier, Mikael Lofj"ard, Marcel de Boer.
+ */
+UNUSUAL_DEV( 0x0686, 0x4006, 0x0001, 0x0001,
+             "Minolta",
+             "DiMAGE 7",
+             US_SC_SCSI, US_PR_DEVICE, NULL,
+             0 ),
+
+UNUSUAL_DEV( 0x0686, 0x400b, 0x0001, 0x0001,
+             "Minolta",
+             "DiMAGE 7i",
+             US_SC_SCSI, US_PR_DEVICE, NULL,
+             0 ),
+
+UNUSUAL_DEV( 0x0686, 0x400f, 0x0001, 0x0001,
+             "Minolta",
+             "DiMAGE 7Hi",
+             US_SC_SCSI, US_PR_DEVICE, NULL,
+             0 ),
+
 UNUSUAL_DEV(  0x0693, 0x0002, 0x0100, 0x0100, 
 		"Hagiwara",
 		"FlashGate SmartMedia",
@@ -441,6 +489,11 @@
 		"Freecom",
 		"USB-IDE",
 		US_SC_QIC, US_PR_FREECOM, freecom_init, 0),
+
+UNUSUAL_DEV(  0x07ab, 0xfc84, 0x0000, 0x9999,
+		"Freecom",
+		"FX-5/FX-50",
+		US_SC_QIC, US_PR_FREECOM, freecom_init, 0),
 #endif
 
 UNUSUAL_DEV(  0x07af, 0x0004, 0x0100, 0x0133, 
@@ -528,6 +581,14 @@
 		US_SC_SCSI, US_PR_DATAFAB, NULL,
 		US_FL_MODE_XLATE ),
 #endif
+#ifdef CONFIG_USB_STORAGE_SDDR55
+/* SM part - aeb <Andries.Brouwer@cwi.nl> */
+UNUSUAL_DEV(  0x07c4, 0xa109, 0x0000, 0xffff,
+		"Datafab Systems, Inc.",
+		"USB to CF + SM Combo (LC1)",
+		US_SC_SCSI, US_PR_SDDR55, NULL,
+		US_FL_SINGLE_LUN ),
+#endif
 
 /* Datafab KECF-USB / Sagatek DCS-CF / Simpletech Flashlink UCF-100
  * Only revision 1.13 tested (same for all of the above devices,
@@ -570,6 +631,14 @@
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_MODE_XLATE ),
 
+/*Medion 6047 Digital Camera
+Davide Andrian <_nessuno_@katamail.com>
+*/
+UNUSUAL_DEV( 0x08ca, 0x2011, 0x0001, 0x0001,
+		"3MegaCam",
+		"3MegaCam",
+		US_SC_DEVICE, US_PR_BULK, NULL,
+		US_FL_MODE_XLATE ),
 /* aeb */
 UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
 		"Feiya",
@@ -605,8 +674,8 @@
 /* Submitted by Per Winkvist <per.winkvist@uk.com> */
 UNUSUAL_DEV( 0x0a17, 0x006, 0x1000, 0x9009,
                 "Pentax",
-                "Optio S",
-                US_SC_8070, US_PR_CBI, NULL,
+                "Optio S/S4",
+                US_SC_DEVICE, US_PR_DEVICE, NULL,
                 US_FL_FIX_INQUIRY ),
 		
 #ifdef CONFIG_USB_STORAGE_ISD200
@@ -617,13 +686,6 @@
 		0 ),
 #endif
 
-/* Submitted by Antoine Mairesse <antoine.mairesse@free.fr> */
-UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300,
-		"USB",
-		"Solid state disk",
-		US_SC_DEVICE, US_PR_DEVICE, NULL,
-		US_FL_FIX_INQUIRY ),
-
 /* Submitted by Joris Struyve <joris@struyve.be> */
 UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff,
 		"Medion",
@@ -640,6 +702,13 @@
 		"Jenoptik",
 		"JD 5200 z3",
 		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
+
+/* Submitted by Antoine Mairesse <antoine.mairesse@free.fr> */
+UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300,
+		"USB",
+		"Solid state disk",
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
+		US_FL_FIX_INQUIRY ),
 		
 /* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu>
  * Tested on hardware version 1.10.
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/usb/storage/usb.c	Thu Jan  8 23:00:23 2004
@@ -234,16 +234,8 @@
  */
 
 void fill_inquiry_response(struct us_data *us, unsigned char *data,
-		unsigned int data_len) {
-
-	int i;
-	struct scatterlist *sg;
-	int len =
-		us->srb->request_bufflen > data_len ? data_len :
-		us->srb->request_bufflen;
-	int transferred;
-	int amt;
-
+		unsigned int data_len)
+{
 	if (data_len<36) // You lose.
 		return;
 
@@ -270,22 +262,7 @@
 		data[35] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice) & 0x0F);
 	}
 
-	if (us->srb->use_sg) {
-		sg = (struct scatterlist *)us->srb->request_buffer;
-		for (i=0; i<us->srb->use_sg; i++)
-			memset(sg_address(sg[i]), 0, sg[i].length);
-		for (i=0, transferred=0; 
-				i<us->srb->use_sg && transferred < len;
-				i++) {
-			amt = sg[i].length > len-transferred ? 
-					len-transferred : sg[i].length;
-			memcpy(sg_address(sg[i]), data+transferred, amt);
-			transferred -= amt;
-		}
-	} else {
-		memset(us->srb->request_buffer, 0, us->srb->request_bufflen);
-		memcpy(us->srb->request_buffer, data, len);
-	}
+	usb_stor_set_xfer_buf(data, data_len, us->srb);
 }
 
 static int usb_stor_control_thread(void * __us)
diff -Nru a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c
--- a/drivers/video/cirrusfb.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/video/cirrusfb.c	Thu Jan  8 23:00:24 2004
@@ -2528,7 +2528,7 @@
 
 	pdev = clgen_pci_dev_get (btype);
 	if (!pdev) {
-		printk (KERN_ERR " Couldn't find PCI device\n");
+		printk (KERN_INFO "cirrusfb: couldn't find Cirrus Logic PCI device\n");
 		DPRINTK ("EXIT, returning 1\n");
 		return 1;
 	}
diff -Nru a/drivers/video/fbmon.c b/drivers/video/fbmon.c
--- a/drivers/video/fbmon.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/video/fbmon.c	Thu Jan  8 23:00:24 2004
@@ -890,30 +890,6 @@
 	u32 vtotal;
 };
 
-/*
- * a simple function to get the square root of integers 
- */
-static u32 fb_sqrt(int x)
-{
-	register int op, res, one;
-
-	op = x;
-	res = 0;
-
-	one = 1 << 30;
-	while (one > op) one >>= 2;
-
-	while (one != 0) {
-		if (op >= res + one) {
-			op = op - (res + one);
-			res = res +  2 * one;
-		}
-		res /= 2;
-		one /= 4;
-	}
-	return((u32) res);
-}
-
 /**
  * fb_get_vblank - get vertical blank time
  * @hfreq: horizontal freq
@@ -1002,7 +978,7 @@
 	h_period += (M_VAL * xres * 2 * 1000)/(5 * dclk);
 	h_period *=10000; 
 
-	h_period = fb_sqrt((int) h_period);
+	h_period = int_sqrt(h_period);
 	h_period -= (100 - C_VAL) * 100;
 	h_period *= 1000; 
 	h_period /= 2 * M_VAL;
diff -Nru a/drivers/video/hgafb.c b/drivers/video/hgafb.c
--- a/drivers/video/hgafb.c	Thu Jan  8 23:00:24 2004
+++ b/drivers/video/hgafb.c	Thu Jan  8 23:00:24 2004
@@ -539,7 +539,7 @@
 int __init hgafb_init(void)
 {
 	if (! hga_card_detect()) {
-		printk(KERN_ERR "hgafb: HGA card not detected.\n");
+		printk(KERN_INFO "hgafb: HGA card not detected.\n");
 		return -EINVAL;
 	}
 
diff -Nru a/drivers/video/sis/init301.c b/drivers/video/sis/init301.c
--- a/drivers/video/sis/init301.c	Thu Jan  8 23:00:23 2004
+++ b/drivers/video/sis/init301.c	Thu Jan  8 23:00:23 2004
@@ -11712,7 +11712,7 @@
   }
 
   temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 1);
-  if(temp = 0xFFFF) return;
+  if(temp == 0xFFFF) return;
 
   index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDHIndex;
   for(i=0x14, j=0; i<=0x17; i++, j++) {
diff -Nru a/fs/Kconfig b/fs/Kconfig
--- a/fs/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/fs/Kconfig	Thu Jan  8 23:00:24 2004
@@ -246,6 +246,7 @@
 
 config JFS_FS
 	tristate "JFS filesystem support"
+	select NLS
 	help
 	  This is a port of IBM's Journaled Filesystem .  More information is
 	  available in the file Documentation/filesystems/jfs.txt.
@@ -485,6 +486,7 @@
 config JOLIET
 	bool "Microsoft Joliet CDROM extensions"
 	depends on ISO9660_FS
+	select NLS
 	help
 	  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
 	  which allows for long filenames in unicode format (unicode is the
@@ -530,6 +532,7 @@
 
 config FAT_FS
 	tristate "DOS FAT fs support"
+	select NLS
 	help
 	  If you want to use one of the FAT-based file systems (the MS-DOS,
 	  VFAT (Windows 95) and UMSDOS (used to run Linux on top of an
@@ -651,6 +654,7 @@
 
 config NTFS_FS
 	tristate "NTFS file system support"
+	select NLS
 	help
 	  NTFS is the file system of Microsoft Windows NT, 2000, XP and 2003.
 
@@ -962,6 +966,7 @@
 config BEFS_FS
 	tristate "BeOS file systemv(BeFS) support (read only) (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select NLS
 	help
 	  The BeOS File System (BeFS) is the native file system of Be, Inc's
 	  BeOS. Notable features include support for arbitrary attributes
@@ -1440,6 +1445,7 @@
 config SMB_FS
 	tristate "SMB file system support (to mount Windows shares etc.)"
 	depends on INET
+	select NLS
 	help
 	  SMB (Server Message Block) is the protocol Windows for Workgroups
 	  (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
@@ -1495,6 +1501,7 @@
 config CIFS
 	tristate "CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)(EXPERIMENTAL)"
 	depends on INET
+	select NLS
 	help
 	  This is the client VFS module for the Common Internet File System
 	  (CIFS) protocol which is the successor to the Server Message Block 
diff -Nru a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
--- a/fs/Kconfig.binfmt	Thu Jan  8 23:00:24 2004
+++ b/fs/Kconfig.binfmt	Thu Jan  8 23:00:24 2004
@@ -23,10 +23,6 @@
 	  ld.so (check the file <file:Documentation/Changes> for location and
 	  latest version).
 
-	  To compile this as a module, choose M here: the module will be called
-	  binfmt_elf. Saying M or N here is dangerous because some crucial
-	  programs on your system might be in ELF format.
-
 config BINFMT_FLAT
 	tristate "Kernel support for flat binaries"
 	depends on !MMU || SUPERH
diff -Nru a/fs/binfmt_elf.c b/fs/binfmt_elf.c
--- a/fs/binfmt_elf.c	Thu Jan  8 23:00:24 2004
+++ b/fs/binfmt_elf.c	Thu Jan  8 23:00:24 2004
@@ -82,13 +82,17 @@
 
 #define BAD_ADDR(x)	((unsigned long)(x) > TASK_SIZE)
 
-static void set_brk(unsigned long start, unsigned long end)
+static int set_brk(unsigned long start, unsigned long end)
 {
 	start = ELF_PAGEALIGN(start);
 	end = ELF_PAGEALIGN(end);
-	if (end > start)
-		do_brk(start, end - start);
+	if (end > start) {
+		unsigned long addr = do_brk(start, end - start);
+		if (BAD_ADDR(addr))
+			return addr;
+	}
 	current->mm->start_brk = current->mm->brk = end;
+	return 0;
 }
 
 
@@ -381,8 +385,11 @@
 	elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);	/* What we have mapped so far */
 
 	/* Map the last of the bss segment */
-	if (last_bss > elf_bss)
-		do_brk(elf_bss, last_bss - elf_bss);
+	if (last_bss > elf_bss) {
+		error = do_brk(elf_bss, last_bss - elf_bss);
+		if (BAD_ADDR(error))
+			goto out_close;
+	}
 
 	*interp_load_addr = load_addr;
 	error = ((unsigned long) interp_elf_ex->e_entry) + load_addr;
@@ -466,6 +473,7 @@
 	struct elfhdr interp_elf_ex;
   	struct exec interp_ex;
 	char passed_fileno[6];
+	struct files_struct *files;
 	
 	/* Get the exec-header */
 	elf_ex = *((struct elfhdr *) bprm->buf);
@@ -498,9 +506,20 @@
 	if (retval < 0)
 		goto out_free_ph;
 
+	files = current->files;		/* Refcounted so ok */
+	if(unshare_files() < 0)
+		goto out_free_ph;
+	if (files == current->files) {
+		put_files_struct(files);
+		files = NULL;
+	}
+
+	/* exec will make our files private anyway, but for the a.out
+	   loader stuff we need to do it earlier */
+
 	retval = get_unused_fd();
 	if (retval < 0)
-		goto out_free_ph;
+		goto out_free_fh;
 	get_file(bprm->file);
 	fd_install(elf_exec_fileno = retval, bprm->file);
 
@@ -631,6 +650,13 @@
 	if (retval)
 		goto out_free_dentry;
 
+	/* Discard our unneeded old files struct */
+	if (files) {
+		steal_locks(files);
+		put_files_struct(files);
+		files = NULL;
+	}
+
 	/* OK, This is the point of no return */
 	current->mm->start_data = 0;
 	current->mm->end_data = 0;
@@ -672,7 +698,12 @@
 			/* There was a PT_LOAD segment with p_memsz > p_filesz
 			   before this one. Map anonymous pages, if needed,
 			   and clear the area.  */
-			set_brk (elf_bss + load_bias, elf_brk + load_bias);
+			retval = set_brk (elf_bss + load_bias,
+					  elf_brk + load_bias);
+			if (retval) {
+				send_sig(SIGKILL, current, 0);
+				goto out_free_dentry;
+			}
 			nbyte = ELF_PAGEOFFSET(elf_bss);
 			if (nbyte) {
 				nbyte = ELF_MIN_ALIGN - nbyte;
@@ -737,6 +768,18 @@
 	start_data += load_bias;
 	end_data += load_bias;
 
+	/* Calling set_brk effectively mmaps the pages that we need
+	 * for the bss and break sections.  We must do this before
+	 * mapping in the interpreter, to make sure it doesn't wind
+	 * up getting placed where the bss needs to go.
+	 */
+	retval = set_brk(elf_bss, elf_brk);
+	if (retval) {
+		send_sig(SIGKILL, current, 0);
+		goto out_free_dentry;
+	}
+	padzero(elf_bss);
+
 	if (elf_interpreter) {
 		if (interpreter_type == INTERPRETER_AOUT)
 			elf_entry = load_aout_interp(&interp_ex,
@@ -745,19 +788,17 @@
 			elf_entry = load_elf_interp(&interp_elf_ex,
 						    interpreter,
 						    &interp_load_addr);
-
-		allow_write_access(interpreter);
-		fput(interpreter);
-		kfree(elf_interpreter);
-
 		if (BAD_ADDR(elf_entry)) {
 			printk(KERN_ERR "Unable to load interpreter\n");
-			kfree(elf_phdata);
 			send_sig(SIGSEGV, current, 0);
 			retval = -ENOEXEC; /* Nobody gets to see this, but.. */
-			goto out;
+			goto out_free_dentry;
 		}
 		reloc_func_desc = interp_load_addr;
+
+		allow_write_access(interpreter);
+		fput(interpreter);
+		kfree(elf_interpreter);
 	} else {
 		elf_entry = elf_ex.e_entry;
 	}
@@ -782,13 +823,6 @@
 	current->mm->end_data = end_data;
 	current->mm->start_stack = bprm->p;
 
-	/* Calling set_brk effectively mmaps the pages that we need
-	 * for the bss and break sections
-	 */
-	set_brk(elf_bss, elf_brk);
-
-	padzero(elf_bss);
-
 	if (current->personality & MMAP_PAGE_ZERO) {
 		/* Why this, you ask???  Well SVr4 maps page 0 as read-only,
 		   and some applications "depend" upon this behavior.
@@ -835,6 +869,11 @@
 		kfree(elf_interpreter);
 out_free_file:
 	sys_close(elf_exec_fileno);
+out_free_fh:
+	if (files) {
+		put_files_struct(current->files);
+		current->files = files;
+	}
 out_free_ph:
 	kfree(elf_phdata);
 	goto out;
diff -Nru a/fs/binfmt_som.c b/fs/binfmt_som.c
--- a/fs/binfmt_som.c	Thu Jan  8 23:00:23 2004
+++ b/fs/binfmt_som.c	Thu Jan  8 23:00:23 2004
@@ -217,7 +217,7 @@
 			(char *) hpuxhdr, size);
 	if (retval < 0)
 		goto out_free;
-
+#error "Fix security hole before enabling me"
 	retval = get_unused_fd();
 	if (retval < 0)
 		goto out_free;
diff -Nru a/fs/buffer.c b/fs/buffer.c
--- a/fs/buffer.c	Thu Jan  8 23:00:24 2004
+++ b/fs/buffer.c	Thu Jan  8 23:00:24 2004
@@ -2823,7 +2823,7 @@
 		bh = bh->b_this_page;
 	} while (bh != head);
 
-	if (!was_uptodate && PageUptodate(page))
+	if (!was_uptodate && PageUptodate(page) && !PageError(page))
 		buffer_error();
 
 	do {
diff -Nru a/fs/char_dev.c b/fs/char_dev.c
--- a/fs/char_dev.c	Thu Jan  8 23:00:23 2004
+++ b/fs/char_dev.c	Thu Jan  8 23:00:23 2004
@@ -434,7 +434,9 @@
 
 static struct kobject *base_probe(dev_t dev, int *part, void *data)
 {
-	request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));
+	if (request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+		/* Make old-style 2.4 aliases work */
+		request_module("char-major-%d", MAJOR(dev));
 	return NULL;
 }
 
diff -Nru a/fs/compat.c b/fs/compat.c
--- a/fs/compat.c	Thu Jan  8 23:00:24 2004
+++ b/fs/compat.c	Thu Jan  8 23:00:24 2004
@@ -559,3 +559,96 @@
 	return compat_sys_fcntl64(fd, cmd, arg);
 }
 
+extern asmlinkage long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx);
+
+asmlinkage long
+compat_sys_io_setup(unsigned nr_reqs, u32 *ctx32p)
+{
+	long ret;
+	aio_context_t ctx64;
+
+	mm_segment_t oldfs = get_fs();
+	if (unlikely(get_user(ctx64, ctx32p)))
+		return -EFAULT;
+
+	set_fs(KERNEL_DS);
+	ret = sys_io_setup(nr_reqs, &ctx64);
+	set_fs(oldfs);
+	/* truncating is ok because it's a user address */
+	if (!ret)
+		ret = put_user((u32) ctx64, ctx32p);
+	return ret;
+}
+
+extern asmlinkage long sys_io_getevents(aio_context_t ctx_id,
+					  long min_nr,
+					  long nr,
+					  struct io_event *events,
+					  struct timespec *timeout);
+
+asmlinkage long
+compat_sys_io_getevents(aio_context_t ctx_id,
+				 unsigned long min_nr,
+				 unsigned long nr,
+				 struct io_event *events,
+				 struct compat_timespec *timeout)
+{
+	long ret;
+	struct timespec t;
+	struct timespec *ut = NULL;
+
+	ret = -EFAULT;
+	if (unlikely(!access_ok(VERIFY_WRITE, events, 
+				nr * sizeof(struct io_event))))
+		goto out;
+	if (timeout) {
+		if (get_compat_timespec(&t, timeout))
+			goto out;
+
+		ut = compat_alloc_user_space(sizeof(*ut));
+		if (copy_to_user(ut, &t, sizeof(t)) )
+			goto out;
+	} 
+	ret = sys_io_getevents(ctx_id, min_nr, nr, events, ut);
+out:
+	return ret;
+}
+
+extern asmlinkage long sys_io_submit(aio_context_t, long, 
+				struct iocb __user **);
+
+static inline long
+copy_iocb(long nr, u32 *ptr32, u64 *ptr64)
+{
+	compat_uptr_t uptr;
+	int i;
+
+	for (i = 0; i < nr; ++i) {
+		if (get_user(uptr, ptr32 + i))
+			return -EFAULT;
+		if (put_user((u64)compat_ptr(uptr), ptr64 + i))
+			return -EFAULT;
+	}
+	return 0;
+}
+
+#define MAX_AIO_SUBMITS 	(PAGE_SIZE/sizeof(struct iocb *))
+
+asmlinkage long
+compat_sys_io_submit(aio_context_t ctx_id, int nr, u32 *iocb)
+{
+	struct iocb **iocb64; 
+	long ret;
+
+	if (unlikely(nr < 0))
+		return -EINVAL;
+
+	if (nr > MAX_AIO_SUBMITS)
+		nr = MAX_AIO_SUBMITS;
+	
+	iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64));
+	ret = copy_iocb(nr, iocb, (u64 *) iocb64);
+	if (!ret)
+		ret = sys_io_submit(ctx_id, nr, iocb64);
+	return ret;
+}
diff -Nru a/fs/compat_ioctl.c b/fs/compat_ioctl.c
--- a/fs/compat_ioctl.c	Thu Jan  8 23:00:24 2004
+++ b/fs/compat_ioctl.c	Thu Jan  8 23:00:24 2004
@@ -63,6 +63,8 @@
 #include <linux/ctype.h>
 #include <linux/ioctl32.h>
 #include <linux/ncp_fs.h>
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
 
 #include <net/sock.h>          /* siocdevprivate_ioctl */
 #include <net/bluetooth/bluetooth.h>
@@ -128,7 +130,7 @@
 	set_fs (KERNEL_DS);
 	err = sys_ioctl(fd, cmd, (unsigned long)&val);
 	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
+	if (!err && put_user(val, (u32 *)compat_ptr(arg)))
 		return -EFAULT;
 	return err;
 }
@@ -136,15 +138,16 @@
 static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	mm_segment_t old_fs = get_fs();
+	u32 *argptr = compat_ptr(arg);
 	int err;
 	unsigned long val;
 	
-	if(get_user(val, (u32 *)arg))
+	if(get_user(val, argptr))
 		return -EFAULT;
 	set_fs (KERNEL_DS);
 	err = sys_ioctl(fd, cmd, (unsigned long)&val);
 	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
+	if (!err && put_user(val, argptr))
 		return -EFAULT;
 	return err;
 }
@@ -1701,7 +1704,7 @@
 	set_fs(old_fs);
 
 	if (err >= 0)
-		err = put_user(kuid, (compat_pid_t *)arg);
+		err = put_user(kuid, (compat_uid_t *)arg);
 
 	return err;
 }
@@ -2869,6 +2872,105 @@
 
         return err;
 }
+
+/*
+ * I2C layer ioctls
+ */
+
+struct i2c_msg32 {
+	u16 addr;
+	u16 flags;
+	u16 len;
+	compat_caddr_t buf;
+};
+
+struct i2c_rdwr_ioctl_data32 {
+	compat_caddr_t msgs; /* struct i2c_msg __user *msgs */
+	u32 nmsgs;
+};
+
+struct i2c_smbus_ioctl_data32 {
+	u8 read_write;
+	u8 command;
+	u32 size;
+	compat_caddr_t data; /* union i2c_smbus_data *data */
+};
+
+static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_rdwr_ioctl_data	*tdata;
+	struct i2c_rdwr_ioctl_data32	*udata;
+	struct i2c_msg			*tmsgs;
+	struct i2c_msg32		*umsgs;
+	compat_caddr_t			datap;
+	int				nmsgs, i;
+
+	tdata = compat_alloc_user_space(sizeof(*tdata));
+	if (tdata == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
+		return -EFAULT;
+
+	udata = (struct i2c_rdwr_ioctl_data32 *)compat_ptr(arg);
+	if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
+		return -EFAULT;
+	if (__get_user(nmsgs, &udata->nmsgs) || __put_user(nmsgs, &tdata->nmsgs))
+		return -EFAULT;
+	if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
+		return -EINVAL;
+	if (__get_user(datap, &udata->msgs))
+		return -EFAULT;
+	umsgs = (struct i2c_msg32 *)compat_ptr(datap);
+	if (verify_area(VERIFY_READ, umsgs, sizeof(struct i2c_msg) * nmsgs))
+		return -EFAULT;
+
+	tmsgs = compat_alloc_user_space(sizeof(struct i2c_msg) * nmsgs);
+	if (tmsgs == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tmsgs, sizeof(struct i2c_msg) * nmsgs))
+		return -EFAULT;
+	if (__put_user(tmsgs, &tdata->msgs))
+		return -ENOMEM;
+	for (i = 0; i < nmsgs; i++) {
+		if (__copy_in_user(&tmsgs[i].addr,
+				   &umsgs[i].addr,
+				   3 * sizeof(u16)))
+			return -EFAULT;
+		if (__get_user(datap, &umsgs[i].buf) ||
+		    __put_user(compat_ptr(datap), &tmsgs[i].buf))
+			return -EFAULT;
+	}
+	return sys_ioctl(fd, cmd, (unsigned long)tdata);
+}
+
+static int do_i2c_smbus_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_smbus_ioctl_data	*tdata;
+	struct i2c_smbus_ioctl_data32	*udata;
+	compat_caddr_t			datap;
+
+	tdata = compat_alloc_user_space(sizeof(*tdata));
+	if (tdata == NULL)
+		return -ENOMEM;
+	if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
+		return -EFAULT;
+
+	udata = (struct i2c_smbus_ioctl_data32 *)compat_ptr(arg);
+	if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
+		return -EFAULT;
+
+	if (__copy_in_user(&tdata->read_write, &udata->read_write, 2 * sizeof(u8)))
+		return -EFAULT;
+	if (__copy_in_user(&tdata->size, &udata->size, 2 * sizeof(u32)))
+		return -EFAULT;
+	if (__get_user(datap, &udata->data) ||
+	    __put_user(compat_ptr(datap), &tdata->data))
+		return -EFAULT;
+
+	return sys_ioctl(fd, cmd, (unsigned long)tdata);
+}
+
+
 #undef CODE
 #endif
 
@@ -2979,7 +3081,7 @@
 HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl)
 HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl)
 /* One SMB ioctl needs translations. */
-#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_pid_t)
+#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
 HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
 HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
 HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
@@ -3027,5 +3129,10 @@
 HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb)
 HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb)
 HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal)
+/* i2c */
+HANDLE_IOCTL(I2C_FUNCS, w_long)
+HANDLE_IOCTL(I2C_RDWR, do_i2c_rdwr_ioctl)
+HANDLE_IOCTL(I2C_SMBUS, do_i2c_smbus_ioctl)
+
 #undef DECLARES
 #endif
diff -Nru a/fs/dcache.c b/fs/dcache.c
--- a/fs/dcache.c	Thu Jan  8 23:00:23 2004
+++ b/fs/dcache.c	Thu Jan  8 23:00:23 2004
@@ -639,24 +639,9 @@
 
 /*
  * This is called from kswapd when we think we need some more memory.
- *
- * We don't want the VM to steal _all_ unused dcache.  Because that leads to
- * the VM stealing all unused inodes, which shoots down recently-used
- * pagecache.  So what we do is to tell fibs to the VM about how many reapable
- * objects there are in this cache.   If the number of unused dentries is
- * less than half of the total dentry count then return zero.  The net effect
- * is that the number of unused dentries will be, at a minimum, equal to the
- * number of used ones.
- *
- * If unused_ratio is set to 5, the number of unused dentries will not fall
- * below 5* the number of used ones.
  */
 static int shrink_dcache_memory(int nr, unsigned int gfp_mask)
 {
-	int nr_used;
-	int nr_unused;
-	const int unused_ratio = 1;
-
 	if (nr) {
 		/*
 		 * Nasty deadlock avoidance.
@@ -672,11 +657,7 @@
 		if (gfp_mask & __GFP_FS)
 			prune_dcache(nr);
 	}
-	nr_unused = dentry_stat.nr_unused;
-	nr_used = dentry_stat.nr_dentry - nr_unused;
-	if (nr_unused < nr_used * unused_ratio)
-		return 0;
-	return nr_unused - nr_used * unused_ratio;
+	return dentry_stat.nr_unused;
 }
 
 #define NAME_ALLOC_LEN(len)	((len+16) & ~15)
diff -Nru a/fs/direct-io.c b/fs/direct-io.c
--- a/fs/direct-io.c	Thu Jan  8 23:00:24 2004
+++ b/fs/direct-io.c	Thu Jan  8 23:00:24 2004
@@ -947,6 +947,12 @@
 		dio_bio_submit(dio);
 
 	/*
+	 * It is possible that, we return short IO due to end of file.
+	 * In that case, we need to release all the pages we got hold on.
+	 */
+	dio_cleanup(dio);
+
+	/*
 	 * OK, all BIOs are submitted, so we can decrement bio_count to truly
 	 * reflect the number of to-be-processed BIOs.
 	 */
diff -Nru a/fs/dquot.c b/fs/dquot.c
--- a/fs/dquot.c	Thu Jan  8 23:00:24 2004
+++ b/fs/dquot.c	Thu Jan  8 23:00:24 2004
@@ -192,6 +192,8 @@
 
 struct dqstats dqstats;
 
+static void dqput(struct dquot *dquot);
+
 static inline int const hashfn(struct super_block *sb, unsigned int id, int type)
 {
 	return((((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type)) % NR_DQHASH;
@@ -339,8 +341,11 @@
 			continue;
 		if (!dquot_dirty(dquot))
 			continue;
+		atomic_inc(&dquot->dq_count);
+		dqstats.lookups++;
 		spin_unlock(&dq_list_lock);
-		sb->dq_op->sync_dquot(dquot);
+		sb->dq_op->write_dquot(dquot);
+		dqput(dquot);
 		goto restart;
 	}
 	spin_unlock(&dq_list_lock);
@@ -427,7 +432,7 @@
 	}
 	if (dquot_dirty(dquot)) {
 		spin_unlock(&dq_list_lock);
-		commit_dqblk(dquot);
+		dquot->dq_sb->dq_op->write_dquot(dquot);
 		goto we_slept;
 	}
 	atomic_dec(&dquot->dq_count);
@@ -1083,7 +1088,7 @@
 	.free_space	= dquot_free_space,
 	.free_inode	= dquot_free_inode,
 	.transfer	= dquot_transfer,
-	.sync_dquot	= commit_dqblk
+	.write_dquot	= commit_dqblk
 };
 
 /* Function used by filesystems for initializing the dquot_operations structure */
@@ -1207,9 +1212,9 @@
 	error = -EINVAL;
 	if (!fmt->qf_ops->check_quota_file(sb, type))
 		goto out_file_init;
-	/* We don't want quota on quota files */
+	/* We don't want quota and atime on quota files (deadlocks possible) */
 	dquot_drop_nolock(inode);
-	inode->i_flags |= S_NOQUOTA;
+	inode->i_flags |= S_NOQUOTA | S_NOATIME;
 
 	dqopt->ops[type] = fmt->qf_ops;
 	dqopt->info[type].dqi_format = fmt;
diff -Nru a/fs/exec.c b/fs/exec.c
--- a/fs/exec.c	Thu Jan  8 23:00:23 2004
+++ b/fs/exec.c	Thu Jan  8 23:00:23 2004
@@ -779,6 +779,7 @@
 {
 	char * name;
 	int i, ch, retval;
+	struct files_struct *files;
 
 	/*
 	 * Make sure we have a private signal table and that
@@ -789,15 +790,26 @@
 		goto out;
 
 	/*
+	 * Make sure we have private file handles. Ask the
+	 * fork helper to do the work for us and the exit
+	 * helper to do the cleanup of the old one.
+	 */
+	files = current->files;		/* refcounted so safe to hold */
+	retval = unshare_files();
+	if (retval)
+		goto out;
+	/*
 	 * Release all of the old mmap stuff
 	 */
 	retval = exec_mmap(bprm->mm);
 	if (retval)
-		goto out;
+		goto mmap_failed;
 
 	bprm->mm = NULL;		/* We're using it now */
 
 	/* This is the point of no return */
+	steal_locks(files);
+	put_files_struct(files);
 
 	current->sas_ss_sp = current->sas_ss_size = 0;
 
@@ -830,6 +842,9 @@
 
 	return 0;
 
+mmap_failed:
+	put_files_struct(current->files);
+	current->files = files;
 out:
 	return retval;
 }
@@ -1070,6 +1085,7 @@
 	struct linux_binprm bprm;
 	struct file *file;
 	int retval;
+	int i;
 
 	sched_balance_exec();
 
@@ -1138,7 +1154,11 @@
 
 out:
 	/* Something went wrong, return the inode and free the argument pages*/
-	free_arg_pages(&bprm);
+	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+		struct page * page = bprm.page[i];
+		if (page)
+			__free_page(page);
+	}
 
 	if (bprm.security)
 		security_bprm_free(&bprm);
diff -Nru a/fs/ext3/balloc.c b/fs/ext3/balloc.c
--- a/fs/ext3/balloc.c	Thu Jan  8 23:00:23 2004
+++ b/fs/ext3/balloc.c	Thu Jan  8 23:00:23 2004
@@ -517,7 +517,7 @@
 		sbi->s_resuid != current->fsuid &&
 		(sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
 		*errp = -ENOSPC;
-		return 0;
+		goto out;
 	}
 
 	/*
diff -Nru a/fs/ext3/super.c b/fs/ext3/super.c
--- a/fs/ext3/super.c	Thu Jan  8 23:00:24 2004
+++ b/fs/ext3/super.c	Thu Jan  8 23:00:24 2004
@@ -340,6 +340,7 @@
  */
 static int ext3_blkdev_put(struct block_device *bdev)
 {
+	bd_release(bdev);
 	return blkdev_put(bdev, BDEV_FS);
 }
 
@@ -1480,6 +1481,13 @@
 	if (bdev == NULL)
 		return NULL;
 
+	if (bd_claim(bdev, sb)) {
+		printk(KERN_ERR
+		        "EXT3: failed to claim external journal device.\n");
+		blkdev_put(bdev, BDEV_FS);
+		return NULL;
+	}
+
 	blocksize = sb->s_blocksize;
 	hblock = bdev_hardsect_size(bdev);
 	if (blocksize < hblock) {
@@ -1944,9 +1952,9 @@
 /* Blocks: quota info + (4 pointer blocks + 1 entry block) * (3 indirect + 1 descriptor + 1 bitmap) + superblock */
 #define EXT3_V0_QFMT_BLOCKS 27
 
-static int (*old_sync_dquot)(struct dquot *dquot);
+static int (*old_write_dquot)(struct dquot *dquot);
 
-static int ext3_sync_dquot(struct dquot *dquot)
+static int ext3_write_dquot(struct dquot *dquot)
 {
 	int nblocks;
 	int ret;
@@ -1971,7 +1979,7 @@
 		ret = PTR_ERR(handle);
 		goto out;
 	}
-	ret = old_sync_dquot(dquot);
+	ret = old_write_dquot(dquot);
 	err = ext3_journal_stop(handle);
 	if (ret == 0)
 		ret = err;
@@ -2004,8 +2012,8 @@
 		goto out1;
 #ifdef CONFIG_QUOTA
 	init_dquot_operations(&ext3_qops);
-	old_sync_dquot = ext3_qops.sync_dquot;
-	ext3_qops.sync_dquot = ext3_sync_dquot;
+	old_write_dquot = ext3_qops.write_dquot;
+	ext3_qops.write_dquot = ext3_write_dquot;
 #endif
         err = register_filesystem(&ext3_fs_type);
 	if (err)
diff -Nru a/fs/fat/file.c b/fs/fat/file.c
--- a/fs/fat/file.c	Thu Jan  8 23:00:23 2004
+++ b/fs/fat/file.c	Thu Jan  8 23:00:23 2004
@@ -20,6 +20,8 @@
 	.write		= fat_file_write,
 	.mmap		= generic_file_mmap,
 	.fsync		= file_fsync,
+	.readv		= generic_file_readv,
+	.writev		= generic_file_writev,
 	.sendfile	= generic_file_sendfile,
 };
 
diff -Nru a/fs/fat/inode.c b/fs/fat/inode.c
--- a/fs/fat/inode.c	Thu Jan  8 23:00:24 2004
+++ b/fs/fat/inode.c	Thu Jan  8 23:00:24 2004
@@ -191,9 +191,9 @@
 	int isvfat = opts->isvfat;
 
 	if (opts->fs_uid != 0)
-		seq_printf(m, ",uid=%d", opts->fs_uid);
+		seq_printf(m, ",uid=%u", opts->fs_uid);
 	if (opts->fs_gid != 0)
-		seq_printf(m, ",gid=%d", opts->fs_gid);
+		seq_printf(m, ",gid=%u", opts->fs_gid);
 	seq_printf(m, ",fmask=%04o", opts->fs_fmask);
 	seq_printf(m, ",dmask=%04o", opts->fs_dmask);
 	if (sbi->nls_disk)
@@ -765,8 +765,9 @@
 	struct buffer_head *bh;
 	struct fat_boot_sector *b;
 	struct msdos_sb_info *sbi;
-	int logical_sector_size, fat_clusters, debug, cp, first;
-	unsigned int total_sectors, rootdir_sectors;
+	u16 logical_sector_size;
+	u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors;
+	int debug, cp, first;
 	unsigned int media;
 	long error;
 	char buf[50];
@@ -831,14 +832,13 @@
 		brelse(bh);
 		goto out_invalid;
 	}
-	logical_sector_size =
-		CF_LE_W(get_unaligned((unsigned short *) &b->sector_size));
+	logical_sector_size = CF_LE_W(get_unaligned((u16 *)&b->sector_size));
 	if (!logical_sector_size
 	    || (logical_sector_size & (logical_sector_size - 1))
 	    || (logical_sector_size < 512)
 	    || (PAGE_CACHE_SIZE < logical_sector_size)) {
 		if (!silent)
-			printk(KERN_ERR "FAT: bogus logical sector size %d\n",
+			printk(KERN_ERR "FAT: bogus logical sector size %u\n",
 			       logical_sector_size);
 		brelse(bh);
 		goto out_invalid;
@@ -847,7 +847,7 @@
 	if (!sbi->sec_per_clus
 	    || (sbi->sec_per_clus & (sbi->sec_per_clus - 1))) {
 		if (!silent)
-			printk(KERN_ERR "FAT: bogus sectors per cluster %d\n",
+			printk(KERN_ERR "FAT: bogus sectors per cluster %u\n",
 			       sbi->sec_per_clus);
 		brelse(bh);
 		goto out_invalid;
@@ -855,7 +855,7 @@
 
 	if (logical_sector_size < sb->s_blocksize) {
 		printk(KERN_ERR "FAT: logical sector size too small for device"
-		       " (logical sector size = %d)\n", logical_sector_size);
+		       " (logical sector size = %u)\n", logical_sector_size);
 		brelse(bh);
 		goto out_fail;
 	}
@@ -863,7 +863,7 @@
 		brelse(bh);
 
 		if (!sb_set_blocksize(sb, logical_sector_size)) {
-			printk(KERN_ERR "FAT: unable to set blocksize %d\n",
+			printk(KERN_ERR "FAT: unable to set blocksize %u\n",
 			       logical_sector_size);
 			goto out_fail;
 		}
@@ -885,7 +885,7 @@
 	sbi->fat_length = CF_LE_W(b->fat_length);
 	sbi->root_cluster = 0;
 	sbi->free_clusters = -1;	/* Don't know yet */
-	sbi->prev_free = 0;
+	sbi->prev_free = -1;
 
 	if (!sbi->fat_length && b->fat32_length) {
 		struct fat_boot_fsinfo *fsinfo;
@@ -932,10 +932,11 @@
 	sbi->dir_per_block_bits = ffs(sbi->dir_per_block) - 1;
 
 	sbi->dir_start = sbi->fat_start + sbi->fats * sbi->fat_length;
-	sbi->dir_entries =
-		CF_LE_W(get_unaligned((unsigned short *)&b->dir_entries));
+	sbi->dir_entries = CF_LE_W(get_unaligned((u16 *)&b->dir_entries));
 	if (sbi->dir_entries & (sbi->dir_per_block - 1)) {
-		printk(KERN_ERR "FAT: bogus directroy-entries per block\n");
+		if (!silent)
+			printk(KERN_ERR "FAT: bogus directroy-entries per block"
+			       " (%u)\n", sbi->dir_entries);
 		brelse(bh);
 		goto out_invalid;
 	}
@@ -943,18 +944,27 @@
 	rootdir_sectors = sbi->dir_entries
 		* sizeof(struct msdos_dir_entry) / sb->s_blocksize;
 	sbi->data_start = sbi->dir_start + rootdir_sectors;
-	total_sectors = CF_LE_W(get_unaligned((unsigned short *)&b->sectors));
+	total_sectors = CF_LE_W(get_unaligned((u16 *)&b->sectors));
 	if (total_sectors == 0)
 		total_sectors = CF_LE_L(b->total_sect);
-	sbi->clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
+
+	total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
 
 	if (sbi->fat_bits != 32)
-		sbi->fat_bits = (sbi->clusters > MSDOS_FAT12) ? 16 : 12;
+		sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
 
 	/* check that FAT table does not overflow */
 	fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
-	if (sbi->clusters > fat_clusters - 2)
-		sbi->clusters = fat_clusters - 2;
+	total_clusters = min(total_clusters, fat_clusters - 2);
+	if (total_clusters > MAX_FAT(sb)) {
+		if (!silent)
+			printk(KERN_ERR "FAT: count of clusters too big (%u)\n",
+			       total_clusters);
+		brelse(bh);
+		goto out_invalid;
+	}
+
+	sbi->clusters = total_clusters;
 
 	brelse(bh);
 
@@ -968,6 +978,8 @@
 		/* all is as it should be */
 	} else if (media == 0xf8 && FAT_FIRST_ENT(sb, 0xfe) == first) {
 		/* bad, reported on pc9800 */
+	} else if (media == 0xf0 && FAT_FIRST_ENT(sb, 0xf8) == first) {
+		/* bad, reported with a MO disk on win95/me */
 	} else if (first == 0) {
 		/* bad, reported with a SmartMedia card */
 	} else {
@@ -1047,7 +1059,7 @@
 
 int fat_statfs(struct super_block *sb, struct kstatfs *buf)
 {
-	int free, nr;
+	int free, nr, ret;
        
 	if (MSDOS_SB(sb)->free_clusters != -1)
 		free = MSDOS_SB(sb)->free_clusters;
@@ -1057,9 +1069,14 @@
 			free = MSDOS_SB(sb)->free_clusters;
 		else {
 			free = 0;
-			for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++)
-				if (fat_access(sb, nr, -1) == FAT_ENT_FREE)
+			for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++) {
+				ret = fat_access(sb, nr, -1);
+				if (ret < 0) {
+					unlock_fat(sb);
+					return ret;
+				} else if (ret == FAT_ENT_FREE)
 					free++;
+			}
 			MSDOS_SB(sb)->free_clusters = free;
 		}
 		unlock_fat(sb);
@@ -1209,10 +1226,10 @@
 	}
 	lock_kernel();
 	if (!(bh = sb_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
-		fat_fs_panic(sb, "unable to read i-node block (i_pos %lld)",
-			     i_pos);
+		printk(KERN_ERR "FAT: unable to read inode block "
+		       "for updating (i_pos %lld)", i_pos);
 		unlock_kernel();
-		return;
+		return /* -EIO */;
 	}
 	spin_lock(&fat_inode_lock);
 	if (i_pos != MSDOS_I(inode)->i_pos) {
diff -Nru a/fs/fat/misc.c b/fs/fat/misc.c
--- a/fs/fat/misc.c	Thu Jan  8 23:00:24 2004
+++ b/fs/fat/misc.c	Thu Jan  8 23:00:24 2004
@@ -74,7 +74,7 @@
 	} else {
 		if (sbi->free_clusters != -1)
 			fsinfo->free_clusters = CF_LE_L(sbi->free_clusters);
-		if (sbi->prev_free)
+		if (sbi->prev_free != -1)
 			fsinfo->next_cluster = CF_LE_L(sbi->prev_free);
 		mark_buffer_dirty(bh);
 	}
@@ -88,7 +88,7 @@
 int fat_add_cluster(struct inode *inode)
 {
 	struct super_block *sb = inode->i_sb;
-	int count, limit, new_dclus, new_fclus, last;
+	int ret, count, limit, new_dclus, new_fclus, last;
 	int cluster_bits = MSDOS_SB(sb)->cluster_bits;
 	
 	/* 
@@ -123,7 +123,12 @@
 		new_dclus = new_dclus % limit;
 		if (new_dclus < 2)
 			new_dclus = 2;
-		if (fat_access(sb, new_dclus, -1) == FAT_ENT_FREE)
+
+		ret = fat_access(sb, new_dclus, -1);
+		if (ret < 0) {
+			unlock_fat(sb);
+			return ret;
+		} else if (ret == FAT_ENT_FREE)
 			break;
 	}
 	if (count >= MSDOS_SB(sb)->clusters) {
@@ -131,9 +136,14 @@
 		unlock_fat(sb);
 		return -ENOSPC;
 	}
-	MSDOS_SB(sb)->prev_free = new_dclus;
 
-	fat_access(sb, new_dclus, FAT_ENT_EOF);
+	ret = fat_access(sb, new_dclus, FAT_ENT_EOF);
+	if (ret < 0) {
+		unlock_fat(sb);
+		return ret;
+	}
+
+	MSDOS_SB(sb)->prev_free = new_dclus;
 	if (MSDOS_SB(sb)->free_clusters != -1)
 		MSDOS_SB(sb)->free_clusters--;
 	fat_clusters_flush(sb);
@@ -142,7 +152,9 @@
 
 	/* add new one to the last of the cluster chain */
 	if (last) {
-		fat_access(sb, last, new_dclus);
+		ret = fat_access(sb, last, new_dclus);
+		if (ret < 0)
+			return ret;
 		fat_cache_add(inode, new_fclus, new_dclus);
 	} else {
 		MSDOS_I(inode)->i_start = new_dclus;
diff -Nru a/fs/file_table.c b/fs/file_table.c
--- a/fs/file_table.c	Thu Jan  8 23:00:23 2004
+++ b/fs/file_table.c	Thu Jan  8 23:00:23 2004
@@ -183,9 +183,9 @@
 	fops_put(file->f_op);
 	if (file->f_mode & FMODE_WRITE)
 		put_write_access(inode);
+	file_kill(file);
 	file->f_dentry = NULL;
 	file->f_vfsmnt = NULL;
-	file_kill(file);
 	file_free(file);
 	dput(dentry);
 	mntput(mnt);
diff -Nru a/fs/isofs/inode.c b/fs/isofs/inode.c
--- a/fs/isofs/inode.c	Thu Jan  8 23:00:24 2004
+++ b/fs/isofs/inode.c	Thu Jan  8 23:00:24 2004
@@ -447,10 +447,7 @@
 		case Opt_sb:
 			if (match_int(&args[0], &option))
 				return 0;
-			n = option;
-			if (n > 660 * 512)
-				return 0;
-			popt->sbsector = n;
+			popt->sbsector = option;
 			break;
 		case Opt_check_r:
 			popt->check = 'r';
@@ -1463,4 +1460,5 @@
 module_init(init_iso9660_fs)
 module_exit(exit_iso9660_fs)
 MODULE_LICENSE("GPL");
-
+/* Actual filesystem name is iso9660, as requested in filesystems.c */
+MODULE_ALIAS("iso9660");
diff -Nru a/fs/jbd/commit.c b/fs/jbd/commit.c
--- a/fs/jbd/commit.c	Thu Jan  8 23:00:24 2004
+++ b/fs/jbd/commit.c	Thu Jan  8 23:00:24 2004
@@ -177,8 +177,14 @@
 		 * leave undo-committed data.
 		 */
 		if (jh->b_committed_data) {
-			kfree(jh->b_committed_data);
-			jh->b_committed_data = NULL;
+			struct buffer_head *bh = jh2bh(jh);
+
+			jbd_lock_bh_state(bh);
+			if (jh->b_committed_data) {
+				kfree(jh->b_committed_data);
+				jh->b_committed_data = NULL;
+			}
+			jbd_unlock_bh_state(bh);
 		}
 		journal_refile_buffer(journal, jh);
 	}
@@ -264,6 +270,16 @@
 				jbd_unlock_bh_state(bh);
 				journal_remove_journal_head(bh);
 				__brelse(bh);
+				if (need_resched() && commit_transaction->
+							t_sync_datalist) {
+					commit_transaction->t_sync_datalist =
+								next_jh;
+					if (bufs)
+						break;
+					spin_unlock(&journal->j_list_lock);
+					cond_resched();
+					goto write_out_data;
+				}
 			}
 		}
 		if (bufs == ARRAY_SIZE(wbuf)) {
@@ -284,8 +300,7 @@
 		cond_resched();
 		journal_brelse_array(wbuf, bufs);
 		spin_lock(&journal->j_list_lock);
-		if (bufs)
-			goto write_out_data_locked;
+		goto write_out_data_locked;
 	}
 
 	/*
diff -Nru a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c
--- a/fs/jfs/jfs_imap.c	Thu Jan  8 23:00:23 2004
+++ b/fs/jfs/jfs_imap.c	Thu Jan  8 23:00:23 2004
@@ -481,7 +481,6 @@
 	/* read the page of fixed disk inode (AIT) in raw mode */
 	mp = read_metapage(ip, address << sbi->l2nbperpage, PSIZE, 1);
 	if (mp == NULL) {
-		ip->i_sb = NULL;
 		ip->i_nlink = 1;	/* Don't want iput() deleting it */
 		iput(ip);
 		return (NULL);
@@ -494,7 +493,6 @@
 	/* copy on-disk inode to in-memory inode */
 	if ((copy_from_dinode(dp, ip)) != 0) {
 		/* handle bad return by returning NULL for ip */
-		ip->i_sb = NULL;
 		ip->i_nlink = 1;	/* Don't want iput() deleting it */
 		iput(ip);
 		/* release the page */
diff -Nru a/fs/jfs/namei.c b/fs/jfs/namei.c
--- a/fs/jfs/namei.c	Thu Jan  8 23:00:24 2004
+++ b/fs/jfs/namei.c	Thu Jan  8 23:00:24 2004
@@ -1439,14 +1439,18 @@
 struct dentry *jfs_get_parent(struct dentry *dentry)
 {
 	struct super_block *sb = dentry->d_inode->i_sb;
-	struct dentry *parent = ERR_PTR(-EACCES);
+	struct dentry *parent = ERR_PTR(-ENOENT);
 	struct inode *inode;
+	unsigned long parent_ino;
 
-	inode = iget(sb, JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
+	parent_ino =
+		le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
+	inode = iget(sb, parent_ino);
 	if (inode) {
-		if (is_bad_inode(inode))
+		if (is_bad_inode(inode)) {
 			iput(inode);
-		else {
+			parent = ERR_PTR(-EACCES);
+		} else {
 			parent = d_alloc_anon(inode);
 			if (!parent) {
 				parent = ERR_PTR(-ENOMEM);
diff -Nru a/fs/locks.c b/fs/locks.c
--- a/fs/locks.c	Thu Jan  8 23:00:24 2004
+++ b/fs/locks.c	Thu Jan  8 23:00:24 2004
@@ -1983,6 +1983,24 @@
 
 EXPORT_SYMBOL(lock_may_write);
 
+void steal_locks(fl_owner_t from)
+{
+	struct list_head *tmp;
+
+	if (from == current->files)
+		return;
+
+	lock_kernel();
+	list_for_each(tmp, &file_lock_list) {
+		struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
+		if (fl->fl_owner == from)
+			fl->fl_owner = current->files;
+	}
+	unlock_kernel();
+}
+
+EXPORT_SYMBOL(steal_locks);
+
 static int __init filelock_init(void)
 {
 	filelock_cache = kmem_cache_create("file_lock_cache",
diff -Nru a/fs/msdos/namei.c b/fs/msdos/namei.c
--- a/fs/msdos/namei.c	Thu Jan  8 23:00:24 2004
+++ b/fs/msdos/namei.c	Thu Jan  8 23:00:24 2004
@@ -244,13 +244,14 @@
 	 */
 	dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 	mark_inode_dirty(dir);
-	memcpy((*de)->name,name,MSDOS_NAME);
+
+	memcpy((*de)->name, name, MSDOS_NAME);
 	(*de)->attr = is_dir ? ATTR_DIR : ATTR_ARCH;
 	if (is_hid)
 		(*de)->attr |= ATTR_HIDDEN;
 	(*de)->start = 0;
 	(*de)->starthi = 0;
-	fat_date_unix2dos(dir->i_mtime.tv_sec,&(*de)->time,&(*de)->date);
+	fat_date_unix2dos(dir->i_mtime.tv_sec, &(*de)->time, &(*de)->date);
 	(*de)->size = 0;
 	mark_buffer_dirty(*bh);
 	return 0;
@@ -393,7 +394,6 @@
 	return res;
 
 mkdir_error:
-	printk(KERN_WARNING "msdos_mkdir: error=%d, attempting cleanup\n", res);
 	inode->i_nlink = 0;
 	inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 	dir->i_nlink--;
@@ -468,13 +468,9 @@
 			if (error)
 				goto out;
 		}
-		error = fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
-				&dotdot_de, &dotdot_i_pos);
-		if (error < 0) {
-			printk(KERN_WARNING
-				"MSDOS: %s/%s, get dotdot failed, ret=%d\n",
-				old_dentry->d_parent->d_name.name,
-				old_dentry->d_name.name, error);
+		if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
+			     &dotdot_de, &dotdot_i_pos) < 0) {
+			error = -EIO;
 			goto out;
 		}
 	}
diff -Nru a/fs/ncpfs/Kconfig b/fs/ncpfs/Kconfig
--- a/fs/ncpfs/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/fs/ncpfs/Kconfig	Thu Jan  8 23:00:23 2004
@@ -65,6 +65,7 @@
 config NCPFS_NLS
 	bool "Use Native Language Support"
 	depends on NCP_FS
+	select NLS
 	help
 	  Allows you to use codepages and I/O charsets for file name
 	  translation between the server file system and input/output. This
diff -Nru a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c
--- a/fs/ncpfs/mmap.c	Thu Jan  8 23:00:24 2004
+++ b/fs/ncpfs/mmap.c	Thu Jan  8 23:00:24 2004
@@ -26,7 +26,7 @@
  * Fill in the supplied page for mmap
  */
 static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area,
-				     unsigned long address, int write_access)
+				     unsigned long address, int *type)
 {
 	struct file *file = area->vm_file;
 	struct dentry *dentry = file->f_dentry;
@@ -85,6 +85,15 @@
 		memset(pg_addr + already_read, 0, PAGE_SIZE - already_read);
 	flush_dcache_page(page);
 	kunmap(page);
+
+	/*
+	 * If I understand ncp_read_kernel() properly, the above always
+	 * fetches from the network, here the analogue of disk.
+	 * -- wli
+	 */
+	if (type)
+		*type = VM_FAULT_MAJOR;
+	inc_page_state(pgmajfault);
 	return page;
 }
 
diff -Nru a/fs/nls/Kconfig b/fs/nls/Kconfig
--- a/fs/nls/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/fs/nls/Kconfig	Thu Jan  8 23:00:23 2004
@@ -1,24 +1,25 @@
 #
 # Native language support configuration
 #
-# smb wants NLS
-config SMB_NLS
-	bool
-	depends on SMB_FS
-	default y
 
-# msdos and Joliet want NLS
+menu "Native Language Support"
+
 config NLS
-	bool
-	depends on JOLIET || FAT_FS || NTFS_FS || NCPFS_NLS || SMB_NLS || JFS_FS || CIFS || BEFS_FS
-	default y
+	tristate "Base native language support"
+	---help---
+	  The base Native Language Support. A number of filesystems
+	  depend on it (e.g. FAT, JOLIET, NT, BEOS filesystems), as well
+	  as the ability of some filesystems to use native languages
+	  (NCP, SMB).
 
+	  If unsure, say Y.
 
-menu "Native Language Support"
-	depends on NLS
+	  To compile this code as a module, choose M here: the module
+	  will be called nls_base.
 
 config NLS_DEFAULT
 	string "Default NLS Option"
+	depends on NLS
 	default "iso8859-1"
 	---help---
 	  The default NLS used when mounting file system. Note, that this is
@@ -38,6 +39,7 @@
 
 config NLS_CODEPAGE_437
 	tristate "Codepage 437 (United States, Canada)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -50,6 +52,7 @@
 
 config NLS_CODEPAGE_737
 	tristate "Codepage 737 (Greek)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -62,6 +65,7 @@
 
 config NLS_CODEPAGE_775
 	tristate "Codepage 775 (Baltic Rim)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored
@@ -75,6 +79,7 @@
 
 config NLS_CODEPAGE_850
 	tristate "Codepage 850 (Europe)"
+	depends on NLS
 	---help---
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -91,6 +96,7 @@
 
 config NLS_CODEPAGE_852
 	tristate "Codepage 852 (Central/Eastern Europe)"
+	depends on NLS
 	---help---
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -106,6 +112,7 @@
 
 config NLS_CODEPAGE_855
 	tristate "Codepage 855 (Cyrillic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -117,6 +124,7 @@
 
 config NLS_CODEPAGE_857
 	tristate "Codepage 857 (Turkish)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -128,6 +136,7 @@
 
 config NLS_CODEPAGE_860
 	tristate "Codepage 860 (Portuguese)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -139,6 +148,7 @@
 
 config NLS_CODEPAGE_861
 	tristate "Codepage 861 (Icelandic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -150,6 +160,7 @@
 
 config NLS_CODEPAGE_862
 	tristate "Codepage 862 (Hebrew)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -161,6 +172,7 @@
 
 config NLS_CODEPAGE_863
 	tristate "Codepage 863 (Canadian French)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -173,6 +185,7 @@
 
 config NLS_CODEPAGE_864
 	tristate "Codepage 864 (Arabic)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -184,6 +197,7 @@
 
 config NLS_CODEPAGE_865
 	tristate "Codepage 865 (Norwegian, Danish)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -196,6 +210,7 @@
 
 config NLS_CODEPAGE_866
 	tristate "Codepage 866 (Cyrillic/Russian)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -208,6 +223,7 @@
 
 config NLS_CODEPAGE_869
 	tristate "Codepage 869 (Greek)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -219,6 +235,7 @@
 
 config NLS_CODEPAGE_936
 	tristate "Simplified Chinese charset (CP936, GB2312)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -231,6 +248,7 @@
 
 config NLS_CODEPAGE_950
 	tristate "Traditional Chinese charset (Big5)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -243,6 +261,7 @@
 
 config NLS_CODEPAGE_932
 	tristate "Japanese charsets (Shift-JIS, EUC-JP)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -256,6 +275,7 @@
 
 config NLS_CODEPAGE_949
 	tristate "Korean charset (CP949, EUC-KR)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -267,6 +287,7 @@
 
 config NLS_CODEPAGE_874
 	tristate "Thai charset (CP874, TIS-620)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -278,6 +299,7 @@
 
 config NLS_ISO8859_8
 	tristate "Hebrew charsets (ISO-8859-8, CP1255)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -287,6 +309,7 @@
 
 config NLS_CODEPAGE_1250
 	tristate "Windows CP1250 (Slavic/Central European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CDROMs
@@ -298,6 +321,7 @@
 
 config NLS_CODEPAGE_1251
 	tristate "Windows CP1251 (Bulgarian, Belarusian)"
+	depends on NLS
 	help
 	  The Microsoft FAT file system family can deal with filenames in
 	  native language character sets. These character sets are stored in
@@ -310,6 +334,7 @@
 
 config NLS_ISO8859_1
 	tristate "NLS ISO 8859-1  (Latin 1; Western European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -322,6 +347,7 @@
 
 config NLS_ISO8859_2
 	tristate "NLS ISO 8859-2  (Latin 2; Slavic/Central European Languages)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -333,6 +359,7 @@
 
 config NLS_ISO8859_3
 	tristate "NLS ISO 8859-3  (Latin 3; Esperanto, Galician, Maltese, Turkish)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -343,6 +370,7 @@
 
 config NLS_ISO8859_4
 	tristate "NLS ISO 8859-4  (Latin 4; old Baltic charset)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -353,6 +381,7 @@
 
 config NLS_ISO8859_5
 	tristate "NLS ISO 8859-5  (Cyrillic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -364,6 +393,7 @@
 
 config NLS_ISO8859_6
 	tristate "NLS ISO 8859-6  (Arabic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -373,6 +403,7 @@
 
 config NLS_ISO8859_7
 	tristate "NLS ISO 8859-7  (Modern Greek)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -382,6 +413,7 @@
 
 config NLS_ISO8859_9
 	tristate "NLS ISO 8859-9  (Latin 5; Turkish)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -392,6 +424,7 @@
 
 config NLS_ISO8859_13
 	tristate "NLS ISO 8859-13 (Latin 7; Baltic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -402,6 +435,7 @@
 
 config NLS_ISO8859_14
 	tristate "NLS ISO 8859-14 (Latin 8; Celtic)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -413,6 +447,7 @@
 
 config NLS_ISO8859_15
 	tristate "NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)"
+	depends on NLS
 	---help---
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -429,6 +464,7 @@
 
 config NLS_KOI8_R
 	tristate "NLS KOI8-R (Russian)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -438,6 +474,7 @@
 
 config NLS_KOI8_U
 	tristate "NLS KOI8-U/RU (Ukrainian, Belarusian)"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
@@ -447,6 +484,7 @@
 
 config NLS_UTF8
 	tristate "NLS UTF8"
+	depends on NLS
 	help
 	  If you want to display filenames with native language characters
 	  from the Microsoft FAT file system family or from JOLIET CD-ROMs
diff -Nru a/fs/nls/nls_base.c b/fs/nls/nls_base.c
--- a/fs/nls/nls_base.c	Thu Jan  8 23:00:24 2004
+++ b/fs/nls/nls_base.c	Thu Jan  8 23:00:24 2004
@@ -99,6 +99,7 @@
 			}
 		} else {
 			*op++ = *ip++;
+			n--;
 		}
 	}
 	return (op - pwcs);
@@ -480,7 +481,7 @@
 	if (default_nls != NULL)
 		return default_nls;
 	else
-               return &default_table;
+		return &default_table;
 }
 
 EXPORT_SYMBOL(register_nls);
@@ -492,3 +493,5 @@
 EXPORT_SYMBOL(utf8_mbstowcs);
 EXPORT_SYMBOL(utf8_wctomb);
 EXPORT_SYMBOL(utf8_wcstombs);
+
+MODULE_LICENSE("Dual BSD/GPL");
diff -Nru a/fs/pipe.c b/fs/pipe.c
--- a/fs/pipe.c	Thu Jan  8 23:00:24 2004
+++ b/fs/pipe.c	Thu Jan  8 23:00:24 2004
@@ -13,6 +13,7 @@
 #include <linux/fs.h>
 #include <linux/mount.h>
 #include <linux/pipe_fs_i.h>
+#include <linux/uio.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 
@@ -43,19 +44,63 @@
 	down(PIPE_SEM(*inode));
 }
 
+static inline int
+pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len)
+{
+	unsigned long copy;
+
+	while (len > 0) {
+		while (!iov->iov_len)
+			iov++;
+		copy = min_t(unsigned long, len, iov->iov_len);
+
+		if (copy_from_user(to, iov->iov_base, copy))
+			return -EFAULT;
+		to += copy;
+		len -= copy;
+		iov->iov_base += copy;
+		iov->iov_len -= copy;
+	}
+	return 0;
+}
+
+static inline int
+pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len)
+{
+	unsigned long copy;
+
+	while (len > 0) {
+		while (!iov->iov_len)
+			iov++;
+		copy = min_t(unsigned long, len, iov->iov_len);
+
+		if (copy_to_user(iov->iov_base, from, copy))
+			return -EFAULT;
+		from += copy;
+		len -= copy;
+		iov->iov_base += copy;
+		iov->iov_len -= copy;
+	}
+	return 0;
+}
+
 static ssize_t
-pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
+pipe_readv(struct file *filp, const struct iovec *_iov,
+	   unsigned long nr_segs, loff_t *ppos)
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	int do_wakeup;
 	ssize_t ret;
+	struct iovec *iov = (struct iovec *)_iov;
+	size_t total_len;
 
 	/* pread is not allowed on pipes. */
 	if (unlikely(ppos != &filp->f_pos))
 		return -ESPIPE;
-	
+
+	total_len = iov_length(iov, nr_segs);
 	/* Null read succeeds. */
-	if (unlikely(count == 0))
+	if (unlikely(total_len == 0))
 		return 0;
 
 	do_wakeup = 0;
@@ -67,12 +112,12 @@
 			char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);
 			ssize_t chars = PIPE_MAX_RCHUNK(*inode);
 
-			if (chars > count)
-				chars = count;
+			if (chars > total_len)
+				chars = total_len;
 			if (chars > size)
 				chars = size;
 
-			if (copy_to_user(buf, pipebuf, chars)) {
+			if (pipe_iov_copy_to_user(iov, pipebuf, chars)) {
 				if (!ret) ret = -EFAULT;
 				break;
 			}
@@ -81,12 +126,11 @@
 			PIPE_START(*inode) += chars;
 			PIPE_START(*inode) &= (PIPE_SIZE - 1);
 			PIPE_LEN(*inode) -= chars;
-			count -= chars;
-			buf += chars;
+			total_len -= chars;
 			do_wakeup = 1;
+			if (!total_len)
+				break;	/* common path: read succeeded */
 		}
-		if (!count)
-			break;	/* common path: read succeeded */
 		if (PIPE_LEN(*inode)) /* test for cyclic buffers */
 			continue;
 		if (!PIPE_WRITERS(*inode))
@@ -126,24 +170,35 @@
 }
 
 static ssize_t
-pipe_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
+pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
+{
+	struct iovec iov = { .iov_base = buf, .iov_len = count };
+	return pipe_readv(filp, &iov, 1, ppos);
+}
+
+static ssize_t
+pipe_writev(struct file *filp, const struct iovec *_iov,
+	    unsigned long nr_segs, loff_t *ppos)
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	ssize_t ret;
 	size_t min;
 	int do_wakeup;
+	struct iovec *iov = (struct iovec *)_iov;
+	size_t total_len;
 
 	/* pwrite is not allowed on pipes. */
 	if (unlikely(ppos != &filp->f_pos))
 		return -ESPIPE;
-	
+
+	total_len = iov_length(iov, nr_segs);
 	/* Null write succeeds. */
-	if (unlikely(count == 0))
+	if (unlikely(total_len == 0))
 		return 0;
 
 	do_wakeup = 0;
 	ret = 0;
-	min = count;
+	min = total_len;
 	if (min > PIPE_BUF)
 		min = 1;
 	down(PIPE_SEM(*inode));
@@ -164,23 +219,22 @@
 			 * syscall merging.
 			 */
 			do_wakeup = 1;
-			if (chars > count)
-				chars = count;
+			if (chars > total_len)
+				chars = total_len;
 			if (chars > free)
 				chars = free;
 
-			if (copy_from_user(pipebuf, buf, chars)) {
+			if (pipe_iov_copy_from_user(pipebuf, iov, chars)) {
 				if (!ret) ret = -EFAULT;
 				break;
 			}
-
 			ret += chars;
+
 			PIPE_LEN(*inode) += chars;
-			count -= chars;
-			buf += chars;
+			total_len -= chars;
+			if (!total_len)
+				break;
 		}
-		if (!count)
-			break;
 		if (PIPE_FREE(*inode) && ret) {
 			/* handle cyclic data buffers */
 			min = 1;
@@ -214,6 +268,14 @@
 }
 
 static ssize_t
+pipe_write(struct file *filp, const char __user *buf,
+	   size_t count, loff_t *ppos)
+{
+	struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
+	return pipe_writev(filp, &iov, 1, ppos);
+}
+
+static ssize_t
 bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
 {
 	return -EBADF;
@@ -405,6 +467,7 @@
 struct file_operations read_fifo_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= bad_pipe_w,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
@@ -417,6 +480,7 @@
 	.llseek		= no_llseek,
 	.read		= bad_pipe_r,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_write_open,
@@ -427,7 +491,9 @@
 struct file_operations rdwr_fifo_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= fifo_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_rdwr_open,
@@ -438,6 +504,7 @@
 struct file_operations read_pipe_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= bad_pipe_w,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
@@ -450,6 +517,7 @@
 	.llseek		= no_llseek,
 	.read		= bad_pipe_r,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_write_open,
@@ -460,7 +528,9 @@
 struct file_operations rdwr_pipe_fops = {
 	.llseek		= no_llseek,
 	.read		= pipe_read,
+	.readv		= pipe_readv,
 	.write		= pipe_write,
+	.writev		= pipe_writev,
 	.poll		= pipe_poll,
 	.ioctl		= pipe_ioctl,
 	.open		= pipe_rdwr_open,
diff -Nru a/fs/proc/base.c b/fs/proc/base.c
--- a/fs/proc/base.c	Thu Jan  8 23:00:24 2004
+++ b/fs/proc/base.c	Thu Jan  8 23:00:24 2004
@@ -277,15 +277,50 @@
 	return result;
 }
 
+#define MAY_PTRACE(task) \
+	(task == current || \
+	(task->parent == current && \
+	(task->ptrace & PT_PTRACED) &&  task->state == TASK_STOPPED && \
+	 security_ptrace(current,task) == 0))
+
+static int may_ptrace_attach(struct task_struct *task)
+{
+	int retval = 0;
+
+	task_lock(task);
+
+	if (!task->mm)
+		goto out;
+	if (((current->uid != task->euid) ||
+	     (current->uid != task->suid) ||
+	     (current->uid != task->uid) ||
+	     (current->gid != task->egid) ||
+	     (current->gid != task->sgid) ||
+	     (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
+		goto out;
+	rmb();
+	if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
+		goto out;
+	if (security_ptrace(current, task))
+		goto out;
+
+	retval = 1;
+out:
+	task_unlock(task);
+	return retval;
+}
+
 static int proc_pid_environ(struct task_struct *task, char * buffer)
 {
 	int res = 0;
 	struct mm_struct *mm = get_task_mm(task);
 	if (mm) {
-		int len = mm->env_end - mm->env_start;
+		unsigned int len = mm->env_end - mm->env_start;
 		if (len > PAGE_SIZE)
 			len = PAGE_SIZE;
 		res = access_process_vm(task, mm->env_start, buffer, len, 0);
+		if (!may_ptrace_attach(task))
+			res = -ESRCH;
 		mmput(mm);
 	}
 	return res;
@@ -294,7 +329,7 @@
 static int proc_pid_cmdline(struct task_struct *task, char * buffer)
 {
 	int res = 0;
-	int len;
+	unsigned int len;
 	struct mm_struct *mm = get_task_mm(task);
 	if (!mm)
 		goto out;
@@ -521,10 +556,6 @@
 	.read		= proc_info_read,
 };
 
-#define MAY_PTRACE(p) \
-(p==current||(p->parent==current&&(p->ptrace & PT_PTRACED)&&p->state==TASK_STOPPED&&security_ptrace(current,p)==0))
-
-
 static int mem_open(struct inode* inode, struct file* file)
 {
 	file->private_data = (void*)((long)current->self_exec_id);
@@ -540,7 +571,7 @@
 	int ret = -ESRCH;
 	struct mm_struct *mm;
 
-	if (!MAY_PTRACE(task))
+	if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
 		goto out;
 
 	ret = -ENOMEM;
@@ -566,7 +597,7 @@
 
 		this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
 		retval = access_process_vm(task, src, page, this_len, 0);
-		if (!retval) {
+		if (!retval || !MAY_PTRACE(task) || !may_ptrace_attach(task)) {
 			if (!ret)
 				ret = -EIO;
 			break;
@@ -604,7 +635,7 @@
 	struct task_struct *task = proc_task(file->f_dentry->d_inode);
 	unsigned long dst = *ppos;
 
-	if (!MAY_PTRACE(task))
+	if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
 		return -ESRCH;
 
 	page = (char *)__get_free_page(GFP_USER);
@@ -1524,6 +1555,7 @@
 	struct inode *inode;
 	struct proc_inode *ei;
 	unsigned tgid;
+	int died;
 
 	if (dentry->d_name.len == 4 && !memcmp(dentry->d_name.name,"self",4)) {
 		inode = new_inode(dir->i_sb);
@@ -1567,12 +1599,21 @@
 
 	dentry->d_op = &pid_base_dentry_operations;
 
+	died = 0;
+	d_add(dentry, inode);
 	spin_lock(&task->proc_lock);
 	task->proc_dentry = dentry;
-	d_add(dentry, inode);
+	if (!pid_alive(task)) {
+		dentry = proc_pid_unhash(task);
+		died = 1;
+	}
 	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
+	if (died) {
+		proc_pid_flush(dentry);
+		goto out;
+	}
 	return NULL;
 out:
 	return ERR_PTR(-ENOENT);
@@ -1612,10 +1653,7 @@
 
 	dentry->d_op = &pid_base_dentry_operations;
 
-	spin_lock(&task->proc_lock);
-	task->proc_dentry = dentry;
 	d_add(dentry, inode);
-	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
 	return NULL;
diff -Nru a/fs/proc/generic.c b/fs/proc/generic.c
--- a/fs/proc/generic.c	Thu Jan  8 23:00:24 2004
+++ b/fs/proc/generic.c	Thu Jan  8 23:00:24 2004
@@ -567,12 +567,12 @@
 	return ent;
 }
 
-struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)
+struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
+		struct proc_dir_entry *parent)
 {
 	struct proc_dir_entry *ent;
 
-	ent = proc_create(&parent,name,
-			  (S_IFDIR | S_IRUGO | S_IXUGO),2);
+	ent = proc_create(&parent, name, S_IFDIR | mode, 2);
 	if (ent) {
 		ent->proc_fops = &proc_dir_operations;
 		ent->proc_iops = &proc_dir_inode_operations;
@@ -583,6 +583,12 @@
 		}
 	}
 	return ent;
+}
+
+struct proc_dir_entry *proc_mkdir(const char *name,
+		struct proc_dir_entry *parent)
+{
+	return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent);
 }
 
 struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
diff -Nru a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
--- a/fs/proc/proc_misc.c	Thu Jan  8 23:00:23 2004
+++ b/fs/proc/proc_misc.c	Thu Jan  8 23:00:23 2004
@@ -473,30 +473,46 @@
 	return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
-extern int show_interrupts(struct seq_file *p, void *v);
-static int interrupts_open(struct inode *inode, struct file *file)
+/*
+ * /proc/interrupts
+ */
+static void *int_seq_start(struct seq_file *f, loff_t *pos)
 {
-	unsigned size = 4096 * (1 + num_online_cpus() / 8);
-	char *buf = kmalloc(size, GFP_KERNEL);
-	struct seq_file *m;
-	int res;
-
-	if (!buf)
-		return -ENOMEM;
-	res = single_open(file, show_interrupts, NULL);
-	if (!res) {
-		m = file->private_data;
-		m->buf = buf;
-		m->size = size;
-	} else
-		kfree(buf);
-	return res;
+	return (*pos <= NR_IRQS) ? pos : NULL;
 }
+
+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+	(*pos)++;
+	if (*pos > NR_IRQS)
+		return NULL;
+	return pos;
+}
+
+static void int_seq_stop(struct seq_file *f, void *v)
+{
+	/* Nothing to do */
+}
+
+
+extern int show_interrupts(struct seq_file *f, void *v); /* In arch code */
+static struct seq_operations int_seq_ops = {
+	.start = int_seq_start,
+	.next  = int_seq_next,
+	.stop  = int_seq_stop,
+	.show  = show_interrupts
+};
+
+int interrupts_open(struct inode *inode, struct file *filp)
+{
+	return seq_open(filp, &int_seq_ops);
+}
+
 static struct file_operations proc_interrupts_operations = {
 	.open		= interrupts_open,
 	.read		= seq_read,
 	.llseek		= seq_lseek,
-	.release	= single_release,
+	.release	= seq_release,
 };
 
 static int filesystems_read_proc(char *page, char **start, off_t off,
diff -Nru a/fs/proc/proc_tty.c b/fs/proc/proc_tty.c
--- a/fs/proc/proc_tty.c	Thu Jan  8 23:00:23 2004
+++ b/fs/proc/proc_tty.c	Thu Jan  8 23:00:23 2004
@@ -229,7 +229,13 @@
 	if (!proc_mkdir("tty", 0))
 		return;
 	proc_tty_ldisc = proc_mkdir("tty/ldisc", 0);
-	proc_tty_driver = proc_mkdir("tty/driver", 0);
+	/*
+	 * /proc/tty/driver/serial reveals the exact character counts for
+	 * serial links which is just too easy to abuse for inferring
+	 * password lengths and inter-keystroke timings during password
+	 * entry.
+	 */
+	proc_tty_driver = proc_mkdir_mode("tty/driver", S_IRUSR | S_IXUSR, 0);
 
 	create_proc_read_entry("tty/ldiscs", 0, 0, tty_ldiscs_read_proc,NULL);
 	entry = create_proc_entry("tty/drivers", 0, NULL);
diff -Nru a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
--- a/fs/proc/task_mmu.c	Thu Jan  8 23:00:23 2004
+++ b/fs/proc/task_mmu.c	Thu Jan  8 23:00:23 2004
@@ -1,6 +1,7 @@
 #include <linux/mm.h>
 #include <linux/hugetlb.h>
 #include <linux/seq_file.h>
+#include <asm/elf.h>
 #include <asm/uaccess.h>
 
 char *task_mem(struct mm_struct *mm, char *buffer)
@@ -75,6 +76,22 @@
 	return size;
 }
 
+#ifdef AT_SYSINFO_EHDR
+
+static struct vm_area_struct gate_vmarea = {
+	/* Do _not_ mark this area as readable, cuz not the entire range may be readable
+	   (e.g., due to execute-only pages or holes) and the tools that read
+	   /proc/PID/maps should read the interesting bits from the gate-DSO file
+	   instead.  */
+	.vm_start = FIXADDR_USER_START,
+	.vm_end = FIXADDR_USER_END
+};
+
+# define gate_map()	&gate_vmarea
+#else
+# define gate_map()	NULL
+#endif
+
 static int show_map(struct seq_file *m, void *v)
 {
 	struct vm_area_struct *map = v;
@@ -105,7 +122,7 @@
 		if (len < 1)
 			len = 1;
 		seq_printf(m, "%*c", len, ' ');
-		seq_path(m, file->f_vfsmnt, file->f_dentry, " \t\n\\");
+		seq_path(m, file->f_vfsmnt, file->f_dentry, "");
 	}
 	seq_putc(m, '\n');
 	return 0;
@@ -128,6 +145,8 @@
 	if (!map) {
 		up_read(&mm->mmap_sem);
 		mmput(mm);
+		if (l == -1)
+			map = gate_map();
 	}
 	return map;
 }
@@ -135,7 +154,7 @@
 static void m_stop(struct seq_file *m, void *v)
 {
 	struct vm_area_struct *map = v;
-	if (map) {
+	if (map && map != gate_map()) {
 		struct mm_struct *mm = map->vm_mm;
 		up_read(&mm->mmap_sem);
 		mmput(mm);
@@ -149,6 +168,8 @@
 	if (map->vm_next)
 		return map->vm_next;
 	m_stop(m, v);
+	if (map != gate_map())
+		return gate_map();
 	return NULL;
 }
 
diff -Nru a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
--- a/fs/reiserfs/journal.c	Thu Jan  8 23:00:24 2004
+++ b/fs/reiserfs/journal.c	Thu Jan  8 23:00:24 2004
@@ -1967,7 +1967,7 @@
 /*
 ** must be called once on fs mount.  calls journal_read for you
 */
-int journal_init(struct super_block *p_s_sb, const char * j_dev_name, int old_format) {
+int journal_init(struct super_block *p_s_sb, const char * j_dev_name, int old_format, unsigned int commit_max_age) {
     int num_cnodes = SB_ONDISK_JOURNAL_SIZE(p_s_sb) * 2 ;
     struct buffer_head *bhjh;
     struct reiserfs_super_block * rs;
@@ -2032,7 +2032,11 @@
      
   SB_JOURNAL_TRANS_MAX(p_s_sb)      = le32_to_cpu (jh->jh_journal.jp_journal_trans_max);
   SB_JOURNAL_MAX_BATCH(p_s_sb)      = le32_to_cpu (jh->jh_journal.jp_journal_max_batch);
+  if (commit_max_age != 0) {
+	  SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = commit_max_age;
+  } else {
   SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = le32_to_cpu (jh->jh_journal.jp_journal_max_commit_age);
+  }
   SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)  = JOURNAL_MAX_TRANS_AGE;
 
   if (SB_JOURNAL_TRANS_MAX(p_s_sb)) {
diff -Nru a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c
--- a/fs/reiserfs/namei.c	Thu Jan  8 23:00:24 2004
+++ b/fs/reiserfs/namei.c	Thu Jan  8 23:00:24 2004
@@ -1088,11 +1088,16 @@
     int jbegin_count ; 
     umode_t old_inode_mode;
     unsigned long savelink = 1;
+    struct timespec ctime;
 
-    /* two balancings: old name removal, new name insertion or "save" link,
-       stat data updates: old directory and new directory and maybe block
-       containing ".." of renamed directory */
-    jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 3;
+    /* three balancings: (1) old name removal, (2) new name insertion
+       and (3) maybe "save" link insertion
+       stat data updates: (1) old directory,
+       (2) new directory and (3) maybe old object stat data (when it is
+       directory) and (4) maybe stat data of object to which new entry
+       pointed initially and (5) maybe block containing ".." of
+       renamed directory */
+    jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 5;
 
     old_inode = old_dentry->d_inode;
     new_dentry_inode = new_dentry->d_inode;
@@ -1255,8 +1260,12 @@
 
     mark_de_hidden (old_de.de_deh + old_de.de_entry_num);
     journal_mark_dirty (&th, old_dir->i_sb, old_de.de_bh);
-    old_dir->i_ctime = old_dir->i_mtime = 
-    new_dir->i_ctime = new_dir->i_mtime = CURRENT_TIME;
+    ctime = CURRENT_TIME;
+    old_dir->i_ctime = old_dir->i_mtime = ctime;
+    new_dir->i_ctime = new_dir->i_mtime = ctime;
+    /* thanks to Alex Adriaanse <alex_a@caltech.edu> for patch which adds ctime update of
+       renamed object */
+    old_inode->i_ctime = ctime;
 
     if (new_dentry_inode) {
 	// adjust link number of the victim
@@ -1265,7 +1274,7 @@
 	} else {
 	    new_dentry_inode->i_nlink--;
 	}
-	new_dentry_inode->i_ctime = new_dir->i_ctime;
+	new_dentry_inode->i_ctime = ctime;
 	savelink = new_dentry_inode->i_nlink;
     }
 
@@ -1298,6 +1307,7 @@
 
     reiserfs_update_sd (&th, old_dir);
     reiserfs_update_sd (&th, new_dir);
+    reiserfs_update_sd (&th, old_inode);
 
     if (new_dentry_inode) {
 	if (savelink == 0)
diff -Nru a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c
--- a/fs/reiserfs/procfs.c	Thu Jan  8 23:00:23 2004
+++ b/fs/reiserfs/procfs.c	Thu Jan  8 23:00:23 2004
@@ -401,7 +401,7 @@
                         DJP( jp_journal_trans_max ),
                         DJP( jp_journal_magic ),
                         DJP( jp_journal_max_batch ),
-                        DJP( jp_journal_max_commit_age ),
+                        SB_JOURNAL_MAX_COMMIT_AGE(sb),
                         DJP( jp_journal_max_trans_age ),
 
 			JF( j_1st_reserved_block ),			
diff -Nru a/fs/reiserfs/super.c b/fs/reiserfs/super.c
--- a/fs/reiserfs/super.c	Thu Jan  8 23:00:24 2004
+++ b/fs/reiserfs/super.c	Thu Jan  8 23:00:24 2004
@@ -645,7 +645,8 @@
 				      collection of bitflags defining what
 				      mount options were selected. */
 				   unsigned long * blocks, /* strtol-ed from NNN of resize=NNN */
-				   char ** jdev_name)
+				   char ** jdev_name,
+				   unsigned int * commit_max_age)
 {
     int c;
     char * arg = NULL;
@@ -662,6 +663,7 @@
 	{"resize", 'r', 0, 0, 0},
 	{"jdev", 'j', 0, 0, 0},
 	{"nolargeio", 'w', 0, 0, 0},
+	{"commit", 'c', 0, 0, 0},
 	{NULL, 0, 0, 0, 0}
     };
 	
@@ -690,6 +692,19 @@
 	    }
 	}
 
+	if ( c == 'c' ) {
+		char *p = 0;
+		int val = simple_strtoul (arg, &p, 0);
+		/* commit=NNN (time in seconds) */
+		if ( *p != '\0' || val == 0) {
+			printk ("reiserfs_parse_options: bad value %s\n", arg);
+			return 0;
+		}
+		if ( val > 0 ) {
+			*commit_max_age = val;
+		}
+	}
+
 	if ( c == 'w' ) {
 		char *p=0;
 		int val = simple_strtoul (arg, &p, 0);
@@ -743,10 +758,11 @@
   unsigned long blocks;
   unsigned long mount_options = REISERFS_SB(s)->s_mount_opt;
   unsigned long safe_mask = 0;
+  unsigned int commit_max_age = 0;
 
   rs = SB_DISK_SUPER_BLOCK (s);
 
-  if (!reiserfs_parse_options(s, arg, &mount_options, &blocks, NULL))
+  if (!reiserfs_parse_options(s, arg, &mount_options, &blocks, NULL, &commit_max_age))
     return -EINVAL;
   
   handle_attrs(s);
@@ -764,6 +780,10 @@
    * the bits we're not allowed to change here */
   REISERFS_SB(s)->s_mount_opt = (REISERFS_SB(s)->s_mount_opt & ~safe_mask) |  (mount_options & safe_mask);
 
+  if(commit_max_age != 0) {
+	  SB_JOURNAL_MAX_COMMIT_AGE(s) = commit_max_age;
+  }
+
   if(blocks) {
     int rc = reiserfs_resize(s, blocks);
     if (rc != 0)
@@ -1201,11 +1221,15 @@
     if (func == r5_hash)
 	return R5_HASH;
 
-    BUG() ; // should never happen 
+    BUG() ; // should never happen
 
     return 0;
 }
 
+#define SPRINTK(silent, ...)			\
+	if (!(silent))				\
+		printk(__VA_ARGS__)
+
 static int reiserfs_fill_super (struct super_block * s, void * data, int silent)
 {
     struct inode *root_inode;
@@ -1213,6 +1237,7 @@
     struct reiserfs_transaction_handle th ;
     int old_format = 0;
     unsigned long blocks;
+	unsigned int commit_max_age = 0;
     int jinit_done = 0 ;
     struct reiserfs_iget_args args ;
     struct reiserfs_super_block * rs;
@@ -1237,58 +1262,58 @@
     REISERFS_SB(s)->s_alloc_options.preallocsize = 9;
 
     jdev_name = NULL;
-    if (reiserfs_parse_options (s, (char *) data, &(sbi->s_mount_opt), &blocks, &jdev_name) == 0) {
+    if (reiserfs_parse_options (s, (char *) data, &(sbi->s_mount_opt), &blocks, &jdev_name, &commit_max_age) == 0) {
 	goto error;
     }
 
     if (blocks) {
-  	printk("jmacd-7: reiserfs_fill_super: resize option for remount only\n");
+	SPRINTK(silent, "jmacd-7: reiserfs_fill_super: resize option for remount only\n");
 	goto error;
     }	
 
     /* try old format (undistributed bitmap, super block in 8-th 1k block of a device) */
-    if (!read_super_block (s, REISERFS_OLD_DISK_OFFSET_IN_BYTES)) 
+    if (!read_super_block (s, REISERFS_OLD_DISK_OFFSET_IN_BYTES))
       old_format = 1;
     /* try new format (64-th 1k block), which can contain reiserfs super block */
     else if (read_super_block (s, REISERFS_DISK_OFFSET_IN_BYTES)) {
-      printk("sh-2021: reiserfs_fill_super: can not find reiserfs on %s\n", reiserfs_bdevname (s));
-      goto error;    
+      SPRINTK(silent, "sh-2021: reiserfs_fill_super: can not find reiserfs on %s\n", reiserfs_bdevname (s));
+      goto error;
     }
 
     rs = SB_DISK_SUPER_BLOCK (s);
     /* Let's do basic sanity check to verify that underlying device is not
        smaller than the filesystem. If the check fails then abort and scream,
        because bad stuff will happen otherwise. */
-    if ( s->s_bdev && s->s_bdev->bd_inode && i_size_read(s->s_bdev->bd_inode) < sb_block_count(rs)*sb_blocksize(rs) ) {
-	printk("Filesystem on %s cannot be mounted because it is bigger than the device\n", reiserfs_bdevname(s));
-	printk("You may need to run fsck or increase size of your LVM partition\n");
-	printk("Or may be you forgot to reboot after fdisk when it told you to\n");
+    if ( s->s_bdev && s->s_bdev->bd_inode && i_size_read(s->s_bdev->bd_inode) < sb_block_count(rs)*sb_blocksize(rs)) {
+	SPRINTK(silent, "Filesystem on %s cannot be mounted because it is bigger than the device\n", reiserfs_bdevname(s));
+	SPRINTK(silent, "You may need to run fsck or increase size of your LVM partition\n");
+	SPRINTK(silent, "Or may be you forgot to reboot after fdisk when it told you to\n");
 	goto error;
     }
 
     sbi->s_mount_state = SB_REISERFS_STATE(s);
     sbi->s_mount_state = REISERFS_VALID_FS ;
 
-    if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) { 
-	printk ("jmacd-8: reiserfs_fill_super: unable to read bitmap\n");
+    if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) {
+	SPRINTK(silent, "jmacd-8: reiserfs_fill_super: unable to read bitmap\n");
 	goto error;
     }
 #ifdef CONFIG_REISERFS_CHECK
-    printk("reiserfs:warning: CONFIG_REISERFS_CHECK is set ON\n");
-    printk("reiserfs:warning: - it is slow mode for debugging.\n");
+    SPRINTK(silent, "reiserfs:warning: CONFIG_REISERFS_CHECK is set ON\n");
+    SPRINTK(silent, "reiserfs:warning: - it is slow mode for debugging.\n");
 #endif
 
     // set_device_ro(s->s_dev, 1) ;
-    if( journal_init(s, jdev_name, old_format) ) {
-	printk("sh-2022: reiserfs_fill_super: unable to initialize journal space\n") ;
+    if( journal_init(s, jdev_name, old_format, commit_max_age) ) {
+	SPRINTK(silent, "sh-2022: reiserfs_fill_super: unable to initialize journal space\n") ;
 	goto error ;
     } else {
 	jinit_done = 1 ; /* once this is set, journal_release must be called
-			 ** if we error out of the mount 
+			 ** if we error out of the mount
 			 */
     }
     if (reread_meta_blocks(s)) {
-	printk("jmacd-9: reiserfs_fill_super: unable to reread meta blocks after journal init\n") ;
+	SPRINTK(silent, "jmacd-9: reiserfs_fill_super: unable to reread meta blocks after journal init\n") ;
 	goto error ;
     }
 
@@ -1296,14 +1321,14 @@
 	goto error;
 
     if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) {
-        printk("clm-7000: Detected readonly device, marking FS readonly\n") ;
+        SPRINTK(silent, "clm-7000: Detected readonly device, marking FS readonly\n") ;
 	s->s_flags |= MS_RDONLY ;
     }
     args.objectid = REISERFS_ROOT_OBJECTID ;
     args.dirid = REISERFS_ROOT_PARENT_OBJECTID ;
     root_inode = iget5_locked (s, REISERFS_ROOT_OBJECTID, reiserfs_find_actor, reiserfs_init_locked_inode, (void *)(&args));
     if (!root_inode) {
-	printk ("jmacd-10: reiserfs_fill_super: get root inode failed\n");
+	SPRINTK(silent, "jmacd-10: reiserfs_fill_super: get root inode failed\n");
 	goto error;
     }
 
@@ -1341,22 +1366,23 @@
 	
 	if (old_format_only(s)) {
 	  /* filesystem of format 3.5 either with standard or non-standard
-	     journal */       
+	     journal */
 	  if (convert_reiserfs (s)) {
-	    /* and -o conv is given */ 
-	    reiserfs_warning ("reiserfs: converting 3.5 filesystem to the 3.6 format\n") ;
-	    
+	    /* and -o conv is given */
+	    if(!silent)
+	      reiserfs_warning ("reiserfs: converting 3.5 filesystem to the 3.6 format\n") ;
+
 	    if (is_reiserfs_3_5 (rs))
 	      /* put magic string of 3.6 format. 2.2 will not be able to
 		 mount this filesystem anymore */
-	      memcpy (rs->s_v1.s_magic, reiserfs_3_6_magic_string, 
+	      memcpy (rs->s_v1.s_magic, reiserfs_3_6_magic_string,
 		      sizeof (reiserfs_3_6_magic_string));
-	    
+
 	    set_sb_version(rs,REISERFS_VERSION_2);
 	    reiserfs_convert_objectid_map_v1(s) ;
 	    set_bit(REISERFS_3_6, &(sbi->s_properties));
 	    clear_bit(REISERFS_3_5, &(sbi->s_properties));
-	  } else {
+	  } else if (!silent){
 	    reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
 	  }
 	}
@@ -1369,7 +1395,7 @@
 
 	s->s_dirt = 0;
     } else {
-	if ( old_format_only(s) ) {
+	if ( old_format_only(s) && !silent) {
 	    reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
 	}
     }
diff -Nru a/fs/stat.c b/fs/stat.c
--- a/fs/stat.c	Thu Jan  8 23:00:23 2004
+++ b/fs/stat.c	Thu Jan  8 23:00:23 2004
@@ -106,7 +106,7 @@
 EXPORT_SYMBOL(vfs_fstat);
 
 #if !defined(__alpha__) && !defined(__sparc__) && !defined(__ia64__) \
-  && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) && !defined(__x86_64__) \
+  && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) \
   && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__)
 
 /*
diff -Nru a/fs/sysfs/dir.c b/fs/sysfs/dir.c
--- a/fs/sysfs/dir.c	Thu Jan  8 23:00:23 2004
+++ b/fs/sysfs/dir.c	Thu Jan  8 23:00:23 2004
@@ -83,7 +83,8 @@
 	struct dentry * parent = dget(d->d_parent);
 	down(&parent->d_inode->i_sem);
 	d_delete(d);
-	simple_rmdir(parent->d_inode,d);
+	if (d->d_inode)
+		simple_rmdir(parent->d_inode,d);
 
 	pr_debug(" o %s removing done (%d)\n",d->d_name.name,
 		 atomic_read(&d->d_count));
diff -Nru a/fs/udf/super.c b/fs/udf/super.c
--- a/fs/udf/super.c	Thu Jan  8 23:00:24 2004
+++ b/fs/udf/super.c	Thu Jan  8 23:00:24 2004
@@ -414,7 +414,7 @@
 		case Opt_utf8:
 			uopt->flags |= (1 << UDF_FLAG_UTF8);
 			break;
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 		case Opt_iocharset:
 			uopt->nls_map = load_nls(args[0].from);
 			uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
@@ -1510,7 +1510,7 @@
 			"utf8 cannot be combined with iocharset\n");
 		goto error_out;
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map)
 	{
 		uopt.nls_map = load_nls_default();
@@ -1674,7 +1674,7 @@
 				udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
 		}
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
 		unload_nls(UDF_SB(sb)->s_nls_map);
 #endif
@@ -1766,7 +1766,7 @@
 				udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
 		}
 	}
-#ifdef CONFIG_NLS
+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
 	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
 		unload_nls(UDF_SB(sb)->s_nls_map);
 #endif
diff -Nru a/fs/vfat/namei.c b/fs/vfat/namei.c
--- a/fs/vfat/namei.c	Thu Jan  8 23:00:24 2004
+++ b/fs/vfat/namei.c	Thu Jan  8 23:00:24 2004
@@ -25,23 +25,6 @@
 #include <linux/buffer_head.h>
 #include <linux/namei.h>
 
-#define DEBUG_LEVEL 0
-#if (DEBUG_LEVEL >= 1)
-#  define PRINTK1(x) printk x
-#else
-#  define PRINTK1(x)
-#endif
-#if (DEBUG_LEVEL >= 2)
-#  define PRINTK2(x) printk x
-#else
-#  define PRINTK2(x)
-#endif
-#if (DEBUG_LEVEL >= 3)
-#  define PRINTK3(x) printk x
-#else
-#  define PRINTK3(x)
-#endif
-
 static int vfat_hashi(struct dentry *parent, struct qstr *qstr);
 static int vfat_hash(struct dentry *parent, struct qstr *qstr);
 static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
@@ -573,13 +556,18 @@
 	int charlen;
 
 	if (utf8) {
+		int name_len = strlen(name);
+
 		*outlen = utf8_mbstowcs((wchar_t *)outname, name, PAGE_SIZE);
-		if (name[len-1] == '.')
-			*outlen-=2;
+
+		/*
+		 * We stripped '.'s before and set len appropriately,
+		 * but utf8_mbstowcs doesn't care about len
+		 */
+		*outlen -= (name_len-len);
+
 		op = &outname[*outlen * sizeof(wchar_t)];
 	} else {
-		if (name[len-1] == '.') 
-			len--;
 		if (nls) {
 			for (i = 0, ip = name, op = outname, *outlen = 0;
 			     i < len && *outlen <= 260; *outlen += 1)
@@ -694,7 +682,6 @@
 	for (cksum = i = 0; i < 11; i++) {
 		cksum = (((cksum&1)<<7)|((cksum&0xfe)>>1)) + msdos_name[i];
 	}
-	PRINTK3(("vfat_fill_slots 3: slots=%d\n",*slots));
 
 	for (ps = ds, slot = *slots; slot > 0; slot--, ps++) {
 		ps->id = slot;
@@ -711,7 +698,6 @@
 	de = (struct msdos_dir_entry *) ps;
 
 shortname:
-	PRINTK3(("vfat_fill_slots 9\n"));
 	/* build the entry of 8.3 alias name */
 	(*slots)++;
 	memcpy(de->name, msdos_name, MSDOS_NAME);
@@ -734,18 +720,22 @@
 {
 	struct msdos_dir_slot *dir_slots;
 	loff_t offset;
-	int slots, slot;
-	int res;
+	int res, slots, slot;
+	unsigned int len;
 	struct msdos_dir_entry *dummy_de;
 	struct buffer_head *dummy_bh;
 	loff_t dummy_i_pos;
 
-	dir_slots = (struct msdos_dir_slot *)
+	len = vfat_striptail_len(qname);
+	if (len == 0)
+		return -ENOENT;
+
+	dir_slots =
 	       kmalloc(sizeof(struct msdos_dir_slot) * MSDOS_SLOTS, GFP_KERNEL);
 	if (dir_slots == NULL)
 		return -ENOMEM;
 
-	res = vfat_build_slots(dir, qname->name, vfat_striptail_len(qname),
+	res = vfat_build_slots(dir, qname->name, len,
 			       dir_slots, &slots, is_dir);
 	if (res < 0)
 		goto cleanup;
@@ -796,11 +786,16 @@
 {
 	struct super_block *sb = dir->i_sb;
 	loff_t offset;
+	unsigned int len;
 	int res;
 
-	res = fat_search_long(dir, qname->name, vfat_striptail_len(qname),
-			(MSDOS_SB(sb)->options.name_check != 's'),
-			&offset,&sinfo->longname_offset);
+	len = vfat_striptail_len(qname);
+	if (len == 0)
+		return -ENOENT;
+
+	res = fat_search_long(dir, qname->name, len,
+			      (MSDOS_SB(sb)->options.name_check != 's'),
+			      &offset, &sinfo->longname_offset);
 	if (res>0) {
 		sinfo->long_slots = res-1;
 		if (fat_get_entry(dir,&offset,last_bh,last_de,&sinfo->i_pos)>=0)
@@ -820,9 +815,6 @@
 	struct msdos_dir_entry *de;
 	int table;
 	
-	PRINTK2(("vfat_lookup: name=%s, len=%d\n", 
-		 dentry->d_name.name, dentry->d_name.len));
-
 	lock_kernel();
 	table = (MSDOS_SB(dir->i_sb)->options.name_check == 's') ? 2 : 0;
 	dentry->d_op = &vfat_dentry_ops[table];
@@ -955,7 +947,6 @@
 	struct buffer_head *bh = NULL;
 	struct msdos_dir_entry *de;
 
-	PRINTK1(("vfat_unlink: %s\n", dentry->d_name.name));
 	lock_kernel();
 	res = vfat_find(dir,&dentry->d_name,&sinfo,&bh,&de);
 	if (res < 0) {
@@ -1036,14 +1027,18 @@
 	new_inode = new_dentry->d_inode;
 	lock_kernel();
 	res = vfat_find(old_dir,&old_dentry->d_name,&old_sinfo,&old_bh,&old_de);
-	PRINTK3(("vfat_rename 2\n"));
-	if (res < 0) goto rename_done;
+	if (res < 0)
+		goto rename_done;
 
 	is_dir = S_ISDIR(old_inode->i_mode);
 
-	if (is_dir && (res = fat_scan(old_inode,MSDOS_DOTDOT,&dotdot_bh,
-				&dotdot_de,&dotdot_i_pos)) < 0)
-		goto rename_done;
+	if (is_dir) {
+		if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
+			     &dotdot_de, &dotdot_i_pos) < 0) {
+			res = -EIO;
+			goto rename_done;
+		}
+	}
 
 	if (new_dentry->d_inode) {
 		res = vfat_find(new_dir,&new_dentry->d_name,&sinfo,&new_bh,
diff -Nru a/fs/xfs/pagebuf/page_buf.c b/fs/xfs/pagebuf/page_buf.c
--- a/fs/xfs/pagebuf/page_buf.c	Thu Jan  8 23:00:23 2004
+++ b/fs/xfs/pagebuf/page_buf.c	Thu Jan  8 23:00:23 2004
@@ -1395,7 +1395,6 @@
 			break;
 
 		offset = 0;
-
 		sector += nbytes >> BBSHIFT;
 		size -= nbytes;
 		total_nr_pages--;
@@ -1403,15 +1402,11 @@
 
 submit_io:
 	if (likely(bio->bi_size)) {
-		if (pb->pb_flags & PBF_READ) {
-			submit_bio(READ, bio);
-		} else {
-			submit_bio(WRITE, bio);
-		}
-
+		submit_bio((pb->pb_flags & PBF_READ) ? READ : WRITE, bio);
 		if (size)
 			goto next_chunk;
 	} else {
+		bio_put(bio);
 		pagebuf_ioerror(pb, EIO);
 	}
 
diff -Nru a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c
--- a/fs/xfs/xfs_vfsops.c	Thu Jan  8 23:00:23 2004
+++ b/fs/xfs/xfs_vfsops.c	Thu Jan  8 23:00:23 2004
@@ -1598,8 +1598,9 @@
 #define MNTOPT_NORECOVERY   "norecovery"   /* don't run XFS recovery */
 #define MNTOPT_NOLOGFLUSH   "nologflush"   /* don't hard flush on log writes */
 #define MNTOPT_OSYNCISOSYNC "osyncisosync" /* o_sync is REALLY o_sync */
-#define MNTOPT_64BITINODE   "inode64"  /* inodes can be allocated anywhere */
-#define MNTOPT_IKEEP	"ikeep"		/* free empty inode clusters */
+#define MNTOPT_64BITINODE   "inode64"	/* inodes can be allocated anywhere */
+#define MNTOPT_IKEEP	"ikeep"		/* do not free empty inode clusters */
+#define MNTOPT_NOIKEEP	"noikeep"	/* free empty inode clusters */
 
 
 int
@@ -1614,7 +1615,9 @@
 	int			dsunit, dswidth, vol_dsunit, vol_dswidth;
 	int			iosize;
 
+#if 0	/* XXX: off by default, until some remaining issues ironed out */
 	args->flags |= XFSMNT_IDELETE; /* default to on */
+#endif
 
 	if (!options)
 		return 0;
@@ -1722,6 +1725,8 @@
 			args->flags |= XFSMNT_NOLOGFLUSH;
 		} else if (!strcmp(this_char, MNTOPT_IKEEP)) {
 			args->flags &= ~XFSMNT_IDELETE;
+		} else if (!strcmp(this_char, MNTOPT_NOIKEEP)) {
+			args->flags |= XFSMNT_IDELETE;
 		} else if (!strcmp(this_char, "osyncisdsync")) {
 			/* no-op, this is now the default */
 printk("XFS: osyncisdsync is now the default, option is deprecated.\n");
diff -Nru a/include/asm-alpha/cpumask.h b/include/asm-alpha/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-alpha/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_ALPHA_CPUMASK_H
+#define _ASM_ALPHA_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ALPHA_CPUMASK_H */
diff -Nru a/include/asm-arm/arch-ebsa285/time.h b/include/asm-arm/arch-ebsa285/time.h
--- a/include/asm-arm/arch-ebsa285/time.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/arch-ebsa285/time.h	Thu Jan  8 23:00:24 2004
@@ -243,6 +243,7 @@
 
 		if ((CMOS_READ(RTC_REG_A) & 0x7f) == RTC_REF_CLCK_32KHZ &&
 		    CMOS_READ(RTC_REG_B) == reg_b) {
+			struct timespec tv;
 
 			/*
 			 * We have a RTC.  Check the battery
@@ -250,7 +251,9 @@
 			if ((reg_d & 0x80) == 0)
 				printk(KERN_WARNING "RTC: *** warning: CMOS battery bad\n");
 
-			xtime.tv_sec = get_isa_cmos_time();
+			tv.tv_nsec = 0;
+			tv.tv_sec = get_isa_cmos_time();
+			do_settimeofday(&tv);
 			set_rtc = set_isa_cmos_time;
 		} else
 			rtc_base = 0;
diff -Nru a/include/asm-arm/arch-pxa/time.h b/include/asm-arm/arch-pxa/time.h
--- a/include/asm-arm/arch-pxa/time.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/arch-pxa/time.h	Thu Jan  8 23:00:24 2004
@@ -33,7 +33,7 @@
 /* IRQs are disabled before entering here from do_gettimeofday() */
 static unsigned long pxa_gettimeoffset (void)
 {
-	unsigned long ticks_to_match, elapsed, usec;
+	long ticks_to_match, elapsed, usec;
 
 	/* Get ticks before next timer match */
 	ticks_to_match = OSMR0 - OSCR;
@@ -41,6 +41,10 @@
 	/* We need elapsed ticks since last match */
 	elapsed = LATCH - ticks_to_match;
 
+	/* don't get fooled by the workaround in pxa_timer_interrupt() */
+	if (elapsed <= 0)
+		return 0;
+
 	/* Now convert them to usec */
 	usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
 
@@ -59,6 +63,15 @@
 	 * IRQs are disabled inside the loop to ensure coherence between
 	 * lost_ticks (updated in do_timer()) and the match reg value, so we
 	 * can use do_gettimeofday() from interrupt handlers.
+	 *
+	 * HACK ALERT: it seems that the PXA timer regs aren't updated right
+	 * away in all cases when a write occurs.  We therefore compare with
+	 * 8 instead of 0 in the while() condition below to avoid missing a
+	 * match if OSCR has already reached the next OSMR value.
+	 * Experience has shown that up to 6 ticks are needed to work around
+	 * this problem, but let's use 8 to be conservative.  Note that this
+	 * affect things only when the timer IRQ has been delayed by nearly
+	 * exactly one tick period which should be a pretty rare event.
 	 */
 	do {
 		do_leds();
@@ -66,16 +79,22 @@
 		do_timer(regs);
 		OSSR = OSSR_M0;  /* Clear match on timer 0 */
 		next_match = (OSMR0 += LATCH);
-	} while( (signed long)(next_match - OSCR) <= 0 );
+	} while( (signed long)(next_match - OSCR) <= 8 );
 
 	return IRQ_HANDLED;
 }
 
 void __init time_init(void)
 {
+	struct timespec tv;
+
 	gettimeoffset = pxa_gettimeoffset;
 	set_rtc = pxa_set_rtc;
-	xtime.tv_sec = pxa_get_rtc_time();
+
+	tv.tv_nsec = 0;
+	tv.tv_sec = pxa_get_rtc_time();
+	do_settimeofday(&tv);
+
 	timer_irq.handler = pxa_timer_interrupt;
 	OSMR0 = 0;		/* set initial match at 0 */
 	OSSR = 0xf;		/* clear status on all timers */
diff -Nru a/include/asm-arm/arch-sa1100/time.h b/include/asm-arm/arch-sa1100/time.h
--- a/include/asm-arm/arch-sa1100/time.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/arch-sa1100/time.h	Thu Jan  8 23:00:24 2004
@@ -92,9 +92,15 @@
 
 void __init time_init(void)
 {
+	struct timespec tv;
+
 	gettimeoffset = sa1100_gettimeoffset;
 	set_rtc = sa1100_set_rtc;
-	xtime.tv_sec = sa1100_get_rtc_time();
+
+	tv.tv_nsec = 0;
+	tv.tv_sec = sa1100_get_rtc_time();
+	do_settimeofday(&tv);
+
 	timer_irq.handler = sa1100_timer_interrupt;
 	OSMR0 = 0;		/* set initial match at 0 */
 	OSSR = 0xf;		/* clear status on all timers */
diff -Nru a/include/asm-arm/arch-shark/time.h b/include/asm-arm/arch-shark/time.h
--- a/include/asm-arm/arch-shark/time.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/arch-shark/time.h	Thu Jan  8 23:00:24 2004
@@ -34,8 +34,6 @@
 	outb(HZ_TIME & 0xff, 0x40);     /* LSB of count */
 	outb(HZ_TIME >> 8, 0x40);
 
-	xtime.tv_sec = 0;
-
 	timer_irq.handler = timer_interrupt;
 	setup_irq(IRQ_TIMER, &timer_irq);
 }
diff -Nru a/include/asm-arm/cpumask.h b/include/asm-arm/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_ARM_CPUMASK_H
+#define _ASM_ARM_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ARM_CPUMASK_H */
diff -Nru a/include/asm-arm/div64.h b/include/asm-arm/div64.h
--- a/include/asm-arm/div64.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/div64.h	Thu Jan  8 23:00:24 2004
@@ -1,18 +1,42 @@
 #ifndef __ASM_ARM_DIV64
 #define __ASM_ARM_DIV64
 
-/* We're not 64-bit, but... */
+/*
+ * The semantics of do_div() are:
+ *
+ * uint32_t do_div(uint64_t *n, uint32_t base)
+ * {
+ * 	uint32_t remainder = *n % base;
+ * 	*n = *n / base;
+ * 	return remainder;
+ * }
+ *
+ * In other words, a 64-bit dividend with a 32-bit divisor producing
+ * a 64-bit result and a 32-bit remainder.  To accomplish this optimally
+ * we call a special __do_div64 helper with completely non standard
+ * calling convention for arguments and results (beware).
+ */
+
+#ifdef __ARMEB__
+#define __xh "r0"
+#define __xl "r1"
+#else
+#define __xl "r0"
+#define __xh "r1"
+#endif
+
 #define do_div(n,base)						\
 ({								\
-	register int __res asm("r2") = base;			\
-	register unsigned long long __n asm("r0") = n;		\
-	asm("bl do_div64"					\
-		: "=r" (__n), "=r" (__res)			\
-		: "0" (__n), "1" (__res)			\
-		: "r3", "ip", "lr", "cc");			\
-	n = __n;						\
-	__res;							\
+	register unsigned int __base      asm("r4") = base;	\
+	register unsigned long long __n   asm("r0") = n;	\
+	register unsigned long long __res asm("r2");		\
+	register unsigned int __rem       asm(__xh);		\
+	asm("bl	__do_div64"					\
+		: "=r" (__rem), "=r" (__res)			\
+		: "r" (__n), "r" (__base)			\
+		: "ip", "lr", "cc");				\
+	n = __res;						\
+	__rem;							\
 })
 
 #endif
-
diff -Nru a/include/asm-arm/kmap_types.h b/include/asm-arm/kmap_types.h
--- a/include/asm-arm/kmap_types.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/kmap_types.h	Thu Jan  8 23:00:24 2004
@@ -5,8 +5,21 @@
  * This is the "bare minimum".  AIO seems to require this.
  */
 enum km_type {
+	KM_BOUNCE_READ,
+	KM_SKB_SUNRPC_DATA,
+	KM_SKB_DATA_SOFTIRQ,
+	KM_USER0,
+	KM_USER1,
+	KM_BIO_SRC_IRQ,
+	KM_BIO_DST_IRQ,
+	KM_PTE0,
+	KM_PTE1,
+	KM_PTE2,
 	KM_IRQ0,
-	KM_USER1
+	KM_IRQ1,
+	KM_SOFTIRQ0,
+	KM_SOFTIRQ1,
+	KM_TYPE_NR
 };
 
 #endif
diff -Nru a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h
--- a/include/asm-arm/pgtable.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-arm/pgtable.h	Thu Jan  8 23:00:23 2004
@@ -152,16 +152,16 @@
 /*
  * The following macros handle the cache and bufferable bits...
  */
-#define _L_PTE_DEFAULT	L_PTE_PRESENT | L_PTE_YOUNG
-#define _L_PTE_READ	L_PTE_USER | L_PTE_EXEC | L_PTE_CACHEABLE | L_PTE_BUFFERABLE
+#define _L_PTE_DEFAULT	L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_CACHEABLE | L_PTE_BUFFERABLE
+#define _L_PTE_READ	L_PTE_USER | L_PTE_EXEC
+
+extern pgprot_t		pgprot_kernel;
 
 #define PAGE_NONE       __pgprot(_L_PTE_DEFAULT)
 #define PAGE_COPY       __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
 #define PAGE_SHARED     __pgprot(_L_PTE_DEFAULT | _L_PTE_READ | L_PTE_WRITE)
 #define PAGE_READONLY   __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
-#define PAGE_KERNEL     __pgprot(_L_PTE_DEFAULT | L_PTE_CACHEABLE | L_PTE_BUFFERABLE | L_PTE_DIRTY | L_PTE_WRITE | L_PTE_EXEC)
-
-#define _PAGE_CHG_MASK	(PAGE_MASK | L_PTE_DIRTY | L_PTE_YOUNG)
+#define PAGE_KERNEL	pgprot_kernel
 
 #endif /* __ASSEMBLY__ */
 
@@ -323,7 +323,8 @@
 
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 {
-	pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
+	const unsigned long mask = L_PTE_EXEC | L_PTE_WRITE | L_PTE_USER;
+	pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
 	return pte;
 }
 
diff -Nru a/include/asm-arm/unaligned.h b/include/asm-arm/unaligned.h
--- a/include/asm-arm/unaligned.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/unaligned.h	Thu Jan  8 23:00:24 2004
@@ -159,7 +159,7 @@
 		(void) 0;					\
 	})
 
-#define put_unaligned_be(val,ptr)					\
+#define __put_unaligned_be(val,ptr)					\
 	({							\
 		switch (sizeof(*(ptr))) {			\
 		case 1:						\
diff -Nru a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h
--- a/include/asm-arm/unistd.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-arm/unistd.h	Thu Jan  8 23:00:24 2004
@@ -282,6 +282,20 @@
 					/* 254 for set_thread_area */
 					/* 255 for get_thread_area */
 					/* 256 for set_tid_address */
+#define __NR_timer_create		(__NR_SYSCALL_BASE+257)
+#define __NR_timer_settime		(__NR_SYSCALL_BASE+258)
+#define __NR_timer_gettime		(__NR_SYSCALL_BASE+259)
+#define __NR_timer_getoverrun		(__NR_SYSCALL_BASE+260)
+#define __NR_timer_delete		(__NR_SYSCALL_BASE+261)
+#define __NR_clock_settime		(__NR_SYSCALL_BASE+262)
+#define __NR_clock_gettime		(__NR_SYSCALL_BASE+263)
+#define __NR_clock_getres		(__NR_SYSCALL_BASE+264)
+#define __NR_clock_nanosleep		(__NR_SYSCALL_BASE+265)
+#define __NR_statfs64			(__NR_SYSCALL_BASE+266)
+#define __NR_fstatfs64			(__NR_SYSCALL_BASE+267)
+#define __NR_tgkill			(__NR_SYSCALL_BASE+268)
+#define __NR_utimes			(__NR_SYSCALL_BASE+269)
+#define __NR_fadvise64_64		(__NR_SYSCALL_BASE+270)
 
 /*
  * The following SWIs are ARM private.
diff -Nru a/include/asm-arm26/cpumask.h b/include/asm-arm26/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm26/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_ARM26_CPUMASK_H
+#define _ASM_ARM26_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_ARM26_CPUMASK_H */
diff -Nru a/include/asm-arm26/keyboard.h.old b/include/asm-arm26/keyboard.h.old
--- a/include/asm-arm26/keyboard.h.old	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,78 +0,0 @@
-/*
- *  linux/include/asm-arm/keyboard.h
- *
- *  Copyright (C) 1998 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  Keyboard driver definitions for ARM
- */
-#ifndef __ASM_ARM_KEYBOARD_H
-#define __ASM_ARM_KEYBOARD_H
-
-#include <linux/kd.h>
-#include <linux/pm.h>
-
-/*
- * We provide a unified keyboard interface when in VC_MEDIUMRAW
- * mode.  This means that all keycodes must be common between
- * all supported keyboards.  This unfortunately puts us at odds
- * with the PC keyboard interface chip... but we can't do anything
- * about that now.
- */
-#ifdef __KERNEL__
-
-extern int  (*k_setkeycode)(unsigned int, unsigned int);
-extern int  (*k_getkeycode)(unsigned int);
-extern int  (*k_translate)(unsigned char, unsigned char *, char);
-extern char (*k_unexpected_up)(unsigned char);
-extern void (*k_leds)(unsigned char);
-
-
-static inline int kbd_setkeycode(unsigned int sc, unsigned int kc)
-{
-	int ret = -EINVAL;
-
-	if (k_setkeycode)
-		ret = k_setkeycode(sc, kc);
-
-	return ret;
-}
-
-static inline int kbd_getkeycode(unsigned int sc)
-{
-	int ret = -EINVAL;
-
-	if (k_getkeycode)
-		ret = k_getkeycode(sc);
-
-	return ret;
-}
-
-static inline void kbd_leds(unsigned char leds)
-{
-	if (k_leds)
-		k_leds(leds);
-}
-
-extern int k_sysrq_key;
-extern unsigned char *k_sysrq_xlate;
-
-#define SYSRQ_KEY		k_sysrq_key
-#define kbd_sysrq_xlate		k_sysrq_xlate
-#define kbd_translate		k_translate
-#define kbd_unexpected_up	k_unexpected_up
-
-#define NR_SCANCODES 128
-
-extern int a5kkbd_init_hw(void);
-
-#define kbd_disable_irq()       disable_irq(IRQ_KEYBOARDRX)
-#define kbd_enable_irq()        enable_irq(IRQ_KEYBOARDRX)
-#define kbd_init_hw()           a5kkbd_init_hw()
-
-#endif /* __KERNEL__ */
-
-#endif /* __ASM_ARM_KEYBOARD_H */
diff -Nru a/include/asm-cris/cpumask.h b/include/asm-cris/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-cris/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_CRIS_CPUMASK_H
+#define _ASM_CRIS_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_CRIS_CPUMASK_H */
diff -Nru a/include/asm-generic/cpumask.h b/include/asm-generic/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-generic/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,40 @@
+#ifndef __ASM_GENERIC_CPUMASK_H
+#define __ASM_GENERIC_CPUMASK_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/threads.h>
+#include <linux/types.h>
+#include <linux/bitmap.h>
+
+#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
+#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
+
+struct cpumask
+{
+	unsigned long mask[CPU_ARRAY_SIZE];
+};
+
+typedef struct cpumask cpumask_t;
+
+#else
+typedef unsigned long cpumask_t;
+#endif
+
+#ifdef CONFIG_SMP
+#if NR_CPUS > BITS_PER_LONG
+#include <asm-generic/cpumask_array.h>
+#else
+#include <asm-generic/cpumask_arith.h>
+#endif
+#else
+#include <asm-generic/cpumask_up.h>
+#endif
+
+#if NR_CPUS <= 4*BITS_PER_LONG
+#include <asm-generic/cpumask_const_value.h>
+#else
+#include <asm-generic/cpumask_const_reference.h>
+#endif
+
+#endif /* __ASM_GENERIC_CPUMASK_H */
diff -Nru a/include/asm-generic/cpumask_arith.h b/include/asm-generic/cpumask_arith.h
--- a/include/asm-generic/cpumask_arith.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-generic/cpumask_arith.h	Thu Jan  8 23:00:24 2004
@@ -17,6 +17,7 @@
 #define cpus_complement(map)		do { map = ~(map); } while (0)
 #define cpus_equal(map1, map2)		((map1) == (map2))
 #define cpus_empty(map)			((map) == 0)
+#define cpus_addr(map)			(&(map))
 
 #if BITS_PER_LONG == 32
 #define cpus_weight(map)		hweight32(map)
diff -Nru a/include/asm-generic/cpumask_array.h b/include/asm-generic/cpumask_array.h
--- a/include/asm-generic/cpumask_array.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-generic/cpumask_array.h	Thu Jan  8 23:00:24 2004
@@ -20,6 +20,7 @@
 #define cpus_complement(map)	bitmap_complement((map).mask, NR_CPUS)
 #define cpus_equal(map1, map2)	bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
 #define cpus_empty(map)		bitmap_empty(map.mask, NR_CPUS)
+#define cpus_addr(map)		((map).mask)
 #define cpus_weight(map)		bitmap_weight((map).mask, NR_CPUS)
 #define cpus_shift_right(d, s, n)	bitmap_shift_right((d).mask, (s).mask, n, NR_CPUS)
 #define cpus_shift_left(d, s, n)	bitmap_shift_left((d).mask, (s).mask, n, NR_CPUS)
diff -Nru a/include/asm-generic/cpumask_const_value.h b/include/asm-generic/cpumask_const_value.h
--- a/include/asm-generic/cpumask_const_value.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-generic/cpumask_const_value.h	Thu Jan  8 23:00:23 2004
@@ -3,7 +3,7 @@
 
 typedef const cpumask_t cpumask_const_t;
 
-#define mk_cpumask_const(map)		((cpumask_const_t)(map))
+#define mk_cpumask_const(map)		(map)
 #define cpu_isset_const(cpu, map)	cpu_isset(cpu, map)
 #define cpus_and_const(dst,src1,src2)	cpus_and(dst, src1, src2)
 #define cpus_or_const(dst,src1,src2)	cpus_or(dst, src1, src2)
diff -Nru a/include/asm-generic/cpumask_up.h b/include/asm-generic/cpumask_up.h
--- a/include/asm-generic/cpumask_up.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-generic/cpumask_up.h	Thu Jan  8 23:00:23 2004
@@ -33,6 +33,7 @@
 
 #define cpus_equal(map1, map2)		(cpus_coerce(map1) == cpus_coerce(map2))
 #define cpus_empty(map)			(cpus_coerce(map) == 0UL)
+#define cpus_addr(map)			(&(map))
 #define cpus_weight(map)		(cpus_coerce(map) ? 1UL : 0UL)
 #define cpus_shift_right(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
 #define cpus_shift_left(d, s, n)	do { cpus_coerce(d) = 0UL; } while (0)
diff -Nru a/include/asm-generic/sections.h b/include/asm-generic/sections.h
--- a/include/asm-generic/sections.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-generic/sections.h	Thu Jan  8 23:00:23 2004
@@ -5,7 +5,7 @@
 
 extern char _text[], _stext[], _etext[];
 extern char _data[], _sdata[], _edata[];
-extern char __bss_start[];
+extern char __bss_start[], __bss_stop[];
 extern char __init_begin[], __init_end[];
 extern char _sinittext[], _einittext[];
 
diff -Nru a/include/asm-generic/statfs.h b/include/asm-generic/statfs.h
--- a/include/asm-generic/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-generic/statfs.h	Thu Jan  8 23:00:24 2004
@@ -34,4 +34,18 @@
 	__u32 f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
diff -Nru a/include/asm-h8300/bitops.h b/include/asm-h8300/bitops.h
--- a/include/asm-h8300/bitops.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-h8300/bitops.h	Thu Jan  8 23:00:23 2004
@@ -23,25 +23,22 @@
  */
 static __inline__ unsigned long ffz(unsigned long word)
 {
-	register unsigned long result asm("er0");
-	register unsigned long _word asm("er1");
+	unsigned long result;
 
-	_word = word;
-	__asm__("sub.l %0,%0\n\t"
-		"dec.l #1,%0\n"
-		"1:\n\t"
-		"shlr.l %1\n\t"
+	result = -1;
+	__asm__("1:\n\t"
+		"shlr.l %2\n\t"
 		"adds #1,%0\n\t"
 		"bcs 1b"
-		: "=r" (result) : "r" (_word));
+		: "=r" (result)
+		: "0"  (result),"r" (word));
 	return result;
 }
 
 static __inline__ void set_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bset r0l,%0"
 		:"+m"(*b_addr)
@@ -61,8 +58,7 @@
 static __inline__ void clear_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bclr r0l,%0"
 		:"+m"(*b_addr)
@@ -75,8 +71,7 @@
 static __inline__ void change_bit(int nr, volatile unsigned long* addr)
 {
 	volatile unsigned char *b_addr;
-	b_addr = &(((volatile unsigned char *) addr)
-	          [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
+	b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
 	__asm__("mov.l %1,er0\n\t"
 		"bnot r0l,%0"
 		:"+m"(*b_addr)
@@ -88,22 +83,18 @@
 
 static __inline__ int test_bit(int nr, const unsigned long* addr)
 {
-	return ((1UL << (nr & 7)) & 
-               (((const volatile unsigned char *) addr)
-               [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)])) != 0;
+	return (*((volatile unsigned char *)addr + ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
 }
 
 #define __test_bit(nr, addr) test_bit(nr, addr)
 
 static __inline__ int test_and_set_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -112,37 +103,35 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_set_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bset r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int test_and_clear_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -151,37 +140,35 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"=m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bclr r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int test_and_change_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"stc ccr,r3h\n\t"
 		"orc #0x80,ccr\n\t"
 		"btst r3l,%1\n\t"
@@ -190,25 +177,25 @@
 		"inc.l #1,%0\n\t"
 		"1:"
 		"ldc r3h,ccr"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
 static __inline__ int __test_and_change_bit(int nr, volatile unsigned long* addr)
 {
-	register int retval __asm__("er0");
+	int retval = 0;
 	volatile unsigned char *a;
-	a = (volatile unsigned char *)addr;
 
-	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-	__asm__("mov.l %2,er3\n\t"
-		"sub.l %0,%0\n\t"
+	a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3);             \
+	__asm__("mov.l %4,er3\n\t"
 		"btst r3l,%1\n\t"
 		"bnot r3l,%1\n\t"
 		"beq 1f\n\t"
 		"inc.l #1,%0\n\t"
 		"1:"
-		: "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
+		: "=r"(retval),"+m"(*a)
+		: "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
 	return retval;
 }
 
@@ -251,27 +238,21 @@
 	return result + ffz(tmp);
 }
 
-static __inline__ unsigned long ffs(unsigned long word)
+static __inline__ unsigned long __ffs(unsigned long word)
 {
-	register unsigned long result asm("er0");
-	register unsigned long _word asm("er1");
+	unsigned long result;
 
-	_word = word;
-	__asm__("sub.l %0,%0\n\t"
-		"dec.l #1,%0\n"
-		"1:\n\t"
-		"shlr.l %1\n\t"
+	result = -1;
+	__asm__("1:\n\t"
+		"shlr.l %2\n\t"
 		"adds #1,%0\n\t"
 		"bcc 1b"
-		: "=r" (result) : "r"(_word));
+		: "=r" (result)
+		: "0"(result),"r"(word));
 	return result;
 }
 
-#define __ffs(x) ffs(x)
-
-/*
- * fls: find last bit set.
- */
+#define ffs(x) generic_ffs(x)
 #define fls(x) generic_fls(x)
 
 /*
@@ -316,6 +297,7 @@
 	local_irq_restore(flags);
 	return retval;
 }
+#define ext2_set_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
 
 static __inline__ int ext2_clear_bit(int nr, volatile void * addr)
 {
@@ -331,6 +313,7 @@
 	local_irq_restore(flags);
 	return retval;
 }
+#define ext2_clear_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
 
 static __inline__ int ext2_test_bit(int nr, const volatile void * addr)
 {
@@ -401,17 +384,6 @@
 #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
-
-/**
- * hweightN - returns the hamming weight of a N-bit word
- * @x: the word to weigh
- *
- * The Hamming Weight of a number is the total number of bits set in it.
- */
-
-#define hweight32(x) generic_hweight32(x)
-#define hweight16(x) generic_hweight16(x)
-#define hweight8(x) generic_hweight8(x)
 
 #endif /* __KERNEL__ */
 
diff -Nru a/include/asm-h8300/cpumask.h b/include/asm-h8300/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_H8300_CPUMASK_H
+#define _ASM_H8300_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_H8300_CPUMASK_H */
diff -Nru a/include/asm-i386/cpumask.h b/include/asm-i386/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_I386_CPUMASK_H
+#define _ASM_I386_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_I386_CPUMASK_H */
diff -Nru a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h
--- a/include/asm-i386/hw_irq.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/hw_irq.h	Thu Jan  8 23:00:24 2004
@@ -41,6 +41,7 @@
 asmlinkage void error_interrupt(void);
 asmlinkage void spurious_interrupt(void);
 asmlinkage void thermal_interrupt(struct pt_regs);
+#define platform_legacy_irq(irq)	((irq) < 16)
 #endif
 
 void mask_irq(unsigned int irq);
diff -Nru a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h
--- a/include/asm-i386/io_apic.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/io_apic.h	Thu Jan  8 23:00:24 2004
@@ -13,6 +13,46 @@
 
 #ifdef CONFIG_X86_IO_APIC
 
+#ifdef CONFIG_PCI_USE_VECTOR
+static inline int use_pci_vector(void)	{return 1;}
+static inline void disable_edge_ioapic_vector(unsigned int vector) { }
+static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { }
+static inline void end_edge_ioapic_vector (unsigned int vector) { }
+#define startup_level_ioapic	startup_level_ioapic_vector
+#define shutdown_level_ioapic	mask_IO_APIC_vector
+#define enable_level_ioapic	unmask_IO_APIC_vector
+#define disable_level_ioapic	mask_IO_APIC_vector
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_vector
+#define end_level_ioapic	end_level_ioapic_vector
+#define set_ioapic_affinity	set_ioapic_affinity_vector
+
+#define startup_edge_ioapic 	startup_edge_ioapic_vector
+#define shutdown_edge_ioapic 	disable_edge_ioapic_vector
+#define enable_edge_ioapic 	unmask_IO_APIC_vector
+#define disable_edge_ioapic 	disable_edge_ioapic_vector
+#define ack_edge_ioapic 	ack_edge_ioapic_vector
+#define end_edge_ioapic 	end_edge_ioapic_vector
+#else
+static inline int use_pci_vector(void)	{return 0;}
+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
+static inline void end_edge_ioapic_irq (unsigned int irq) { }
+#define startup_level_ioapic	startup_level_ioapic_irq
+#define shutdown_level_ioapic	mask_IO_APIC_irq
+#define enable_level_ioapic	unmask_IO_APIC_irq
+#define disable_level_ioapic	mask_IO_APIC_irq
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
+#define end_level_ioapic	end_level_ioapic_irq
+#define set_ioapic_affinity	set_ioapic_affinity_irq
+
+#define startup_edge_ioapic 	startup_edge_ioapic_irq
+#define shutdown_edge_ioapic 	disable_edge_ioapic_irq
+#define enable_edge_ioapic 	unmask_IO_APIC_irq
+#define disable_edge_ioapic 	disable_edge_ioapic_irq
+#define ack_edge_ioapic 	ack_edge_ioapic_irq
+#define end_edge_ioapic 	end_edge_ioapic_irq
+#endif
+
 #define APIC_MISMATCH_DEBUG
 
 #define IO_APIC_BASE(idx) \
@@ -176,5 +216,7 @@
 #else  /* !CONFIG_X86_IO_APIC */
 #define io_apic_assign_pci_irqs 0
 #endif
+
+extern int assign_irq_vector(int irq);
 
 #endif
diff -Nru a/include/asm-i386/ioctl.h b/include/asm-i386/ioctl.h
--- a/include/asm-i386/ioctl.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/ioctl.h	Thu Jan  8 23:00:23 2004
@@ -53,7 +53,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
diff -Nru a/include/asm-i386/irq.h b/include/asm-i386/irq.h
--- a/include/asm-i386/irq.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/irq.h	Thu Jan  8 23:00:24 2004
@@ -24,6 +24,7 @@
 extern void disable_irq_nosync(unsigned int);
 extern void enable_irq(unsigned int);
 extern void release_x86_irqs(struct task_struct *);
+extern int can_request_irq(unsigned int, unsigned long flags);
 
 #ifdef CONFIG_X86_LOCAL_APIC
 #define ARCH_HAS_NMI_WATCHDOG		/* See include/linux/nmi.h */
diff -Nru a/include/asm-i386/mach-default/irq_vectors.h b/include/asm-i386/mach-default/irq_vectors.h
--- a/include/asm-i386/mach-default/irq_vectors.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mach-default/irq_vectors.h	Thu Jan  8 23:00:23 2004
@@ -76,6 +76,18 @@
  * Since vectors 0x00-0x1f are used/reserved for the CPU,
  * the usable vector space is 0x20-0xff (224 vectors)
  */
+
+/*
+ * The maximum number of vectors supported by i386 processors
+ * is limited to 256. For processors other than i386, NR_VECTORS
+ * should be changed accordingly.
+ */
+#define NR_VECTORS 256
+
+#ifdef CONFIG_PCI_USE_VECTOR
+#define NR_IRQS FIRST_SYSTEM_VECTOR
+#define NR_IRQ_VECTORS NR_IRQS
+#else
 #ifdef CONFIG_X86_IO_APIC
 #define NR_IRQS 224
 # if (224 >= 32 * NR_CPUS)
@@ -86,6 +98,7 @@
 #else
 #define NR_IRQS 16
 #define NR_IRQ_VECTORS NR_IRQS
+#endif
 #endif
 
 #define FPU_IRQ			13
diff -Nru a/include/asm-i386/mach-default/mach_apic.h b/include/asm-i386/mach-default/mach_apic.h
--- a/include/asm-i386/mach-default/mach_apic.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/mach-default/mach_apic.h	Thu Jan  8 23:00:24 2004
@@ -5,12 +5,12 @@
 
 #define APIC_DFR_VALUE	(APIC_DFR_FLAT)
 
-static inline cpumask_t target_cpus(void)
+static inline cpumask_const_t target_cpus(void)
 { 
 #ifdef CONFIG_SMP
-	return cpu_online_map;
+	return mk_cpumask_const(cpu_online_map);
 #else
-	return cpumask_of_cpu(0);
+	return mk_cpumask_const(cpumask_of_cpu(0));
 #endif
 } 
 #define TARGET_CPUS (target_cpus())
diff -Nru a/include/asm-i386/mach-es7000/mach_apic.h b/include/asm-i386/mach-es7000/mach_apic.h
--- a/include/asm-i386/mach-es7000/mach_apic.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mach-es7000/mach_apic.h	Thu Jan  8 23:00:23 2004
@@ -39,6 +39,7 @@
 #endif
 
 #define APIC_BROADCAST_ID	(0xff)
+#define NO_IOAPIC_CHECK (0)
 
 static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
 { 
diff -Nru a/include/asm-i386/mach-pc9800/irq_vectors.h b/include/asm-i386/mach-pc9800/irq_vectors.h
--- a/include/asm-i386/mach-pc9800/irq_vectors.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mach-pc9800/irq_vectors.h	Thu Jan  8 23:00:23 2004
@@ -85,6 +85,7 @@
 #define NR_IRQS 16
 #endif
 
+#define NR_VECTORS 256
 #define NR_IRQ_VECTORS NR_IRQS
 
 #define FPU_IRQ			8
diff -Nru a/include/asm-i386/mach-summit/mach_mpparse.h b/include/asm-i386/mach-summit/mach_mpparse.h
--- a/include/asm-i386/mach-summit/mach_mpparse.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/mach-summit/mach_mpparse.h	Thu Jan  8 23:00:24 2004
@@ -5,11 +5,11 @@
 
 extern int use_cyclone;
 
-#ifdef CONFIG_NUMA
+#ifdef CONFIG_X86_SUMMIT_NUMA
 extern void setup_summit(void);
-#else /* !CONFIG_NUMA */
+#else
 #define setup_summit()	{}
-#endif /* CONFIG_NUMA */
+#endif
 
 static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name, 
 				struct mpc_config_translation *translation)
@@ -110,9 +110,9 @@
 	LookOutBWPEG  = 7,  /* LookOut WPEG                        */
 } node_type;
 
-static inline int is_WPEG(node_type type){
-	return (type == CompatWPEG || type == AltWPEG ||
-		type == LookOutAWPEG || type == LookOutBWPEG);
+static inline int is_WPEG(struct rio_detail *rio){
+	return (rio->type == CompatWPEG || rio->type == AltWPEG ||
+		rio->type == LookOutAWPEG || rio->type == LookOutBWPEG);
 }
 
 #endif /* __ASM_MACH_MPPARSE_H */
diff -Nru a/include/asm-i386/mach-visws/irq_vectors.h b/include/asm-i386/mach-visws/irq_vectors.h
--- a/include/asm-i386/mach-visws/irq_vectors.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mach-visws/irq_vectors.h	Thu Jan  8 23:00:23 2004
@@ -47,8 +47,9 @@
 #define TIMER_IRQ 0
 
 /*
- * 
+ * IRQ definitions
  */
+#define NR_VECTORS 256
 #define NR_IRQS 224
 #define NR_IRQ_VECTORS NR_IRQS
 
diff -Nru a/include/asm-i386/mach-voyager/irq_vectors.h b/include/asm-i386/mach-voyager/irq_vectors.h
--- a/include/asm-i386/mach-voyager/irq_vectors.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mach-voyager/irq_vectors.h	Thu Jan  8 23:00:23 2004
@@ -55,6 +55,7 @@
 #define VIC_CPU_BOOT_CPI		VIC_CPI_LEVEL0
 #define VIC_CPU_BOOT_ERRATA_CPI		(VIC_CPI_LEVEL0 + 8)
 
+#define NR_VECTORS 256
 #define NR_IRQS 224
 #define NR_IRQ_VECTORS NR_IRQS
 
diff -Nru a/include/asm-i386/mpspec.h b/include/asm-i386/mpspec.h
--- a/include/asm-i386/mpspec.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/mpspec.h	Thu Jan  8 23:00:23 2004
@@ -27,10 +27,6 @@
 extern int pic_mode;
 extern int using_apic_timer;
 
-#ifdef CONFIG_X86_SUMMIT
-extern void setup_summit (void);
-#endif
-
 #ifdef CONFIG_ACPI_BOOT
 extern void mp_register_lapic (u8 id, u8 enabled);
 extern void mp_register_lapic_address (u64 address);
diff -Nru a/include/asm-i386/processor.h b/include/asm-i386/processor.h
--- a/include/asm-i386/processor.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/processor.h	Thu Jan  8 23:00:23 2004
@@ -407,6 +407,7 @@
 /* cached TLS descriptors. */
 	struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
 	unsigned long	esp0;
+	unsigned long	sysenter_cs;
 	unsigned long	eip;
 	unsigned long	esp;
 	unsigned long	fs;
@@ -428,6 +429,7 @@
 
 #define INIT_THREAD  {							\
 	.vm86_info = NULL,						\
+	.sysenter_cs = __KERNEL_CS,					\
 	.io_bitmap_ptr = NULL,						\
 }
 
@@ -447,21 +449,13 @@
 	.io_bitmap	= { [ 0 ... IO_BITMAP_LONGS] = ~0 },		\
 }
 
-static inline void load_esp0(struct tss_struct *tss, unsigned long esp0)
+static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
 {
-	tss->esp0 = esp0;
+	tss->esp0 = thread->esp0;
 	/* This can only happen when SEP is enabled, no need to test "SEP"arately */
-	if ((unlikely(tss->ss1 != __KERNEL_CS))) {
-		tss->ss1 = __KERNEL_CS;
-		wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
-	}
-}
-
-static inline void disable_sysenter(struct tss_struct *tss)
-{
-	if (cpu_has_sep)  {
-		tss->ss1 = 0;
-		wrmsr(MSR_IA32_SYSENTER_CS, 0, 0);
+	if (unlikely(tss->ss1 != thread->sysenter_cs)) {
+		tss->ss1 = thread->sysenter_cs;
+		wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
 	}
 }
 
diff -Nru a/include/asm-i386/setup.h b/include/asm-i386/setup.h
--- a/include/asm-i386/setup.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/setup.h	Thu Jan  8 23:00:24 2004
@@ -29,6 +29,11 @@
 #define IST_INFO   (*(struct ist_info *) (PARAM+0x60))
 #define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
 #define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
+#define EFI_SYSTAB ((efi_system_table_t *) *((unsigned long *)(PARAM+0x1c4)))
+#define EFI_MEMDESC_SIZE (*((unsigned long *) (PARAM+0x1c8)))
+#define EFI_MEMDESC_VERSION (*((unsigned long *) (PARAM+0x1cc)))
+#define EFI_MEMMAP ((efi_memory_desc_t *) *((unsigned long *)(PARAM+0x1d0)))
+#define EFI_MEMMAP_SIZE (*((unsigned long *) (PARAM+0x1d4)))
 #define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
 #define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
 #define VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA))
diff -Nru a/include/asm-i386/string.h b/include/asm-i386/string.h
--- a/include/asm-i386/string.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-i386/string.h	Thu Jan  8 23:00:24 2004
@@ -291,7 +291,7 @@
 #define struct_cpy(x,y) 			\
 ({						\
 	if (sizeof(*(x)) != sizeof(*(y))) 	\
-		__struct_cpy_bug;		\
+		__struct_cpy_bug();		\
 	memcpy(x, y, sizeof(*(x)));		\
 })
 
@@ -299,14 +299,9 @@
 static inline void * memmove(void * dest,const void * src, size_t n)
 {
 int d0, d1, d2;
-if (dest<src)
-__asm__ __volatile__(
-	"rep\n\t"
-	"movsb"
-	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
-	:"0" (n),"1" (src),"2" (dest)
-	: "memory");
-else
+if (dest<src) {
+	memcpy(dest,src,n);
+} else
 __asm__ __volatile__(
 	"std\n\t"
 	"rep\n\t"
diff -Nru a/include/asm-i386/timer.h b/include/asm-i386/timer.h
--- a/include/asm-i386/timer.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-i386/timer.h	Thu Jan  8 23:00:23 2004
@@ -11,6 +11,7 @@
  *	last timer intruupt.
  */
 struct timer_opts{
+	char* name;
 	int (*init)(char *override);
 	void (*mark_offset)(void);
 	unsigned long (*get_offset)(void);
diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h
--- a/include/asm-ia64/acpi.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/acpi.h	Thu Jan  8 23:00:24 2004
@@ -88,11 +88,8 @@
 
 const char *acpi_get_sysname (void);
 int acpi_request_vector (u32 int_type);
-int acpi_get_prt (struct pci_vector_struct **vectors, int *count);
-int acpi_get_interrupt_model (int *type);
 int acpi_register_irq (u32 gsi, u32 polarity, u32 trigger);
 int acpi_irq_to_vector (u32 irq);
-int acpi_get_addr_space (void *obj, u8 type, u64 *base, u64 *length,u64 *tra);
 
 #ifdef CONFIG_ACPI_NUMA
 #include <asm/numa.h>
diff -Nru a/include/asm-ia64/cpumask.h b/include/asm-ia64/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-ia64/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_IA64_CPUMASK_H
+#define _ASM_IA64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_IA64_CPUMASK_H */
diff -Nru a/include/asm-ia64/ia32.h b/include/asm-ia64/ia32.h
--- a/include/asm-ia64/ia32.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/ia32.h	Thu Jan  8 23:00:24 2004
@@ -6,7 +6,11 @@
 #include <asm/ptrace.h>
 #include <asm/signal.h>
 
-#ifdef CONFIG_IA32_SUPPORT
+#define IA32_NR_syscalls		275 /* length of syscall table */
+
+#ifndef __ASSEMBLY__
+
+# ifdef CONFIG_IA32_SUPPORT
 
 extern void ia32_cpu_init (void);
 extern void ia32_boot_gdt_init (void);
@@ -15,10 +19,12 @@
 extern int ia32_intercept (struct pt_regs *regs, unsigned long isr);
 extern int ia32_clone_tls (struct task_struct *child, struct pt_regs *childregs);
 
-#endif /* !CONFIG_IA32_SUPPORT */
+# endif /* !CONFIG_IA32_SUPPORT */
 
 /* Declare this unconditionally, so we don't get warnings for unreachable code.  */
 extern int ia32_setup_frame1 (int sig, struct k_sigaction *ka, siginfo_t *info,
 			      sigset_t *set, struct pt_regs *regs);
+
+#endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_IA64_IA32_H */
diff -Nru a/include/asm-ia64/intrinsics.h b/include/asm-ia64/intrinsics.h
--- a/include/asm-ia64/intrinsics.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/intrinsics.h	Thu Jan  8 23:00:24 2004
@@ -167,7 +167,7 @@
 	if (_cmpxchg_bugcheck_count-- <= 0) {					\
 		void *ip;							\
 		extern int printk(const char *fmt, ...);			\
-		ip = ia64_getreg(_IA64_REG_IP);					\
+		ip = (void *) ia64_getreg(_IA64_REG_IP);			\
 		printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));	\
 		break;								\
 	}									\
diff -Nru a/include/asm-ia64/mca.h b/include/asm-ia64/mca.h
--- a/include/asm-ia64/mca.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/mca.h	Thu Jan  8 23:00:23 2004
@@ -18,6 +18,7 @@
 #include <asm/param.h>
 #include <asm/sal.h>
 #include <asm/processor.h>
+#include <asm/mca_asm.h>
 
 /* These are the return codes from all the IA64_MCA specific interfaces */
 typedef	int ia64_mca_return_code_t;
@@ -61,6 +62,17 @@
 	IA64_MCA_RENDEZ_CHECKIN_DONE	=	0x1
 };
 
+/* the following data structure is used for TLB error recovery purposes */
+extern struct ia64_mca_tlb_info {
+	u64	cr_lid;
+	u64	percpu_paddr;
+	u64	ptce_base;
+	u32	ptce_count[2];
+	u32	ptce_stride[2];
+	u64	pal_paddr;
+	u64	pal_base;
+} ia64_mca_tlb_list[NR_CPUS];
+
 /* Information maintained by the MC infrastructure */
 typedef struct ia64_mc_info_s {
 	u64		imi_mca_handler;
@@ -141,7 +153,6 @@
 extern int  ia64_log_print(int,prfunc_t);
 extern void ia64_mca_cmc_vector_setup(void);
 extern int  ia64_mca_check_errors(void);
-extern u64  ia64_log_get(int, prfunc_t);
 
 #define PLATFORM_CALL(fn, args)	printk("Platform call TBD\n")
 
diff -Nru a/include/asm-ia64/mmu_context.h b/include/asm-ia64/mmu_context.h
--- a/include/asm-ia64/mmu_context.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/mmu_context.h	Thu Jan  8 23:00:23 2004
@@ -95,12 +95,13 @@
 static inline mm_context_t
 get_mmu_context (struct mm_struct *mm)
 {
+	unsigned long flags;
 	mm_context_t context = mm->context;
 
 	if (context)
 		return context;
 
-	spin_lock(&ia64_ctx.lock);
+	spin_lock_irqsave(&ia64_ctx.lock, flags);
 	{
 		/* re-check, now that we've got the lock: */
 		context = mm->context;
@@ -110,7 +111,7 @@
 			mm->context = context = ia64_ctx.next++;
 		}
 	}
-	spin_unlock(&ia64_ctx.lock);
+	spin_unlock_irqrestore(&ia64_ctx.lock, flags);
 	return context;
 }
 
diff -Nru a/include/asm-ia64/numa.h b/include/asm-ia64/numa.h
--- a/include/asm-ia64/numa.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/numa.h	Thu Jan  8 23:00:23 2004
@@ -24,7 +24,7 @@
 
 #include <asm/mmzone.h>
 
-extern volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned;
+extern volatile u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
 extern volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
 
 /* Stuff below this line could be architecture independent */
diff -Nru a/include/asm-ia64/numnodes.h b/include/asm-ia64/numnodes.h
--- a/include/asm-ia64/numnodes.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/numnodes.h	Thu Jan  8 23:00:24 2004
@@ -5,8 +5,8 @@
 /* Max 8 Nodes */
 #define NODES_SHIFT	3
 #elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC)
-/* Max 128 Nodes */
-#define NODES_SHIFT	7
+/* Max 256 Nodes */
+#define NODES_SHIFT	8
 #endif
 
 #endif /* _ASM_MAX_NUMNODES_H */
diff -Nru a/include/asm-ia64/page.h b/include/asm-ia64/page.h
--- a/include/asm-ia64/page.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/page.h	Thu Jan  8 23:00:23 2004
@@ -63,7 +63,7 @@
 # define HPAGE_SIZE	(__IA64_UL_CONST(1) << HPAGE_SHIFT)
 # define HPAGE_MASK	(~(HPAGE_SIZE - 1))
 # define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
-# define ARCH_HAS_VALID_HUGEPAGE_RANGE
+# define ARCH_HAS_HUGEPAGE_ONLY_RANGE
 #endif /* CONFIG_HUGETLB_PAGE */
 
 #ifdef __ASSEMBLY__
@@ -137,7 +137,9 @@
 # define htlbpage_to_page(x)	((REGION_NUMBER(x) << 61)				\
 				 | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
 # define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)
-extern int  check_valid_hugepage_range(unsigned long addr, unsigned long len);
+# define is_hugepage_only_range(addr, len)		\
+	 (REGION_NUMBER(addr) == REGION_HPAGE &&	\
+	  REGION_NUMBER((addr)+(len)) == REGION_HPAGE)
 #endif
 
 static __inline__ int
diff -Nru a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h
--- a/include/asm-ia64/pal.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/pal.h	Thu Jan  8 23:00:24 2004
@@ -461,23 +461,13 @@
 } pal_processor_state_info_t;
 
 typedef struct pal_cache_check_info_s {
-	u64		reserved1	: 16,
-			way		: 5,	/* Way in which the
-						 * error occurred
-						 */
-			reserved2	: 1,
-			mc		: 1,	/* Machine check corrected */
-			tv		: 1,	/* Target address
-						 * structure is valid
-						 */
-
-			wv		: 1,	/* Way field valid */
-			op		: 3,	/* Type of cache
+	u64		op		: 4,	/* Type of cache
 						 * operation that
 						 * caused the machine
 						 * check.
 						 */
-
+			level		: 2,	/* Cache level */
+			reserved1	: 2,
 			dl		: 1,	/* Failure in data part
 						 * of cache line
 						 */
@@ -486,11 +476,34 @@
 						 */
 			dc		: 1,	/* Failure in dcache */
 			ic		: 1,	/* Failure in icache */
-			index		: 24,	/* Cache line index */
-			mv		: 1,	/* mesi valid */
 			mesi		: 3,	/* Cache line state */
-			level		: 4;	/* Cache level */
+			mv		: 1,	/* mesi valid */
+			way		: 5,	/* Way in which the
+						 * error occurred
+						 */
+			wiv		: 1,	/* Way field valid */
+			reserved2	: 10,
+
+			index		: 20,	/* Cache line index */
+			reserved3	: 2,
 
+			is		: 1,	/* instruction set (1 == ia32) */
+			iv		: 1,	/* instruction set field valid */
+			pl		: 2,	/* privilege level */
+			pv		: 1,	/* privilege level field valid */
+			mcc		: 1,	/* Machine check corrected */
+			tv		: 1,	/* Target address
+						 * structure is valid
+						 */
+			rq		: 1,	/* Requester identifier
+						 * structure is valid
+						 */
+			rp		: 1,	/* Responder identifier
+						 * structure is valid
+						 */
+			pi		: 1;	/* Precise instruction pointer
+						 * structure is valid
+						 */
 } pal_cache_check_info_t;
 
 typedef struct pal_tlb_check_info_s {
@@ -498,18 +511,38 @@
 	u64		tr_slot		: 8,	/* Slot# of TR where
 						 * error occurred
 						 */
-			reserved2	: 8,
+			trv		: 1,	/* tr_slot field is valid */
+			reserved1	: 1,
+			level		: 2,	/* TLB level where failure occurred */
+			reserved2	: 4,
 			dtr		: 1,	/* Fail in data TR */
 			itr		: 1,	/* Fail in inst TR */
 			dtc		: 1,	/* Fail in data TC */
 			itc		: 1,	/* Fail in inst. TC */
-			mc		: 1,	/* Machine check corrected */
-			reserved1	: 43;
+			op		: 4,	/* Cache operation */
+			reserved3	: 30,
 
+			is		: 1,	/* instruction set (1 == ia32) */
+			iv		: 1,	/* instruction set field valid */
+			pl		: 2,	/* privilege level */
+			pv		: 1,	/* privilege level field valid */
+			mcc		: 1,	/* Machine check corrected */
+			tv		: 1,	/* Target address
+						 * structure is valid
+						 */
+			rq		: 1,	/* Requester identifier
+						 * structure is valid
+						 */
+			rp		: 1,	/* Responder identifier
+						 * structure is valid
+						 */
+			pi		: 1;	/* Precise instruction pointer
+						 * structure is valid
+						 */
 } pal_tlb_check_info_t;
 
 typedef struct pal_bus_check_info_s {
-	u64		size		: 5,	/* Xaction size*/
+	u64		size		: 5,	/* Xaction size */
 			ib		: 1,	/* Internal bus error */
 			eb		: 1,	/* External bus error */
 			cc		: 1,	/* Error occurred
@@ -518,22 +551,99 @@
 						 */
 			type		: 8,	/* Bus xaction type*/
 			sev		: 5,	/* Bus error severity*/
-			tv		: 1,	/* Targ addr valid */
-			rp		: 1,	/* Resp addr valid */
-			rq		: 1,	/* Req addr valid */
+			hier		: 2,	/* Bus hierarchy level */
+			reserved1	: 1,
 			bsi		: 8,	/* Bus error status
 						 * info
 						 */
-			mc		: 1,	/* Machine check corrected */
-			reserved1	: 31;
+			reserved2	: 22,
+
+			is		: 1,	/* instruction set (1 == ia32) */
+			iv		: 1,	/* instruction set field valid */
+			pl		: 2,	/* privilege level */
+			pv		: 1,	/* privilege level field valid */
+			mcc		: 1,	/* Machine check corrected */
+			tv		: 1,	/* Target address
+						 * structure is valid
+						 */
+			rq		: 1,	/* Requester identifier
+						 * structure is valid
+						 */
+			rp		: 1,	/* Responder identifier
+						 * structure is valid
+						 */
+			pi		: 1;	/* Precise instruction pointer
+						 * structure is valid
+						 */
 } pal_bus_check_info_t;
 
+typedef struct pal_reg_file_check_info_s {
+	u64		id		: 4,	/* Register file identifier */
+			op		: 4,	/* Type of register
+						 * operation that
+						 * caused the machine
+						 * check.
+						 */
+			reg_num		: 7,	/* Register number */
+			rnv		: 1,	/* reg_num valid */
+			reserved2	: 38,
+
+			is		: 1,	/* instruction set (1 == ia32) */
+			iv		: 1,	/* instruction set field valid */
+			pl		: 2,	/* privilege level */
+			pv		: 1,	/* privilege level field valid */
+			mcc		: 1,	/* Machine check corrected */
+			reserved3	: 3,
+			pi		: 1;	/* Precise instruction pointer
+						 * structure is valid
+						 */
+} pal_reg_file_check_info_t;
+
+typedef struct pal_uarch_check_info_s {
+	u64		sid		: 5,	/* Structure identification */
+			level		: 3,	/* Level of failure */
+			array_id	: 4,	/* Array identification */
+			op		: 4,	/* Type of
+						 * operation that
+						 * caused the machine
+						 * check.
+						 */
+			way		: 6,	/* Way of structure */
+			wv		: 1,	/* way valid */
+			xv		: 1,	/* index valid */
+			reserved1	: 8,
+			index		: 8,	/* Index or set of the uarch
+						 * structure that failed.
+						 */
+			reserved2	: 24,
+
+			is		: 1,	/* instruction set (1 == ia32) */
+			iv		: 1,	/* instruction set field valid */
+			pl		: 2,	/* privilege level */
+			pv		: 1,	/* privilege level field valid */
+			mcc		: 1,	/* Machine check corrected */
+			tv		: 1,	/* Target address
+						 * structure is valid
+						 */
+			rq		: 1,	/* Requester identifier
+						 * structure is valid
+						 */
+			rp		: 1,	/* Responder identifier
+						 * structure is valid
+						 */
+			pi		: 1;	/* Precise instruction pointer
+						 * structure is valid
+						 */
+} pal_uarch_check_info_t;
+
 typedef union pal_mc_error_info_u {
 	u64				pmei_data;
 	pal_processor_state_info_t	pme_processor;
 	pal_cache_check_info_t		pme_cache;
 	pal_tlb_check_info_t		pme_tlb;
 	pal_bus_check_info_t		pme_bus;
+	pal_reg_file_check_info_t	pme_reg_file;
+	pal_uarch_check_info_t		pme_uarch;
 } pal_mc_error_info_t;
 
 #define pmci_proc_unknown_check			pme_processor.uc
diff -Nru a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h
--- a/include/asm-ia64/pgtable.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/pgtable.h	Thu Jan  8 23:00:23 2004
@@ -230,6 +230,10 @@
 
 #define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))
 
+/* This takes a physical page address that is used by the remapping functions */
+#define mk_pte_phys(physpage, pgprot) \
+({ pte_t __pte; pte_val(__pte) = physpage + pgprot_val(pgprot); __pte; })
+
 #define pte_modify(_pte, newprot) \
 	(__pte((pte_val(_pte) & ~_PAGE_CHG_MASK) | (pgprot_val(newprot) & _PAGE_CHG_MASK)))
 
@@ -454,6 +458,15 @@
 
 /* We provide our own get_unmapped_area to cope with VA holes for userland */
 #define HAVE_ARCH_UNMAPPED_AREA
+
+#ifdef CONFIG_HUGETLB_PAGE
+#define HUGETLB_PGDIR_SHIFT	(HPAGE_SHIFT + 2*(PAGE_SHIFT-3))
+#define HUGETLB_PGDIR_SIZE	(__IA64_UL(1) << HUGETLB_PGDIR_SHIFT)
+#define HUGETLB_PGDIR_MASK	(~(HUGETLB_PGDIR_SIZE-1))
+struct mmu_gather;
+extern void hugetlb_free_pgtables(struct mmu_gather *tlb,
+	struct vm_area_struct * prev, unsigned long start, unsigned long end);
+#endif
 
 typedef pte_t *pte_addr_t;
 
diff -Nru a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h
--- a/include/asm-ia64/processor.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/processor.h	Thu Jan  8 23:00:23 2004
@@ -64,7 +64,7 @@
 #define IA64_THREAD_PM_VALID	(__IA64_UL(1) << 2)	/* performance registers valid? */
 #define IA64_THREAD_UAC_NOPRINT	(__IA64_UL(1) << 3)	/* don't log unaligned accesses */
 #define IA64_THREAD_UAC_SIGBUS	(__IA64_UL(1) << 4)	/* generate SIGBUS on unaligned acc. */
-#define IA64_THREAD_KRBS_SYNCED	(__IA64_UL(1) << 5)	/* krbs synced with process vm? */
+							/* bit 5 is currently unused */
 #define IA64_THREAD_FPEMU_NOPRINT (__IA64_UL(1) << 6)	/* don't log any fpswa faults */
 #define IA64_THREAD_FPEMU_SIGFPE  (__IA64_UL(1) << 7)	/* send a SIGFPE for fpswa faults */
 #define IA64_THREAD_XSTACK	(__IA64_UL(1) << 8)	/* stack executable by default? */
diff -Nru a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h
--- a/include/asm-ia64/sal.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/sal.h	Thu Jan  8 23:00:24 2004
@@ -71,7 +71,9 @@
 # define SAL_CALL_REENTRANT(result,args...) do {	\
 	struct ia64_fpreg __ia64_scs_fr[6];		\
 	ia64_save_scratch_fpregs(__ia64_scs_fr);	\
+	preempt_disable();				\
 	__SAL_CALL(result, args);			\
+	preempt_enable();				\
 	ia64_load_scratch_fpregs(__ia64_scs_fr);	\
 } while (0)
 
@@ -725,14 +727,16 @@
  * Allow the OS to specify the interrupt number to be used by SAL to interrupt OS during
  * the machine check rendezvous sequence as well as the mechanism to wake up the
  * non-monarch processor at the end of machine check processing.
+ * Returns the complete ia64_sal_retval because some calls return more than just a status
+ * value.
  */
-static inline s64
+static inline struct ia64_sal_retval
 ia64_sal_mc_set_params (u64 param_type, u64 i_or_m, u64 i_or_m_val, u64 timeout, u64 rz_always)
 {
 	struct ia64_sal_retval isrv;
 	SAL_CALL(isrv, SAL_MC_SET_PARAMS, param_type, i_or_m, i_or_m_val,
 		 timeout, rz_always, 0, 0);
-	return isrv.status;
+	return isrv;
 }
 
 /* Read from PCI configuration space */
@@ -804,10 +808,12 @@
 
 extern unsigned long sal_platform_features;
 
+extern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *);
+
 struct sal_ret_values {
 	long r8; long r9; long r10; long r11;
 };
 
 #endif /* __ASSEMBLY__ */
 
-#endif /* _ASM_IA64_PAL_H */
+#endif /* _ASM_IA64_SAL_H */
diff -Nru a/include/asm-ia64/spinlock.h b/include/asm-ia64/spinlock.h
--- a/include/asm-ia64/spinlock.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/spinlock.h	Thu Jan  8 23:00:23 2004
@@ -39,7 +39,7 @@
 {
 	register volatile unsigned int *ptr asm ("r31") = &lock->lock;
 
-#if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
+#if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
 # ifdef CONFIG_ITANIUM
 	/* don't use brl on Itanium... */
 	asm volatile ("{\n\t"
diff -Nru a/include/asm-ia64/statfs.h b/include/asm-ia64/statfs.h
--- a/include/asm-ia64/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ia64/statfs.h	Thu Jan  8 23:00:24 2004
@@ -43,5 +43,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+} __attribute__((packed));
 
 #endif /* _ASM_IA64_STATFS_H */
diff -Nru a/include/asm-ia64/system.h b/include/asm-ia64/system.h
--- a/include/asm-ia64/system.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/system.h	Thu Jan  8 23:00:23 2004
@@ -19,8 +19,11 @@
 #include <asm/pal.h>
 #include <asm/percpu.h>
 
-/* 0xa000000000000000 - 0xa000000000000000+PERCPU_PAGE_SIZE remain unmapped */
-#define GATE_ADDR		(0xa000000000000000 + PERCPU_PAGE_SIZE)
+#define GATE_ADDR		(0xa000000000000000)
+/*
+ * 0xa000000000000000+2*PERCPU_PAGE_SIZE
+ * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
+ */
 #define KERNEL_START		 0xa000000100000000
 #define PERCPU_ADDR		(-PERCPU_PAGE_SIZE)
 
diff -Nru a/include/asm-ia64/uaccess.h b/include/asm-ia64/uaccess.h
--- a/include/asm-ia64/uaccess.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ia64/uaccess.h	Thu Jan  8 23:00:23 2004
@@ -50,7 +50,7 @@
 #define get_fs()  (current_thread_info()->addr_limit)
 #define set_fs(x) (current_thread_info()->addr_limit = (x))
 
-#define segment_eq(a,b)	((a).seg == (b).seg)
+#define segment_eq(a, b)	((a).seg == (b).seg)
 
 /*
  * When accessing user memory, we need to make sure the entire area really is in
@@ -58,16 +58,16 @@
  * address TASK_SIZE is never valid.  We also need to make sure that the address doesn't
  * point inside the virtually mapped linear page table.
  */
-#define __access_ok(addr,size,segment)						\
-	likely(((unsigned long) (addr)) <= (segment).seg			\
-	       && ((segment).seg == KERNEL_DS.seg				\
-		   || REGION_OFFSET((unsigned long) (addr)) < RGN_MAP_LIMIT))
-#define access_ok(type,addr,size)	__access_ok((addr),(size),get_fs())
+#define __access_ok(addr, size, segment)					\
+	(likely((unsigned long) (addr) <= (segment).seg)			\
+	 && ((segment).seg == KERNEL_DS.seg					\
+	     || likely(REGION_OFFSET((unsigned long) (addr)) < RGN_MAP_LIMIT)))
+#define access_ok(type, addr, size)	__access_ok((addr), (size), get_fs())
 
 static inline int
 verify_area (int type, const void *addr, unsigned long size)
 {
-	return access_ok(type,addr,size) ? 0 : -EFAULT;
+	return access_ok(type, addr, size) ? 0 : -EFAULT;
 }
 
 /*
@@ -78,292 +78,173 @@
  * (a) re-use the arguments for side effects (sizeof/typeof is ok)
  * (b) require any knowledge of processes at this stage
  */
-#define put_user(x,ptr)	__put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)),get_fs())
-#define get_user(x,ptr)	__get_user_check((x),(ptr),sizeof(*(ptr)),get_fs())
+#define put_user(x, ptr)	__put_user_check((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)), get_fs())
+#define get_user(x, ptr)	__get_user_check((x), (ptr), sizeof(*(ptr)), get_fs())
 
 /*
  * The "__xxx" versions do not do address space checking, useful when
  * doing multiple accesses to the same area (the programmer has to do the
  * checks by hand with "access_ok()")
  */
-#define __put_user(x,ptr)	__put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-#define __get_user(x,ptr)	__get_user_nocheck((x),(ptr),sizeof(*(ptr)))
+#define __put_user(x, ptr)	__put_user_nocheck((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
+#define __get_user(x, ptr)	__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
 
 #ifdef ASM_SUPPORTED
-
-extern void __get_user_unknown (void);
-
-#define __get_user_nocheck(x,ptr,size)		\
-({						\
-	register long __gu_err asm ("r8") = 0;	\
-	register long __gu_val asm ("r9") = 0;	\
-	switch (size) {				\
-	  case 1: __get_user_8(ptr); break;	\
-	  case 2: __get_user_16(ptr); break;	\
-	  case 4: __get_user_32(ptr); break;	\
-	  case 8: __get_user_64(ptr); break;	\
-	  default: __get_user_unknown(); break;	\
-	}					\
-	(x) = (__typeof__(*(ptr))) __gu_val;	\
-	__gu_err;				\
-})
-
-#define __get_user_check(x,ptr,size,segment)			\
-({								\
-	register long __gu_err asm ("r8") = -EFAULT;		\
-	register long __gu_val asm ("r9") = 0;			\
-	const __typeof__(*(ptr)) *__gu_addr = (ptr);		\
-	if (__access_ok((long)__gu_addr,size,segment)) {	\
-		__gu_err = 0;					\
-		switch (size) {					\
-		  case 1: __get_user_8(__gu_addr); break;	\
-		  case 2: __get_user_16(__gu_addr); break;	\
-		  case 4: __get_user_32(__gu_addr); break;	\
-		  case 8: __get_user_64(__gu_addr); break;	\
-		  default: __get_user_unknown(); break;		\
-		}						\
-	}							\
-	(x) = (__typeof__(*(ptr))) __gu_val;			\
-	__gu_err;						\
-})
-
-struct __large_struct { unsigned long buf[100]; };
-#define __m(x) (*(struct __large_struct *)(x))
+  struct __large_struct { unsigned long buf[100]; };
+# define __m(x) (*(struct __large_struct *)(x))
 
 /* We need to declare the __ex_table section before we can use it in .xdata.  */
 asm (".section \"__ex_table\", \"a\"\n\t.previous");
 
-#define __get_user_64(addr)									\
-	asm ("\n[1:]\tld8 %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"	\
-	     "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n"						\
-	     "[1:]"										\
-	     : "=r"(__gu_val), "=r"(__gu_err) : "m"(__m(addr)), "1"(__gu_err));
-
-#define __get_user_32(addr)									\
-	asm ("\n[1:]\tld4 %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"	\
-	     "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n"						\
-	     "[1:]"										\
-	     : "=r"(__gu_val), "=r"(__gu_err) : "m"(__m(addr)), "1"(__gu_err));
-
-#define __get_user_16(addr)									\
-	asm ("\n[1:]\tld2 %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"	\
-	     "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n"						\
-	     "[1:]"										\
-	     : "=r"(__gu_val), "=r"(__gu_err) : "m"(__m(addr)), "1"(__gu_err));
-
-#define __get_user_8(addr)									\
-	asm ("\n[1:]\tld1 %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"	\
+# define __get_user_size(val, addr, n, err)							\
+do {												\
+	register long __gu_r8 asm ("r8") = 0;							\
+	register long __gu_r9 asm ("r9");							\
+	asm ("\n[1:]\tld"#n" %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n"	\
 	     "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n"						\
 	     "[1:]"										\
-	     : "=r"(__gu_val), "=r"(__gu_err) : "m"(__m(addr)), "1"(__gu_err));
-
-extern void __put_user_unknown (void);
-
-#define __put_user_nocheck(x,ptr,size)		\
-({						\
-	register long __pu_err asm ("r8") = 0;	\
-	switch (size) {				\
-	  case 1: __put_user_8(x,ptr); break;	\
-	  case 2: __put_user_16(x,ptr); break;	\
-	  case 4: __put_user_32(x,ptr); break;	\
-	  case 8: __put_user_64(x,ptr); break;	\
-	  default: __put_user_unknown(); break;	\
-	}					\
-	__pu_err;				\
-})
-
-#define __put_user_check(x,ptr,size,segment)			\
-({								\
-	register long __pu_err asm ("r8") = -EFAULT;		\
-	__typeof__(*(ptr)) *__pu_addr = (ptr);			\
-	if (__access_ok((long)__pu_addr,size,segment)) {	\
-		__pu_err = 0;					\
-		switch (size) {					\
-		  case 1: __put_user_8(x,__pu_addr); break;	\
-		  case 2: __put_user_16(x,__pu_addr); break;	\
-		  case 4: __put_user_32(x,__pu_addr); break;	\
-		  case 8: __put_user_64(x,__pu_addr); break;	\
-		  default: __put_user_unknown(); break;		\
-		}						\
-	}							\
-	__pu_err;						\
-})
+	     : "=r"(__gu_r9), "=r"(__gu_r8) : "m"(__m(addr)), "1"(__gu_r8));			\
+	(err) = __gu_r8;									\
+	(val) = __gu_r9;									\
+} while (0)
 
 /*
- * The "__put_user_xx()" macros tell gcc they read from memory
- * instead of writing: this is because they do not write to
- * any memory gcc knows about, so there are no aliasing issues
+ * The "__put_user_size()" macro tells gcc it reads from memory instead of writing it.  This
+ * is because they do not write to any memory gcc knows about, so there are no aliasing
+ * issues.
  */
-#define __put_user_64(x,addr)								\
-	asm volatile (									\
-		"\n[1:]\tst8 %1=%r2%P1\t// %0 gets overwritten by exception handler\n"	\
-		"\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"				\
-		"[1:]"									\
-		: "=r"(__pu_err) : "m"(__m(addr)), "rO"(x), "0"(__pu_err))
-
-#define __put_user_32(x,addr)								\
-	asm volatile (									\
-		"\n[1:]\tst4 %1=%r2%P1\t// %0 gets overwritten by exception handler\n"	\
-		"\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"				\
-		"[1:]"									\
-		: "=r"(__pu_err) : "m"(__m(addr)), "rO"(x), "0"(__pu_err))
-
-#define __put_user_16(x,addr)								\
-	asm volatile (									\
-		"\n[1:]\tst2 %1=%r2%P1\t// %0 gets overwritten by exception handler\n"	\
-		"\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"				\
-		"[1:]"									\
-		: "=r"(__pu_err) : "m"(__m(addr)), "rO"(x), "0"(__pu_err))
-
-#define __put_user_8(x,addr)								\
-	asm volatile (									\
-		"\n[1:]\tst1 %1=%r2%P1\t// %0 gets overwritten by exception handler\n"	\
-		"\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"				\
-		"[1:]"									\
-		: "=r"(__pu_err) : "m"(__m(addr)), "rO"(x), "0"(__pu_err))
+# define __put_user_size(val, addr, n, err)							\
+do {												\
+	register long __pu_r8 asm ("r8") = 0;							\
+	asm volatile ("\n[1:]\tst"#n" %1=%r2%P1\t// %0 gets overwritten by exception handler\n"	\
+		      "\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"					\
+		      "[1:]"									\
+		      : "=r"(__pu_r8) : "m"(__m(addr)), "rO"(val), "0"(__pu_r8));		\
+	(err) = __pu_r8;									\
+} while (0)
 
 #else /* !ASM_SUPPORTED */
-
-#define RELOC_TYPE	2	/* ip-rel */
-
-#define __put_user_xx(val, addr, size, err)							\
-	__st_user("__ex_table", (unsigned long) addr, size, RELOC_TYPE, (unsigned long) (val));	\
-	(err) = ia64_getreg(_IA64_REG_R8);
-
-#define __get_user_xx(val, addr, size, err)					\
-	__ld_user("__ex_table", (unsigned long) addr, size, RELOC_TYPE);	\
-	(err) = ia64_getreg(_IA64_REG_R8);					\
-	(val) = ia64_getreg(_IA64_REG_R9);
+# define RELOC_TYPE	2	/* ip-rel */
+# define __get_user_size(val, addr, n, err)				\
+do {									\
+	__ld_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE);	\
+	(err) = ia64_getreg(_IA64_REG_R8);				\
+	(val) = ia64_getreg(_IA64_REG_R9);				\
+} while (0)
+# define __put_user_size(val, addr, n, err)							\
+do {												\
+	__st_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE, (unsigned long) (val));	\
+	(err) = ia64_getreg(_IA64_REG_R8);							\
+} while (0)
+#endif /* !ASM_SUPPORTED */
 
 extern void __get_user_unknown (void);
 
-#define __get_user_nocheck(x, ptr, size)				\
-({									\
-	register long __gu_err = 0;					\
-	register long __gu_val = 0;					\
-	const __typeof__(*(ptr)) *__gu_addr = (ptr);			\
-	switch (size) {							\
-	      case 1: case 2: case 4: case 8:				\
-		__get_user_xx(__gu_val, __gu_addr, size, __gu_err);	\
-		break;							\
-	      default:							\
-		__get_user_unknown();					\
-		break;							\
-        }								\
-        (x) = (__typeof__(*(ptr))) __gu_val;				\
-        __gu_err;							\
+/*
+ * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
+ * could clobber r8 and r9 (among others).  Thus, be careful not to evaluate it while
+ * using r8/r9.
+ */
+#define __do_get_user(check, x, ptr, size, segment)					\
+({											\
+	const __typeof__(*(ptr)) *__gu_ptr = (ptr);					\
+	__typeof__ (size) __gu_size = (size);						\
+	long __gu_err = -EFAULT, __gu_val = 0;						\
+											\
+	if (!check || __access_ok((long) __gu_ptr, size, segment))			\
+		switch (__gu_size) {							\
+		      case 1: __get_user_size(__gu_val, __gu_ptr, 1, __gu_err); break;	\
+		      case 2: __get_user_size(__gu_val, __gu_ptr, 2, __gu_err); break;	\
+		      case 4: __get_user_size(__gu_val, __gu_ptr, 4, __gu_err); break;	\
+		      case 8: __get_user_size(__gu_val, __gu_ptr, 8, __gu_err); break;	\
+		      default: __get_user_unknown(); break;				\
+		}									\
+	(x) = (__typeof__(*(__gu_ptr))) __gu_val;					\
+	__gu_err;									\
 })
 
-#define __get_user_check(x,ptr,size,segment)					\
-({										\
-	register long __gu_err = -EFAULT;					\
-	register long __gu_val  = 0;						\
-	const __typeof__(*(ptr)) *__gu_addr = (ptr);				\
-	if (__access_ok((long) __gu_addr, size, segment)) {			\
-		switch (size) {							\
-		      case 1: case 2: case 4: case 8:				\
-			__get_user_xx(__gu_val, __gu_addr, size, __gu_err);	\
-			break;							\
-		      default:							\
-			__get_user_unknown(); break;				\
-		}								\
-	}									\
-	(x) = (__typeof__(*(ptr))) __gu_val;					\
-	__gu_err;								\
-})
+#define __get_user_nocheck(x, ptr, size)	__do_get_user(0, x, ptr, size, KERNEL_DS)
+#define __get_user_check(x, ptr, size, segment)	__do_get_user(1, x, ptr, size, segment)
 
 extern void __put_user_unknown (void);
 
-#define __put_user_nocheck(x, ptr, size)			\
-({								\
-	int __pu_err = 0;					\
-	__typeof__(*(ptr)) *__pu_addr = (ptr);			\
-	switch (size) {						\
-	      case 1: case 2: case 4: case 8:			\
-	  	__put_user_xx(x, __pu_addr, size, __pu_err);	\
-		break;						\
-	      default:						\
-	  	__put_user_unknown(); break;			\
-	}							\
-	__pu_err;						\
-})
-
-#define __put_user_check(x,ptr,size,segment)				\
-({									\
-	register long __pu_err = -EFAULT;				\
-	__typeof__(*(ptr)) *__pu_addr = (ptr);				\
-	if (__access_ok((long)__pu_addr,size,segment)) {		\
-		switch (size) {						\
-		      case 1: case 2: case 4: case 8:			\
-			__put_user_xx(x,__pu_addr, size, __pu_err);	\
-			break;						\
-		      default:						\
-			__put_user_unknown(); break;			\
-		}							\
-	}								\
-	__pu_err;							\
+/*
+ * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
+ * could clobber r8 (among others).  Thus, be careful not to evaluate them while using r8.
+ */
+#define __do_put_user(check, x, ptr, size, segment)					\
+({											\
+	__typeof__ (x) __pu_x = (x);							\
+	__typeof__ (*(ptr)) *__pu_ptr = (ptr);						\
+	__typeof__ (size) __pu_size = (size);						\
+	long __pu_err = -EFAULT;							\
+											\
+	if (!check || __access_ok((long) __pu_ptr, __pu_size, segment))			\
+		switch (__pu_size) {							\
+		      case 1: __put_user_size(__pu_x, __pu_ptr, 1, __pu_err); break;	\
+		      case 2: __put_user_size(__pu_x, __pu_ptr, 2, __pu_err); break;	\
+		      case 4: __put_user_size(__pu_x, __pu_ptr, 4, __pu_err); break;	\
+		      case 8: __put_user_size(__pu_x, __pu_ptr, 8, __pu_err); break;	\
+		      default: __put_user_unknown(); break;				\
+		}									\
+	__pu_err;									\
 })
 
-#endif /* !ASM_SUPPORTED */
+#define __put_user_nocheck(x, ptr, size)	__do_put_user(0, x, ptr, size, KERNEL_DS)
+#define __put_user_check(x, ptr, size, segment)	__do_put_user(1, x, ptr, size, segment)
 
 /*
  * Complex access routines
  */
 extern unsigned long __copy_user (void *to, const void *from, unsigned long count);
 
-#define __copy_to_user(to,from,n)	__copy_user((to), (from), (n))
-#define __copy_from_user(to,from,n)	__copy_user((to), (from), (n))
+#define __copy_to_user(to, from, n)	__copy_user((to), (from), (n))
+#define __copy_from_user(to, from, n)	__copy_user((to), (from), (n))
 
-#define copy_to_user(to,from,n)   __copy_tofrom_user((to), (from), (n), 1)
-#define copy_from_user(to,from,n) __copy_tofrom_user((to), (from), (n), 0)
+#define copy_to_user(to, from, n)	__copy_tofrom_user((to), (from), (n), 1)
+#define copy_from_user(to, from, n)	__copy_tofrom_user((to), (from), (n), 0)
 
-#define __copy_tofrom_user(to,from,n,check_to)							\
-({												\
-	void *__cu_to = (to);									\
-	const void *__cu_from = (from);								\
-	long __cu_len = (n);									\
-												\
-	if (__access_ok((long) ((check_to) ? __cu_to : __cu_from), __cu_len, get_fs())) {	\
-		__cu_len = __copy_user(__cu_to, __cu_from, __cu_len);				\
-	}											\
-	__cu_len;										\
+#define __copy_tofrom_user(to, from, n, check_to)					\
+({											\
+	void *__cu_to = (to);								\
+	const void *__cu_from = (from);							\
+	long __cu_len = (n);								\
+											\
+	if (__access_ok((long) ((check_to) ? __cu_to : __cu_from), __cu_len, get_fs()))	\
+		__cu_len = __copy_user(__cu_to, __cu_from, __cu_len);			\
+	__cu_len;									\
 })
 
-#define __copy_in_user(to, from, size)          \
-        __copy_user((to), (from), (size))
+#define __copy_in_user(to, from, size)	__copy_user((to), (from), (size))
 
 static inline unsigned long
 copy_in_user (void *to, const void *from, unsigned long n)
 {
-	if (likely(access_ok(VERIFY_READ, from, n) &&
-	    access_ok(VERIFY_WRITE, to, n)))
+	if (likely(access_ok(VERIFY_READ, from, n) && access_ok(VERIFY_WRITE, to, n)))
 		n = __copy_user(to, from, n);
 	return n;
 }
 
 extern unsigned long __do_clear_user (void *, unsigned long);
 
-#define __clear_user(to,n)			\
-({						\
-	__do_clear_user(to,n);			\
-})
+#define __clear_user(to, n)		__do_clear_user(to, n)
 
-#define clear_user(to,n)					\
+#define clear_user(to, n)					\
 ({								\
 	unsigned long __cu_len = (n);				\
-	if (__access_ok((long) to, __cu_len, get_fs())) {	\
+	if (__access_ok((long) to, __cu_len, get_fs()))		\
 		__cu_len = __do_clear_user(to, __cu_len);	\
-	}							\
 	__cu_len;						\
 })
 
 
-/* Returns: -EFAULT if exception before terminator, N if the entire
-   buffer filled, else strlen.  */
-
+/*
+ * 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)					\
+#define strncpy_from_user(to, from, n)					\
 ({									\
 	const char * __sfu_from = (from);				\
 	long __sfu_ret = -EFAULT;					\
diff -Nru a/include/asm-m68k/cpumask.h b/include/asm-m68k/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-m68k/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_M68K_CPUMASK_H
+#define _ASM_M68K_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_M68K_CPUMASK_H */
diff -Nru a/include/asm-m68knommu/cpumask.h b/include/asm-m68knommu/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-m68knommu/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_M68KNOMMU_CPUMASK_H
+#define _ASM_M68KNOMMU_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_M68KNOMMU_CPUMASK_H */
diff -Nru a/include/asm-mips/cpumask.h b/include/asm-mips/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-mips/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_MIPS_CPUMASK_H
+#define _ASM_MIPS_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_MIPS_CPUMASK_H */
diff -Nru a/include/asm-mips/statfs.h b/include/asm-mips/statfs.h
--- a/include/asm-mips/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-mips/statfs.h	Thu Jan  8 23:00:24 2004
@@ -75,6 +75,20 @@
 	long		f_spare[6];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
 
 #endif /* _ASM_STATFS_H */
diff -Nru a/include/asm-parisc/cpumask.h b/include/asm-parisc/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-parisc/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_PARISC_CPUMASK_H
+#define _ASM_PARISC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PARISC_CPUMASK_H */
diff -Nru a/include/asm-parisc/dma-mapping.h b/include/asm-parisc/dma-mapping.h
--- a/include/asm-parisc/dma-mapping.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-parisc/dma-mapping.h	Thu Jan  8 23:00:23 2004
@@ -5,9 +5,7 @@
 #include <linux/config.h>
 #include <asm/cacheflush.h>
 
-/*
-** See Documentation/DMA-mapping.txt
-*/
+/* See Documentation/DMA-mapping.txt */
 struct hppa_dma_ops {
 	int  (*dma_supported)(struct device *dev, u64 mask);
 	void *(*alloc_consistent)(struct device *dev, size_t size, dma_addr_t *iova, int flag);
@@ -208,15 +206,13 @@
 		struct resource *res);
 int ccio_allocate_resource(const struct parisc_device *dev,
 		struct resource *res, unsigned long size,
-		unsigned long min, unsigned long max, unsigned long align,
-		void (*alignf)(void *, struct resource *, unsigned long, unsigned long),
-		void *alignf_data);
+		unsigned long min, unsigned long max, unsigned long align);
 #else /* !CONFIG_IOMMU_CCIO */
 #define ccio_get_iommu(dev) NULL
 #define ccio_request_resource(dev, res) request_resource(&iomem_resource, res)
-#define ccio_allocate_resource(dev, res, size, min, max, align, alignf, data) \
+#define ccio_allocate_resource(dev, res, size, min, max, align) \
 		allocate_resource(&iomem_resource, res, size, min, max, \
-				align, alignf, data)
+				align, NULL, NULL)
 #endif /* !CONFIG_IOMMU_CCIO */
 
 #ifdef CONFIG_IOMMU_SBA
diff -Nru a/include/asm-parisc/ioctl.h b/include/asm-parisc/ioctl.h
--- a/include/asm-parisc/ioctl.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-parisc/ioctl.h	Thu Jan  8 23:00:23 2004
@@ -45,7 +45,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
diff -Nru a/include/asm-parisc/statfs.h b/include/asm-parisc/statfs.h
--- a/include/asm-parisc/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-parisc/statfs.h	Thu Jan  8 23:00:24 2004
@@ -41,4 +41,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
diff -Nru a/include/asm-parisc/uaccess.h b/include/asm-parisc/uaccess.h
--- a/include/asm-parisc/uaccess.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-parisc/uaccess.h	Thu Jan  8 23:00:23 2004
@@ -40,10 +40,10 @@
 #define get_user __get_user
 
 #if BITS_PER_LONG == 32
-#define LDD_KERNEL(ptr) __get_kernel_bad();
-#define LDD_USER(ptr) __get_user_bad();
-#define STD_KERNEL(x, ptr) __put_kernel_asm64((u32)x,ptr)
-#define STD_USER(x, ptr) __put_user_asm64((u32)x,ptr)
+#define LDD_KERNEL(ptr)		__get_kernel_bad();
+#define LDD_USER(ptr)		__get_user_bad();
+#define STD_KERNEL(x, ptr)	__put_kernel_asm64(x,ptr)
+#define STD_USER(x, ptr)	__put_user_asm64(x,ptr)
 #else
 #define LDD_KERNEL(ptr) __get_kernel_asm("ldd",ptr)
 #define LDD_USER(ptr) __get_user_asm("ldd",ptr)
@@ -256,11 +256,12 @@
  * Complex access routines -- external declarations
  */
 
-extern unsigned long lcopy_to_user(void *, const void *, unsigned long);
-extern unsigned long lcopy_from_user(void *, const void *, unsigned long);
-extern long lstrncpy_from_user(char *, const char *, long);
-extern unsigned lclear_user(void *,unsigned long);
-extern long lstrnlen_user(const char *,long);
+extern unsigned long lcopy_to_user(void __user *, const void *, unsigned long);
+extern unsigned long lcopy_from_user(void *, const void __user *, unsigned long);
+extern unsigned long lcopy_in_user(void __user *, const void __user *, unsigned long);
+extern long lstrncpy_from_user(char *, const char __user *, long);
+extern unsigned lclear_user(void __user *,unsigned long);
+extern long lstrnlen_user(const char __user *,long);
 
 /*
  * Complex access routines -- macros
@@ -276,5 +277,7 @@
 #define __copy_from_user lcopy_from_user
 #define copy_to_user lcopy_to_user
 #define __copy_to_user lcopy_to_user
+#define copy_in_user lcopy_in_user
+#define __copy_in_user lcopy_in_user
 
 #endif /* __PARISC_UACCESS_H */
diff -Nru a/include/asm-parisc/ucontext.h b/include/asm-parisc/ucontext.h
--- a/include/asm-parisc/ucontext.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-parisc/ucontext.h	Thu Jan  8 23:00:23 2004
@@ -1,12 +1,12 @@
-#ifndef _ASMPARISC_UCONTEXT_H
-#define _ASMPARISC_UCONTEXT_H
+#ifndef _ASM_PARISC_UCONTEXT_H
+#define _ASM_PARISC_UCONTEXT_H
 
 struct ucontext {
-	unsigned long	  uc_flags;
+	unsigned int	  uc_flags;
 	struct ucontext  *uc_link;
 	stack_t		  uc_stack;
 	struct sigcontext uc_mcontext;
 	sigset_t	  uc_sigmask;	/* mask last for extensibility */
 };
 
-#endif /* !_ASMPARISC_UCONTEXT_H */
+#endif /* !_ASM_PARISC_UCONTEXT_H */
diff -Nru a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h
--- a/include/asm-parisc/unistd.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-parisc/unistd.h	Thu Jan  8 23:00:23 2004
@@ -490,7 +490,7 @@
  */
 
 #define __NR_Linux                0
-#define __NR_syscall              (__NR_Linux + 0)
+#define __NR_restart_syscall      (__NR_Linux + 0)
 #define __NR_exit                 (__NR_Linux + 1)
 #define __NR_fork                 (__NR_Linux + 2)
 #define __NR_read                 (__NR_Linux + 3)
diff -Nru a/include/asm-ppc/cpumask.h b/include/asm-ppc/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-ppc/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_PPC_CPUMASK_H
+#define _ASM_PPC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PPC_CPUMASK_H */
diff -Nru a/include/asm-ppc/highmem.h b/include/asm-ppc/highmem.h
--- a/include/asm-ppc/highmem.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ppc/highmem.h	Thu Jan  8 23:00:24 2004
@@ -81,6 +81,7 @@
 	unsigned int idx;
 	unsigned long vaddr;
 
+	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	inc_preempt_count();
 	if (page < highmem_start_page)
 		return page_address(page);
@@ -105,6 +106,7 @@
 
 	if (vaddr < KMAP_FIX_BEGIN) { // FIXME
 		dec_preempt_count();
+		preempt_check_resched();
 		return;
 	}
 
@@ -119,6 +121,7 @@
 	flush_tlb_page(0, vaddr);
 #endif
 	dec_preempt_count();
+	preempt_check_resched();
 }
 
 static inline struct page *kmap_atomic_to_page(void *ptr)
diff -Nru a/include/asm-ppc/ioctl.h b/include/asm-ppc/ioctl.h
--- a/include/asm-ppc/ioctl.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ppc/ioctl.h	Thu Jan  8 23:00:24 2004
@@ -38,7 +38,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
 	((sizeof(t) == sizeof(t[1]) && \
 	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
diff -Nru a/include/asm-ppc64/cpumask.h b/include/asm-ppc64/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-ppc64/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_PPC64_CPUMASK_H
+#define _ASM_PPC64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_PPC64_CPUMASK_H */
diff -Nru a/include/asm-ppc64/ioctl.h b/include/asm-ppc64/ioctl.h
--- a/include/asm-ppc64/ioctl.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ppc64/ioctl.h	Thu Jan  8 23:00:23 2004
@@ -43,7 +43,7 @@
 	 ((size) << _IOC_SIZESHIFT))
 
 /* provoke compile error for invalid uses of size argument */
-extern int __invalid_size_argument_for_IOC;
+extern unsigned int __invalid_size_argument_for_IOC;
 #define _IOC_TYPECHECK(t) \
        ((sizeof(t) == sizeof(t[1]) && \
          sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
diff -Nru a/include/asm-ppc64/page.h b/include/asm-ppc64/page.h
--- a/include/asm-ppc64/page.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-ppc64/page.h	Thu Jan  8 23:00:23 2004
@@ -41,6 +41,7 @@
 	( ((addr > (TASK_HPAGE_BASE-len)) && (addr < TASK_HPAGE_END)) || \
 	  ((current->mm->context & CONTEXT_LOW_HPAGES) && \
 	   (addr > (TASK_HPAGE_BASE_32-len)) && (addr < TASK_HPAGE_END_32)) )
+#define hugetlb_free_pgtables free_pgtables
 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 
 #define in_hugepage_area(context, addr) \
diff -Nru a/include/asm-ppc64/statfs.h b/include/asm-ppc64/statfs.h
--- a/include/asm-ppc64/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-ppc64/statfs.h	Thu Jan  8 23:00:24 2004
@@ -44,4 +44,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif  /* _PPC64_STATFS_H */
diff -Nru a/include/asm-s390/ccwdev.h b/include/asm-s390/ccwdev.h
--- a/include/asm-s390/ccwdev.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-s390/ccwdev.h	Thu Jan  8 23:00:24 2004
@@ -69,7 +69,7 @@
 /* The struct ccw device is our replacement for the globally accessible
  * ioinfo array. ioinfo will mutate into a subchannel device later.
  *
- * Reference: Documentation/driver-model.txt */
+ * Reference: Documentation/s390/driver-model.txt */
 struct ccw_device {
 	spinlock_t *ccwlock;
 	struct ccw_device_private *private;	/* cio private information */
diff -Nru a/include/asm-s390/cpumask.h b/include/asm-s390/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-s390/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_S390_CPUMASK_H
+#define _ASM_S390_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_S390_CPUMASK_H */
diff -Nru a/include/asm-s390/statfs.h b/include/asm-s390/statfs.h
--- a/include/asm-s390/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-s390/statfs.h	Thu Jan  8 23:00:24 2004
@@ -53,5 +53,19 @@
 	int  f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif /* __s390x__ */
 #endif
diff -Nru a/include/asm-sh/cpumask.h b/include/asm-sh/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sh/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_SH_CPUMASK_H
+#define _ASM_SH_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SH_CPUMASK_H */
diff -Nru a/include/asm-sparc/cpumask.h b/include/asm-sparc/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sparc/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_SPARC_CPUMASK_H
+#define _ASM_SPARC_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SPARC_CPUMASK_H */
diff -Nru a/include/asm-sparc/fixmap.h b/include/asm-sparc/fixmap.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sparc/fixmap.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,111 @@
+/*
+ * fixmap.h: compile-time virtual memory allocation
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 1998 Ingo Molnar
+ *
+ * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
+ */
+
+#ifndef _ASM_FIXMAP_H
+#define _ASM_FIXMAP_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <asm/page.h>
+#ifdef CONFIG_HIGHMEM
+#include <linux/threads.h>
+#include <asm/kmap_types.h>
+#endif
+
+/*
+ * Here we define all the compile-time 'special' virtual
+ * addresses. The point is to have a constant address at
+ * compile time, but to set the physical address only
+ * in the boot process. We allocate these special  addresses
+ * from the top of unused virtual memory (0xfd000000 - 1 page) backwards.
+ * Also this lets us do fail-safe vmalloc(), we
+ * can guarantee that these special addresses and
+ * vmalloc()-ed addresses never overlap.
+ *
+ * these 'compile-time allocated' memory buffers are
+ * fixed-size 4k pages. (or larger if used with an increment
+ * highger than 1) use fixmap_set(idx,phys) to associate
+ * physical memory with fixmap indices.
+ *
+ * TLB entries of such buffers will not be flushed across
+ * task switches.
+ */
+
+/*
+ * on UP currently we will have no trace of the fixmap mechanism,
+ * no page table allocations, etc. This might change in the
+ * future, say framebuffers for the console driver(s) could be
+ * fix-mapped?
+ */
+enum fixed_addresses {
+	FIX_HOLE,
+#ifdef CONFIG_HIGHMEM
+	FIX_KMAP_BEGIN,
+	FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
+#endif
+	__end_of_fixed_addresses
+};
+
+extern void __set_fixmap (enum fixed_addresses idx,
+					unsigned long phys, pgprot_t flags);
+
+#define set_fixmap(idx, phys) \
+		__set_fixmap(idx, phys, PAGE_KERNEL)
+/*
+ * Some hardware wants to get fixmapped without caching.
+ */
+#define set_fixmap_nocache(idx, phys) \
+		__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
+/*
+ * used by vmalloc.c.
+ *
+ * Leave one empty page between IO pages at 0xfd000000 and
+ * the start of the fixmap.
+ */
+#define FIXADDR_TOP	(0xfcfff000UL)
+#define FIXADDR_SIZE	((__end_of_fixed_addresses) << PAGE_SHIFT)
+#define FIXADDR_START	(FIXADDR_TOP - FIXADDR_SIZE)
+
+#define __fix_to_virt(x)	(FIXADDR_TOP - ((x) << PAGE_SHIFT))
+#define __virt_to_fix(x)	((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
+
+extern void __this_fixmap_does_not_exist(void);
+
+/*
+ * 'index to address' translation. If anyone tries to use the idx
+ * directly without tranlation, we catch the bug with a NULL-deference
+ * kernel oops. Illegal ranges of incoming indices are caught too.
+ */
+static inline unsigned long fix_to_virt(const unsigned int idx)
+{
+	/*
+	 * this branch gets completely eliminated after inlining,
+	 * except when someone tries to use fixaddr indices in an
+	 * illegal way. (such as mixing up address types or using
+	 * out-of-range indices).
+	 *
+	 * If it doesn't get removed, the linker will complain
+	 * loudly with a reasonably clear error message..
+	 */
+	if (idx >= __end_of_fixed_addresses)
+		__this_fixmap_does_not_exist();
+
+        return __fix_to_virt(idx);
+}
+
+static inline unsigned long virt_to_fix(const unsigned long vaddr)
+{
+	BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
+	return __virt_to_fix(vaddr);
+}
+
+#endif
diff -Nru a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h
--- a/include/asm-sparc/highmem.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-sparc/highmem.h	Thu Jan  8 23:00:24 2004
@@ -21,10 +21,10 @@
 #ifdef __KERNEL__
 
 #include <linux/interrupt.h>
+#include <asm/fixmap.h>
+#include <asm/vaddrs.h>
 #include <asm/kmap_types.h>
-
-/* undef for production */
-#define HIGHMEM_DEBUG 1
+#include <asm/pgtsrmmu.h>
 
 /* declarations for highmem.c */
 extern unsigned long highstart_pfn, highend_pfn;
@@ -33,12 +33,6 @@
 extern pgprot_t kmap_prot;
 extern pte_t *pkmap_page_table;
 
-/* This gets set in {srmmu,sun4c}_paging_init() */
-extern unsigned long fix_kmap_begin;
-
-/* Only used and set with srmmu? */
-extern unsigned long pkmap_base;
-
 extern void kmap_init(void) __init;
 
 /*
@@ -46,19 +40,21 @@
  * easily, subsequent pte tables have to be allocated in one physical
  * chunk of RAM.
  */
+#define PKMAP_BASE (SRMMU_NOCACHE_VADDR + (SRMMU_MAX_NOCACHE_PAGES << PAGE_SHIFT))
 #define LAST_PKMAP 1024
 
 #define LAST_PKMAP_MASK (LAST_PKMAP - 1)
-#define PKMAP_NR(virt)  ((virt - pkmap_base) >> PAGE_SHIFT)
-#define PKMAP_ADDR(nr)  (pkmap_base + ((nr) << PAGE_SHIFT))
+#define PKMAP_NR(virt)  ((virt - PKMAP_BASE) >> PAGE_SHIFT)
+#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
+
+#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
 
 extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
 static inline void *kmap(struct page *page)
 {
-	if (in_interrupt())
-		BUG();
+	BUG_ON(in_interrupt());
 	if (page < highmem_start_page)
 		return page_address(page);
 	return kmap_high(page);
@@ -66,8 +62,7 @@
 
 static inline void kunmap(struct page *page)
 {
-	if (in_interrupt())
-		BUG();
+	BUG_ON(in_interrupt());
 	if (page < highmem_start_page)
 		return;
 	kunmap_high(page);
@@ -75,19 +70,7 @@
 
 extern void *kmap_atomic(struct page *page, enum km_type type);
 extern void kunmap_atomic(void *kvaddr, enum km_type type);
-
-static inline struct page *kmap_atomic_to_page(void *ptr)
-{
-	unsigned long idx, vaddr = (unsigned long)ptr;
-	pte_t *pte;
-
-	if (vaddr < fix_kmap_begin)
-		return virt_to_page(ptr);
-
-	idx = ((vaddr - fix_kmap_begin) >> PAGE_SHIFT);
-	pte = kmap_pte + idx;
-	return pte_page(*pte);
-}
+extern struct page *kmap_atomic_to_page(void *vaddr);
 
 #define flush_cache_kmaps()	flush_cache_all()
 
diff -Nru a/include/asm-sparc/kmap_types.h b/include/asm-sparc/kmap_types.h
--- a/include/asm-sparc/kmap_types.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc/kmap_types.h	Thu Jan  8 23:00:23 2004
@@ -11,6 +11,7 @@
 	KM_BIO_DST_IRQ,
 	KM_PTE0,
 	KM_PTE1,
+	KM_PTE2,
 	KM_IRQ0,
 	KM_IRQ1,
 	KM_SOFTIRQ0,
diff -Nru a/include/asm-sparc/page.h b/include/asm-sparc/page.h
--- a/include/asm-sparc/page.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc/page.h	Thu Jan  8 23:00:23 2004
@@ -54,7 +54,7 @@
 
 #define SPARC_PHYS_BANKS 32
 
-extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
+extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1];
 
 /* Cache alias structure.  Entry is valid if context != -1. */
 struct cache_palias {
diff -Nru a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h
--- a/include/asm-sparc/pgtsrmmu.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc/pgtsrmmu.h	Thu Jan  8 23:00:23 2004
@@ -109,6 +109,13 @@
 
 #ifndef __ASSEMBLY__
 
+/* This makes sense. Honest it does - Anton */
+/* XXX Yes but it's ugly as sin.  FIXME. -KMW */
+extern void *srmmu_nocache_pool;
+#define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool))
+#define __nocache_va(PADDR) (__va((unsigned long)PADDR) - (unsigned long)srmmu_nocache_pool + SRMMU_NOCACHE_VADDR)
+#define __nocache_fix(VADDR) __va(__nocache_pa(VADDR))
+
 /* Accessing the MMU control register. */
 extern __inline__ unsigned int srmmu_get_mmureg(void)
 {
diff -Nru a/include/asm-sparc/processor.h b/include/asm-sparc/processor.h
--- a/include/asm-sparc/processor.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-sparc/processor.h	Thu Jan  8 23:00:24 2004
@@ -56,19 +56,12 @@
 /* The Sparc processor specific thread struct. */
 struct thread_struct {
 	struct pt_regs *kregs;
+	unsigned int _pad1;
 
 	/* Special child fork kpsr/kwim values. */
 	unsigned long fork_kpsr __attribute__ ((aligned (8)));
 	unsigned long fork_kwim;
 
-	/* A place to store user windows and stack pointers
-	 * when the stack needs inspection.
-	 */
-#define NSWINS 8
-	struct reg_window reg_window[NSWINS] __attribute__ ((aligned (8)));
-	unsigned long rwbuf_stkptrs[NSWINS] __attribute__ ((aligned (8)));
-	unsigned long w_saved;
-
 	/* Floating point regs */
 	unsigned long   float_regs[32] __attribute__ ((aligned (8)));
 	unsigned long   fsr;
@@ -78,23 +71,16 @@
 	mm_segment_t current_ds;
 	struct exec core_exec;     /* just what it says. */
 	int new_signal;
-	atomic_t refcount;	/* used for sun4c only */
 };
 
 #define SPARC_FLAG_KTHREAD      0x1    /* task is a kernel thread */
 #define SPARC_FLAG_UNALIGNED    0x2    /* is allowed to do unaligned accesses */
 
 #define INIT_THREAD  { \
-/* kregs, */ \
-   0,  \
+/* kregs, _pad1, */ \
+   0, 0,  \
 /* fork_kpsr, fork_kwim */ \
    0,         0, \
-/* reg_window */  \
-{ { { 0, }, { 0, } }, }, \
-/* rwbuf_stkptrs */  \
-{ 0, 0, 0, 0, 0, 0, 0, 0, }, \
-/* w_saved */ \
-   0, \
 /* FPU regs */   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
 /* FPU status, FPU qdepth, FPU queue */ \
diff -Nru a/include/asm-sparc/setup.h b/include/asm-sparc/setup.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sparc/setup.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,9 @@
+/*
+ *	Just a place holder. 
+ */
+
+#ifndef _SPARC_SETUP_H
+#define _SPARC_SETUP_H
+
+
+#endif /* _SPARC_SETUP_H */
diff -Nru a/include/asm-sparc/thread_info.h b/include/asm-sparc/thread_info.h
--- a/include/asm-sparc/thread_info.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-sparc/thread_info.h	Thu Jan  8 23:00:24 2004
@@ -16,16 +16,14 @@
 #ifndef __ASSEMBLY__
 
 #include <asm/btfixup.h>
+#include <asm/ptrace.h>
 
 /*
  * Low level task data.
  *
- * If you change this, change the TI_* offsets below to match. XXX check_asm.
- *
- * The uwinmask is a first class citizen among w_saved and friends.
- * XXX Is this a good idea? wof.S/wuf.S have to use w_saved anyway,
- *     so they waste a register on current, and an ld on fetching it.
+ * If you change this, change the TI_* offsets below to match.
  */
+#define NSWINS 8
 struct thread_info {
 	unsigned long		uwinmask;
 	struct task_struct	*task;		/* main task structure */
@@ -43,6 +41,13 @@
 	unsigned long kpsr;
 	unsigned long kwim;
 
+	/* A place to store user windows and stack pointers
+	 * when the stack needs inspection.
+	 */
+	struct reg_window	reg_window[NSWINS];	/* align for ldd! */
+	unsigned long		rwbuf_stkptrs[NSWINS];
+	unsigned long		w_saved;
+
 	struct restart_block	restart_block;
 };
 
@@ -100,6 +105,7 @@
 
 /*
  * Offsets in thread_info structure, used in assembly code
+ * The "#define REGWIN_SZ 0x40" was abolished, so no multiplications.
  */
 #define TI_UWINMASK	0x00	/* uwinmask */
 #define TI_TASK		0x04
@@ -113,7 +119,10 @@
 #define TI_KPC		0x24	/* kpc (ldd'ed with kpc) */
 #define TI_KPSR		0x28	/* kpsr */
 #define TI_KWIM		0x2c	/* kwim (ldd'ed with kpsr) */
-#define TI_RESTART_BLOCK 0x30
+#define TI_REG_WINDOW	0x30
+#define TI_RWIN_SPTRS	0x230
+#define TI_W_SAVED	0x250
+/* #define TI_RESTART_BLOCK 0x25n */ /* Nobody cares */
 
 #define PREEMPT_ACTIVE		0x4000000
 
diff -Nru a/include/asm-sparc/vaddrs.h b/include/asm-sparc/vaddrs.h
--- a/include/asm-sparc/vaddrs.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc/vaddrs.h	Thu Jan  8 23:00:23 2004
@@ -16,6 +16,9 @@
 
 #define SRMMU_NOCACHE_VADDR	(KERNBASE + SRMMU_MAXMEM)
 				/* = 0x0fc000000 */
+/* XXX Empiricals - this needs to go away - KMW */
+#define SRMMU_MIN_NOCACHE_PAGES (550)
+#define SRMMU_MAX_NOCACHE_PAGES	(1280)
 
 /* The following constant is used in mm/srmmu.c::srmmu_nocache_calcsize()
  * to determine the amount of memory that will be reserved as nocache:
diff -Nru a/include/asm-sparc/winmacro.h b/include/asm-sparc/winmacro.h
--- a/include/asm-sparc/winmacro.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc/winmacro.h	Thu Jan  8 23:00:23 2004
@@ -9,7 +9,6 @@
 
 #include <linux/config.h>
 #include <asm/ptrace.h>
-#include <asm/psr.h>
 
 /* Store the register window onto the 8-byte aligned area starting
  * at %reg.  It might be %sp, it might not, we don't care.
@@ -91,18 +90,18 @@
         STORE_PT_INS(base_reg)
 
 #define SAVE_BOLIXED_USER_STACK(cur_reg, scratch) \
-        ld       [%cur_reg + AOFF_task_thread + AOFF_thread_w_saved], %scratch; \
+        ld       [%cur_reg + TI_W_SAVED], %scratch; \
         sll      %scratch, 2, %scratch; \
         add      %scratch, %cur_reg, %scratch; \
-        st       %sp, [%scratch + AOFF_task_thread + AOFF_thread_rwbuf_stkptrs]; \
+        st       %sp, [%scratch + TI_RWIN_SPTRS]; \
         sub      %scratch, %cur_reg, %scratch; \
         sll      %scratch, 4, %scratch; \
         add      %scratch, %cur_reg, %scratch; \
-        STORE_WINDOW(scratch + AOFF_task_thread + AOFF_thread_reg_window); \
+        STORE_WINDOW(scratch + TI_REG_WINDOW); \
         sub      %scratch, %cur_reg, %scratch; \
         srl      %scratch, 6, %scratch; \
         add      %scratch, 1, %scratch; \
-        st       %scratch, [%cur_reg + AOFF_task_thread + AOFF_thread_w_saved];
+        st       %scratch, [%cur_reg + TI_W_SAVED];
 
 #ifdef CONFIG_SMP
 #define LOAD_CURRENT4M(dest_reg, idreg) \
diff -Nru a/include/asm-sparc64/cpumask.h b/include/asm-sparc64/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sparc64/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_SPARC64_CPUMASK_H
+#define _ASM_SPARC64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_SPARC64_CPUMASK_H */
diff -Nru a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h
--- a/include/asm-sparc64/pgtable.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-sparc64/pgtable.h	Thu Jan  8 23:00:23 2004
@@ -145,9 +145,9 @@
 #if defined(CONFIG_HUGETLB_PAGE_SIZE_4MB)
 #define _PAGE_SZHUGE	_PAGE_SZ4MB
 #elif defined(CONFIG_HUGETLB_PAGE_SIZE_512K)
-#define _PAGE_SZHUGE	_PAGE_512K
+#define _PAGE_SZHUGE	_PAGE_SZ512K
 #elif defined(CONFIG_HUGETLB_PAGE_SIZE_64K)
-#define _PAGE_SZHUGE	_PAGE_64K
+#define _PAGE_SZHUGE	_PAGE_SZ64K
 #endif
 
 #define _PAGE_CACHE	(_PAGE_CP | _PAGE_CV)
diff -Nru a/include/asm-sparc64/setup.h b/include/asm-sparc64/setup.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-sparc64/setup.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,9 @@
+/*
+ *	Just a place holder. 
+ */
+
+#ifndef _SPARC64_SETUP_H
+#define _SPARC64_SETUP_H
+
+
+#endif /* _SPARC64_SETUP_H */
diff -Nru a/include/asm-sparc64/statfs.h b/include/asm-sparc64/statfs.h
--- a/include/asm-sparc64/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-sparc64/statfs.h	Thu Jan  8 23:00:24 2004
@@ -38,4 +38,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+};
+
 #endif
diff -Nru a/include/asm-um/cpumask.h b/include/asm-um/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-um/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_UM_CPUMASK_H
+#define _ASM_UM_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_UM_CPUMASK_H */
diff -Nru a/include/asm-v850/cpumask.h b/include/asm-v850/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-v850/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_V850_CPUMASK_H
+#define _ASM_V850_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_V850_CPUMASK_H */
diff -Nru a/include/asm-x86_64/a.out.h b/include/asm-x86_64/a.out.h
--- a/include/asm-x86_64/a.out.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/a.out.h	Thu Jan  8 23:00:23 2004
@@ -1,13 +1,11 @@
 #ifndef __X8664_A_OUT_H__
 #define __X8664_A_OUT_H__
 
-
-/* Note: a.out is not supported in 64bit mode. This is just here to 
-   still let some old things compile. */ 
+/* 32bit a.out */
 
 struct exec
 {
-  unsigned long a_info;		/* Use macros N_MAGIC, etc for access */
+  unsigned int a_info;		/* Use macros N_MAGIC, etc for access */
   unsigned a_text;		/* length of text, in bytes */
   unsigned a_data;		/* length of data, in bytes */
   unsigned a_bss;		/* length of uninitialized data area for file, in bytes */
@@ -23,7 +21,7 @@
 
 #ifdef __KERNEL__
 
-#define STACK_TOP	TASK_SIZE
+#define STACK_TOP	0xc0000000
 
 #endif
 
diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h
--- a/include/asm-x86_64/acpi.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/acpi.h	Thu Jan  8 23:00:24 2004
@@ -52,40 +52,36 @@
 #define ACPI_ENABLE_IRQS()  local_irq_enable()
 #define ACPI_FLUSH_CPU_CACHE()	wbinvd()
 
-/*
- * A brief explanation as GNU inline assembly is a bit hairy
- *  %0 is the output parameter in RAX ("=a")
- *  %1 and %2 are the input parameters in RCX ("c")
- *  and an immediate value ("i") respectively
- *  All actual register references are preceded with "%%" as in "%%edx"
- *  Immediate values in the assembly are preceded by "$" as in "$0x1"
- *  The final asm parameter are the operation altered non-output registers.
- */
+
+static inline int
+__acpi_acquire_global_lock (unsigned int *lock)
+{
+	unsigned int old, new, val;
+	do {
+		old = *lock;
+		new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
+		val = cmpxchg4_locked(lock, new, old);
+	} while (unlikely (val != old));
+	return (new < 3) ? -1 : 0;
+}
+
+static inline int
+__acpi_release_global_lock (unsigned int *lock)
+{
+	unsigned int old, new, val;
+	do {
+		old = *lock;
+		new = old & ~0x3;
+		val = cmpxchg4_locked(lock, new, old);
+	} while (unlikely (val != old));
+	return old & 0x1;
+}
+
 #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
-	do { \
-		unsigned long dummy; \
-		asm("1:     movl (%2),%%eax;" \
-			"movl   %%eax,%%edx;" \
-			"andq   %2,%%rdx;" \
-			"btsl   $0x1,%%edx;" \
-			"adcl   $0x0,%%edx;" \
-			"lock;  cmpxchgl %%edx,(%1);" \
-			"jnz    1b;" \
-			"cmpb   $0x3,%%dl;" \
-			"sbbl   %%eax,%%eax" \
-			:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \
-	} while(0)
+	((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr))
+
 #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
-	do { \
-		unsigned long dummy; \
-		asm("1:     movl (%2),%%eax;" \
-			"movl   %%eax,%%edx;" \
-			"andq   %2,%%rdx;" \
-			"lock;  cmpxchgl %%edx,(%1);" \
-			"jnz    1b;" \
-			"andl   $0x1,%%eax" \
-			:"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \
-	} while(0)
+	((Acq) = __acpi_release_global_lock((unsigned int *) GLptr))
 
 /*
  * Math helper asm macros
diff -Nru a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h
--- a/include/asm-x86_64/bitops.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/bitops.h	Thu Jan  8 23:00:23 2004
@@ -7,14 +7,6 @@
 
 #include <linux/config.h>
 
-/*
- * These have to be done with inline assembly: that way the bit-setting
- * is guaranteed to be atomic. All bit operations return 0 if the bit
- * was cleared before the operation and != 0 if it was not.
- *
- * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
- */
-
 #ifdef CONFIG_SMP
 #define LOCK_PREFIX "lock ; "
 #else
@@ -363,26 +355,26 @@
  */
 static __inline__ int find_next_bit(const unsigned long * addr, int size, int offset)
 {
-	unsigned int * p = ((unsigned int *) addr) + (offset >> 5);
-	int set = 0, bit = offset & 31, res;
+	const unsigned long * p = addr + (offset >> 6);
+	unsigned long set = 0, bit = offset & 63, res;
 	
 	if (bit) {
 		/*
-		 * Look for nonzero in the first 32 bits:
+		 * Look for nonzero in the first 64 bits:
 		 */
-		__asm__("bsfl %1,%0\n\t"
-			"cmovel %2,%0\n\t"
+		__asm__("bsfq %1,%0\n\t"
+			"cmoveq %2,%0\n\t"
 			: "=r" (set)
-			: "r" (*p >> bit), "r" (32));
-		if (set < (32 - bit))
+			: "r" (*p >> bit), "r" (64L));
+		if (set < (64 - bit))
 			return set + offset;
-		set = 32 - bit;
+		set = 64 - bit;
 		p++;
 	}
 	/*
 	 * No set bit yet, search remaining full words for a bit
 	 */
-	res = find_first_bit ((const unsigned long *)p, size - 32 * (p - (unsigned int *) addr));
+	res = find_first_bit (p, size - 64 * (p - addr));
 	return (offset + set + res);
 }
 
diff -Nru a/include/asm-x86_64/calling.h b/include/asm-x86_64/calling.h
--- a/include/asm-x86_64/calling.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/calling.h	Thu Jan  8 23:00:24 2004
@@ -8,7 +8,7 @@
 #define R14 8
 #define R13 16
 #define R12 24
-#define RBP 36
+#define RBP 32
 #define RBX 40
 /* arguments: interrupts/non tracing syscalls only save upto here*/
 #define R11 48
diff -Nru a/include/asm-x86_64/cpu.h b/include/asm-x86_64/cpu.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-x86_64/cpu.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1 @@
+#include <asm-i386/cpu.h>
diff -Nru a/include/asm-x86_64/cpumask.h b/include/asm-x86_64/cpumask.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-x86_64/cpumask.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,6 @@
+#ifndef _ASM_X86_64_CPUMASK_H
+#define _ASM_X86_64_CPUMASK_H
+
+#include <asm-generic/cpumask.h>
+
+#endif /* _ASM_X86_64_CPUMASK_H */
diff -Nru a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h
--- a/include/asm-x86_64/hw_irq.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/hw_irq.h	Thu Jan  8 23:00:24 2004
@@ -72,7 +72,7 @@
  * levels. (0x80 is the syscall vector)
  */
 #define FIRST_DEVICE_VECTOR	0x31
-#define FIRST_SYSTEM_VECTOR	0xef
+#define FIRST_SYSTEM_VECTOR	0xef   /* duplicated in irq.h */
 
 
 #ifndef __ASSEMBLY__
@@ -172,6 +172,8 @@
 #else
 static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {}
 #endif
+
+#define platform_legacy_irq(irq)	((irq) < 16)
 
 #endif
 
diff -Nru a/include/asm-x86_64/io.h b/include/asm-x86_64/io.h
--- a/include/asm-x86_64/io.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/io.h	Thu Jan  8 23:00:23 2004
@@ -304,8 +304,8 @@
 /* Disable vmerge for now. Need to fix the block layer code
    to check for non iommu addresses first.
    When the IOMMU is force it is safe to enable. */
-extern int force_iommu; 
-#define BIO_VERMGE_BOUNDARY (force_iommu ? 4096 : 0)
+extern int iommu_merge;
+#define BIO_VMERGE_BOUNDARY (iommu_merge ? 4096 : 0)
 
 #endif /* __KERNEL__ */
 
diff -Nru a/include/asm-x86_64/io_apic.h b/include/asm-x86_64/io_apic.h
--- a/include/asm-x86_64/io_apic.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/io_apic.h	Thu Jan  8 23:00:23 2004
@@ -13,6 +13,46 @@
 
 #ifdef CONFIG_X86_IO_APIC
 
+#ifdef CONFIG_PCI_USE_VECTOR
+static inline int use_pci_vector(void)	{return 1;}
+static inline void disable_edge_ioapic_vector(unsigned int vector) { }
+static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { }
+static inline void end_edge_ioapic_vector (unsigned int vector) { }
+#define startup_level_ioapic	startup_level_ioapic_vector
+#define shutdown_level_ioapic	mask_IO_APIC_vector
+#define enable_level_ioapic	unmask_IO_APIC_vector
+#define disable_level_ioapic	mask_IO_APIC_vector
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_vector
+#define end_level_ioapic	end_level_ioapic_vector
+#define set_ioapic_affinity	set_ioapic_affinity_vector
+
+#define startup_edge_ioapic 	startup_edge_ioapic_vector
+#define shutdown_edge_ioapic 	disable_edge_ioapic_vector
+#define enable_edge_ioapic 	unmask_IO_APIC_vector
+#define disable_edge_ioapic 	disable_edge_ioapic_vector
+#define ack_edge_ioapic 	ack_edge_ioapic_vector
+#define end_edge_ioapic 	end_edge_ioapic_vector
+#else
+static inline int use_pci_vector(void)	{return 0;}
+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
+static inline void end_edge_ioapic_irq (unsigned int irq) { }
+#define startup_level_ioapic	startup_level_ioapic_irq
+#define shutdown_level_ioapic	mask_IO_APIC_irq
+#define enable_level_ioapic	unmask_IO_APIC_irq
+#define disable_level_ioapic	mask_IO_APIC_irq
+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
+#define end_level_ioapic	end_level_ioapic_irq
+#define set_ioapic_affinity	set_ioapic_affinity_irq
+
+#define startup_edge_ioapic 	startup_edge_ioapic_irq
+#define shutdown_edge_ioapic 	disable_edge_ioapic_irq
+#define enable_edge_ioapic 	unmask_IO_APIC_irq
+#define disable_edge_ioapic 	disable_edge_ioapic_irq
+#define ack_edge_ioapic 	ack_edge_ioapic_irq
+#define end_edge_ioapic 	end_edge_ioapic_irq
+#endif
+
 #define APIC_MISMATCH_DEBUG
 
 #define IO_APIC_BASE(idx) \
@@ -173,6 +213,8 @@
 #else  /* !CONFIG_X86_IO_APIC */
 #define io_apic_assign_pci_irqs 0
 #endif
+
+extern int assign_irq_vector(int irq);
 
 void enable_NMI_through_LVT0 (void * dummy);
 
diff -Nru a/include/asm-x86_64/irq.h b/include/asm-x86_64/irq.h
--- a/include/asm-x86_64/irq.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/irq.h	Thu Jan  8 23:00:23 2004
@@ -21,8 +21,23 @@
  * Since vectors 0x00-0x1f are used/reserved for the CPU,
  * the usable vector space is 0x20-0xff (224 vectors)
  */
+
+/*
+ * The maximum number of vectors supported by x86_64 processors
+ * is limited to 256. For processors other than x86_64, NR_VECTORS
+ * should be changed accordingly.
+ */
+#define NR_VECTORS 256
+
+#define FIRST_SYSTEM_VECTOR	0xef   /* duplicated in hw_irq.h */
+
+#ifdef CONFIG_PCI_USE_VECTOR
+#define NR_IRQS FIRST_SYSTEM_VECTOR
+#define NR_IRQ_VECTORS NR_IRQS
+#else
 #define NR_IRQS 224
 #define NR_IRQ_VECTORS NR_IRQS
+#endif
 
 static __inline__ int irq_canonicalize(int irq)
 {
@@ -32,6 +47,7 @@
 extern void disable_irq(unsigned int);
 extern void disable_irq_nosync(unsigned int);
 extern void enable_irq(unsigned int);
+extern int can_request_irq(unsigned int, unsigned long flags);
 
 #ifdef CONFIG_X86_LOCAL_APIC
 #define ARCH_HAS_NMI_WATCHDOG		/* See include/linux/nmi.h */
diff -Nru a/include/asm-x86_64/memblk.h b/include/asm-x86_64/memblk.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-x86_64/memblk.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1 @@
+#include <asm-i386/memblk.h>
diff -Nru a/include/asm-x86_64/node.h b/include/asm-x86_64/node.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-x86_64/node.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1 @@
+#include <asm-i386/node.h>
diff -Nru a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h
--- a/include/asm-x86_64/pgtable.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/pgtable.h	Thu Jan  8 23:00:24 2004
@@ -180,6 +180,8 @@
 	(_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
 #define __PAGE_KERNEL_VSYSCALL \
 	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
+#define __PAGE_KERNEL_VSYSCALL_NOCACHE \
+	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
 #define __PAGE_KERNEL_LARGE \
 	(__PAGE_KERNEL | _PAGE_PSE)
 
@@ -191,6 +193,7 @@
 #define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
 #define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
 #define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
+#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
 
 /*         xwr */
 #define __P000	PAGE_NONE
diff -Nru a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h
--- a/include/asm-x86_64/smp.h	Thu Jan  8 23:00:23 2004
+++ b/include/asm-x86_64/smp.h	Thu Jan  8 23:00:23 2004
@@ -74,7 +74,7 @@
 	return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID));
 }
 
-#define safe_smp_processor_id() (cpuid_ebx(1) >> 24) 
+#define safe_smp_processor_id() (disable_apic ? 0 : hard_smp_processor_id())
 
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
 #endif /* !ASSEMBLY */
diff -Nru a/include/asm-x86_64/stat.h b/include/asm-x86_64/stat.h
--- a/include/asm-x86_64/stat.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/stat.h	Thu Jan  8 23:00:24 2004
@@ -26,4 +26,19 @@
   	long		__unused[3];
 };
 
+/* For 32bit emulation */
+struct __old_kernel_stat {
+	unsigned short st_dev;
+	unsigned short st_ino;
+	unsigned short st_mode;
+	unsigned short st_nlink;
+	unsigned short st_uid;
+	unsigned short st_gid;
+	unsigned short st_rdev;
+	unsigned int  st_size;
+	unsigned int  st_atime;
+	unsigned int  st_mtime;
+	unsigned int  st_ctime;
+};
+
 #endif
diff -Nru a/include/asm-x86_64/statfs.h b/include/asm-x86_64/statfs.h
--- a/include/asm-x86_64/statfs.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/statfs.h	Thu Jan  8 23:00:24 2004
@@ -41,4 +41,18 @@
 	long f_spare[5];
 };
 
+struct compat_statfs64 {
+	__u32 f_type;
+	__u32 f_bsize;
+	__u64 f_blocks;
+	__u64 f_bfree;
+	__u64 f_bavail;
+	__u64 f_files;
+	__u64 f_ffree;
+	__kernel_fsid_t f_fsid;
+	__u32 f_namelen;
+	__u32 f_frsize;
+	__u32 f_spare[5];
+} __attribute__((packed));
+
 #endif
diff -Nru a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h
--- a/include/asm-x86_64/system.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/system.h	Thu Jan  8 23:00:24 2004
@@ -276,6 +276,13 @@
 	((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
 					(unsigned long)(n),sizeof(*(ptr))))
 
+static inline __u32 cmpxchg4_locked(__u32 *ptr, __u32 old, __u32 new) 
+{
+	asm volatile("lock ; cmpxchgl %k1,%2" :
+		     "=r" (new) : "0" (old), "m" (*(__u32 *)ptr) : "memory");
+	return new; 
+}
+
 #ifdef CONFIG_SMP
 #define smp_mb()	mb()
 #define smp_rmb()	rmb()
@@ -314,7 +321,21 @@
 #define local_irq_disable() 	__asm__ __volatile__("cli": : :"memory")
 #define local_irq_enable()	__asm__ __volatile__("sti": : :"memory")
 /* used in the idle loop; sti takes one instruction cycle to complete */
-#define safe_halt()		__asm__ __volatile__("sti; hlt": : :"memory")
+
+/* Work around BIOS that don't have K8 Errata #93 fixed. */
+#define safe_halt()	      \
+	asm volatile("   sti\n"					\
+		     "1: hlt\n"						\
+		     "2:\n"							\
+		     ".section .fixup,\"ax\"\n"		\
+		     "3: call idle_warning\n"		\
+		     "   jmp 2b\n"					\
+		     ".previous\n"					\
+		     ".section __ex_table,\"a\"\n\t"	\
+		     ".align 8\n\t"					\
+		     ".quad 1b,3b\n"				\
+		     ".previous" ::: "memory")
+
 #define irqs_disabled()			\
 ({					\
 	unsigned long flags;		\
diff -Nru a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h
--- a/include/asm-x86_64/unistd.h	Thu Jan  8 23:00:24 2004
+++ b/include/asm-x86_64/unistd.h	Thu Jan  8 23:00:24 2004
@@ -623,11 +623,11 @@
 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
 { \
 long __res; \
-__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; movq %7,%%r9" __syscall \
+__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; movq %7,%%r9 ; " __syscall \
 	: "=a" (__res) \
 	: "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \
-	  "d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5), \
-	  "g" ((long)(arg6),) : \
+	  "d" ((long)(arg3)), "g" ((long)(arg4)), "g" ((long)(arg5)), \
+	  "g" ((long)(arg6)) : \
 	__syscall_clobber,"r8","r10","r9" ); \
 __syscall_return(type,__res); \
 }
diff -Nru a/include/linux/bio.h b/include/linux/bio.h
--- a/include/linux/bio.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/bio.h	Thu Jan  8 23:00:24 2004
@@ -162,7 +162,7 @@
  */
 
 #define __BVEC_END(bio)		bio_iovec_idx((bio), (bio)->bi_vcnt - 1)
-#define __BVEC_START(bio)	bio_iovec_idx((bio), 0)
+#define __BVEC_START(bio)	bio_iovec_idx((bio), (bio)->bi_idx)
 #define BIOVEC_PHYS_MERGEABLE(vec1, vec2)	\
 	((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
 #define BIOVEC_VIRT_MERGEABLE(vec1, vec2)	\
diff -Nru a/include/linux/blkdev.h b/include/linux/blkdev.h
--- a/include/linux/blkdev.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/blkdev.h	Thu Jan  8 23:00:23 2004
@@ -195,11 +195,6 @@
 	__REQ_PM_SUSPEND,	/* suspend request */
 	__REQ_PM_RESUME,	/* resume request */
 	__REQ_PM_SHUTDOWN,	/* shutdown request */
-	__REQ_IDETAPE_PC1,	/* packet command (first stage) */
-	__REQ_IDETAPE_PC2,	/* packet command (second stage) */
-	__REQ_IDETAPE_READ,
-	__REQ_IDETAPE_WRITE,
-	__REQ_IDETAPE_READ_BUFFER,
 	__REQ_NR_BITS,		/* stops here */
 };
 
@@ -225,11 +220,6 @@
 #define REQ_PM_SUSPEND	(1 << __REQ_PM_SUSPEND)
 #define REQ_PM_RESUME	(1 << __REQ_PM_RESUME)
 #define REQ_PM_SHUTDOWN	(1 << __REQ_PM_SHUTDOWN)
-#define REQ_IDETAPE_PC1 (1 << __REQ_IDETAPE_PC1)
-#define REQ_IDETAPE_PC2 (1 << __REQ_IDETAPE_PC2)
-#define REQ_IDETAPE_READ	(1 << __REQ_IDETAPE_READ)
-#define REQ_IDETAPE_WRITE	(1 << __REQ_IDETAPE_WRITE)
-#define REQ_IDETAPE_READ_BUFFER	(1 << __REQ_IDETAPE_READ_BUFFER)
 
 /*
  * State information carried for REQ_PM_SUSPEND and REQ_PM_RESUME
diff -Nru a/include/linux/compat.h b/include/linux/compat.h
--- a/include/linux/compat.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/compat.h	Thu Jan  8 23:00:24 2004
@@ -44,8 +44,8 @@
 } compat_sigset_t;
 
 extern int cp_compat_stat(struct kstat *, struct compat_stat *);
-extern int get_compat_timespec(struct timespec *, struct compat_timespec *);
-extern int put_compat_timespec(struct timespec *, struct compat_timespec *);
+extern int get_compat_timespec(struct timespec *, const struct compat_timespec *);
+extern int put_compat_timespec(struct timespec *, const struct compat_timespec *);
 
 struct compat_iovec {
 	compat_uptr_t	iov_base;
@@ -74,20 +74,6 @@
 	compat_long_t	ru_nsignals;
 	compat_long_t	ru_nvcsw;
 	compat_long_t	ru_nivcsw;
-};
-
-struct compat_statfs64 {
-	__u32 f_type;
-	__u32 f_bsize;
-	__u64 f_blocks;
-	__u64 f_bfree;
-	__u64 f_bavail;
-	__u64 f_files;
-	__u64 f_ffree;
-	__kernel_fsid_t f_fsid;
-	__u32 f_namelen;
-	__u32 f_frsize;
-	__u32 f_spare[5];
 };
 
 struct compat_dirent {
diff -Nru a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h
--- a/include/linux/compat_ioctl.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/compat_ioctl.h	Thu Jan  8 23:00:24 2004
@@ -678,3 +678,10 @@
 COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
 COMPATIBLE_IOCTL(NBD_SET_SIZE_BLOCKS)
 COMPATIBLE_IOCTL(NBD_DISCONNECT)
+/* i2c */
+COMPATIBLE_IOCTL(I2C_SLAVE)
+COMPATIBLE_IOCTL(I2C_SLAVE_FORCE)
+COMPATIBLE_IOCTL(I2C_TENBIT)
+COMPATIBLE_IOCTL(I2C_PEC)
+COMPATIBLE_IOCTL(I2C_RETRIES)
+COMPATIBLE_IOCTL(I2C_TIMEOUT)
diff -Nru a/include/linux/console.h b/include/linux/console.h
--- a/include/linux/console.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/console.h	Thu Jan  8 23:00:23 2004
@@ -71,18 +71,6 @@
 #define CM_MOVE     (3)
 
 /*
- *	Array of consoles built from command line options (console=)
- */
-struct console_cmdline
-{
-	char	name[8];			/* Name of the driver	    */
-	int	index;				/* Minor dev. to use	    */
-	char	*options;			/* Options for the driver   */
-};
-#define MAX_CMDLINECONSOLES 8
-extern struct console_cmdline console_list[MAX_CMDLINECONSOLES];
-
-/*
  *	The interface for a console, or any other device that
  *	wants to capture console messages (printer driver?)
  */
@@ -106,6 +94,7 @@
 	struct	 console *next;
 };
 
+extern int add_preferred_console(char *name, int idx, char *options);
 extern void register_console(struct console *);
 extern int unregister_console(struct console *);
 extern struct console *console_drivers;
diff -Nru a/include/linux/cpufreq.h b/include/linux/cpufreq.h
--- a/include/linux/cpufreq.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/cpufreq.h	Thu Jan  8 23:00:24 2004
@@ -57,7 +57,7 @@
 struct cpufreq_cpuinfo {
 	unsigned int		max_freq;
 	unsigned int		min_freq;
-	unsigned int		transition_latency; /* in 10^(-9) s */
+	unsigned int		transition_latency; /* in 10^(-9) s = nanoseconds */
 };
 
 struct cpufreq_real_policy {
@@ -231,17 +231,18 @@
 /* the proc_intf.c needs this */
 int cpufreq_parse_governor (char *str_governor, unsigned int *policy, struct cpufreq_governor **governor);
 
-#if defined(CONFIG_CPU_FREQ_GOV_USERSPACE) || defined(CONFIG_CPU_FREQ_GOV_USERSPACE_MODULE)
+
 /*********************************************************************
  *                      CPUFREQ USERSPACE GOVERNOR                   *
  *********************************************************************/
 int cpufreq_gov_userspace_init(void);
 
+#ifdef CONFIG_CPU_FREQ_24_API
+
 int cpufreq_setmax(unsigned int cpu);
 int cpufreq_set(unsigned int kHz, unsigned int cpu);
 unsigned int cpufreq_get(unsigned int cpu);
 
-#ifdef CONFIG_CPU_FREQ_24_API
 
 /* /proc/sys/cpu */
 enum {
@@ -289,8 +290,6 @@
 
 #endif /* CONFIG_CPU_FREQ_24_API */
 
-#endif /* CONFIG_CPU_FREQ_GOV_USERSPACE */
-
 
 /*********************************************************************
  *                       CPUFREQ DEFAULT GOVERNOR                    *
@@ -305,6 +304,7 @@
 #define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_userspace
 #endif
 
+
 /*********************************************************************
  *                     FREQUENCY TABLE HELPERS                       *
  *********************************************************************/
@@ -318,7 +318,6 @@
 				    * order */
 };
 
-#if defined(CONFIG_CPU_FREQ_TABLE) || defined(CONFIG_CPU_FREQ_TABLE_MODULE)
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 				    struct cpufreq_frequency_table *table);
 
@@ -340,5 +339,4 @@
 void cpufreq_frequency_table_put_attr(unsigned int cpu);
 
 
-#endif /* CONFIG_CPU_FREQ_TABLE */
 #endif /* _LINUX_CPUFREQ_H */
diff -Nru a/include/linux/cpumask.h b/include/linux/cpumask.h
--- a/include/linux/cpumask.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/cpumask.h	Thu Jan  8 23:00:23 2004
@@ -1,42 +1,9 @@
 #ifndef __LINUX_CPUMASK_H
 #define __LINUX_CPUMASK_H
 
-#include <linux/config.h>
-#include <linux/kernel.h>
 #include <linux/threads.h>
-#include <linux/types.h>
-#include <linux/bitmap.h>
-
-#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
-#define CPU_ARRAY_SIZE		BITS_TO_LONGS(NR_CPUS)
-
-struct cpumask
-{
-	unsigned long mask[CPU_ARRAY_SIZE];
-};
-
-typedef struct cpumask cpumask_t;
-
-#else
-typedef unsigned long cpumask_t;
-#endif
-
-#ifdef CONFIG_SMP
-#if NR_CPUS > BITS_PER_LONG
-#include <asm-generic/cpumask_array.h>
-#else
-#include <asm-generic/cpumask_arith.h>
-#endif
-#else
-#include <asm-generic/cpumask_up.h>
-#endif
-
-#if NR_CPUS <= 4*BITS_PER_LONG
-#include <asm-generic/cpumask_const_value.h>
-#else
-#include <asm-generic/cpumask_const_reference.h>
-#endif
-
+#include <asm/cpumask.h>
+#include <asm/bug.h>
 
 #ifdef CONFIG_SMP
 
@@ -53,19 +20,31 @@
 static inline int next_online_cpu(int cpu, cpumask_t map)
 {
 	do
-		cpu = next_cpu_const(cpu, map);
+		cpu = next_cpu_const(cpu, mk_cpumask_const(map));
 	while (cpu < NR_CPUS && !cpu_online(cpu));
 	return cpu;
 }
 
 #define for_each_cpu(cpu, map)						\
-	for (cpu = first_cpu_const(map);				\
+	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
 		cpu < NR_CPUS;						\
-		cpu = next_cpu_const(cpu,map))
+		cpu = next_cpu_const(cpu,mk_cpumask_const(map)))
 
 #define for_each_online_cpu(cpu, map)					\
-	for (cpu = first_cpu_const(map);				\
+	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
+
+extern int __mask_snprintf_len(char *buf, unsigned int buflen,
+		const unsigned long *maskp, unsigned int maskbytes);
+
+#define cpumask_snprintf(buf, buflen, map)				\
+	__mask_snprintf_len(buf, buflen, cpus_addr(map), sizeof(map))
+
+extern int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
+	unsigned long *maskp, unsigned int maskbytes);
+
+#define cpumask_parse(buf, buflen, map)					\
+	__mask_parse_len(buf, buflen, cpus_addr(map), sizeof(map))
 
 #endif /* __LINUX_CPUMASK_H */
diff -Nru a/include/linux/device.h b/include/linux/device.h
--- a/include/linux/device.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/device.h	Thu Jan  8 23:00:24 2004
@@ -372,7 +372,7 @@
 extern void platform_device_unregister(struct platform_device *);
 
 extern struct bus_type platform_bus_type;
-extern struct device legacy_bus;
+extern struct device platform_bus;
 
 /* drivers/base/power.c */
 extern void device_shutdown(void);
diff -Nru a/include/linux/efi.h b/include/linux/efi.h
--- a/include/linux/efi.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/efi.h	Thu Jan  8 23:00:24 2004
@@ -16,6 +16,8 @@
 #include <linux/time.h>
 #include <linux/types.h>
 #include <linux/proc_fs.h>
+#include <linux/rtc.h>
+#include <linux/ioport.h>
 
 #include <asm/page.h>
 #include <asm/system.h>
@@ -77,18 +79,23 @@
 #define EFI_MAX_MEMORY_TYPE		14
 
 /* Attribute values: */
-#define EFI_MEMORY_UC		0x0000000000000001	/* uncached */
-#define EFI_MEMORY_WC		0x0000000000000002	/* write-coalescing */
-#define EFI_MEMORY_WT		0x0000000000000004	/* write-through */
-#define EFI_MEMORY_WB		0x0000000000000008	/* write-back */
-#define EFI_MEMORY_WP		0x0000000000001000	/* write-protect */
-#define EFI_MEMORY_RP		0x0000000000002000	/* read-protect */
-#define EFI_MEMORY_XP		0x0000000000004000	/* execute-protect */
-#define EFI_MEMORY_RUNTIME	0x8000000000000000	/* range requires runtime mapping */
+#define EFI_MEMORY_UC		((u64)0x0000000000000001ULL)	/* uncached */
+#define EFI_MEMORY_WC		((u64)0x0000000000000002ULL)	/* write-coalescing */
+#define EFI_MEMORY_WT		((u64)0x0000000000000004ULL)	/* write-through */
+#define EFI_MEMORY_WB		((u64)0x0000000000000008ULL)	/* write-back */
+#define EFI_MEMORY_WP		((u64)0x0000000000001000ULL)	/* write-protect */
+#define EFI_MEMORY_RP		((u64)0x0000000000002000ULL)	/* read-protect */
+#define EFI_MEMORY_XP		((u64)0x0000000000004000ULL)	/* execute-protect */
+#define EFI_MEMORY_RUNTIME	((u64)0x8000000000000000ULL)	/* range requires runtime mapping */
 #define EFI_MEMORY_DESCRIPTOR_VERSION	1
 
 #define EFI_PAGE_SHIFT		12
 
+/*
+ * For current x86 implementations of EFI, there is
+ * additional padding in the mem descriptors.  This is not
+ * the case in ia64.  Need to have this fixed in the f/w.
+ */
 typedef struct {
 	u32 type;
 	u32 pad;
@@ -96,6 +103,9 @@
 	u64 virt_addr;
 	u64 num_pages;
 	u64 attribute;
+#if defined (__i386__)
+	u64 pad1;
+#endif
 } efi_memory_desc_t;
 
 typedef int efi_freemem_callback_t (unsigned long start, unsigned long end, void *arg);
@@ -132,11 +142,12 @@
  */
 #define EFI_RESET_COLD 0
 #define EFI_RESET_WARM 1
+#define EFI_RESET_SHUTDOWN 2
 
 /*
  * EFI Runtime Services table
  */
-#define EFI_RUNTIME_SERVICES_SIGNATURE 0x5652453544e5552
+#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
 #define EFI_RUNTIME_SERVICES_REVISION  0x00010000
 
 typedef struct {
@@ -169,6 +180,10 @@
 typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
 typedef void efi_reset_system_t (int reset_type, efi_status_t status,
 				 unsigned long data_size, efi_char16_t *data);
+typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
+						unsigned long descriptor_size,
+						u32 descriptor_version,
+						efi_memory_desc_t *virtual_map);
 
 /*
  *  EFI Configuration Table and GUID definitions
@@ -194,12 +209,15 @@
 #define HCDP_TABLE_GUID	\
     EFI_GUID(  0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 )
 
+#define UGA_IO_PROTOCOL_GUID \
+    EFI_GUID(  0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 )
+
 typedef struct {
 	efi_guid_t guid;
 	unsigned long table;
 } efi_config_table_t;
 
-#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
+#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
 #define EFI_SYSTEM_TABLE_REVISION  ((1 << 16) | 00)
 
 typedef struct {
@@ -218,6 +236,13 @@
 	unsigned long tables;
 } efi_system_table_t;
 
+struct efi_memory_map {
+	efi_memory_desc_t *phys_map;
+	efi_memory_desc_t *map;
+	int nr_map;
+	unsigned long desc_version;
+};
+
 /*
  * All runtime access to EFI goes through this structure:
  */
@@ -230,6 +255,7 @@
 	void *sal_systab;		/* SAL system table */
 	void *boot_info;		/* boot info table */
 	void *hcdp;			/* HCDP table */
+	void *uga;			/* UGA table */
 	efi_get_time_t *get_time;
 	efi_set_time_t *set_time;
 	efi_get_wakeup_time_t *get_wakeup_time;
@@ -239,6 +265,7 @@
 	efi_set_variable_t *set_variable;
 	efi_get_next_high_mono_count_t *get_next_high_mono_count;
 	efi_reset_system_t *reset_system;
+	efi_set_virtual_address_map_t *set_virtual_address_map;
 } efi;
 
 static inline int
@@ -260,12 +287,25 @@
 
 extern void efi_init (void);
 extern void efi_map_pal_code (void);
+extern void efi_map_memmap(void);
 extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
 extern void efi_gettimeofday (struct timespec *ts);
 extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
 extern u64 efi_get_iobase (void);
 extern u32 efi_mem_type (unsigned long phys_addr);
 extern u64 efi_mem_attributes (unsigned long phys_addr);
+extern void efi_initialize_iomem_resources(struct resource *code_resource,
+					struct resource *data_resource);
+extern efi_status_t phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc);
+extern unsigned long inline __init efi_get_time(void);
+extern int inline __init efi_set_rtc_mmss(unsigned long nowtime);
+extern struct efi_memory_map memmap;
+
+#ifdef CONFIG_EFI
+extern int efi_enabled;
+#else
+#define efi_enabled 0
+#endif
 
 /*
  * Variable Attributes
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/fs.h	Thu Jan  8 23:00:23 2004
@@ -630,6 +630,7 @@
 extern void lease_get_mtime(struct inode *, struct timespec *time);
 extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
 extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
+extern void steal_locks(fl_owner_t from);
 
 struct fasync_struct {
 	int	magic;
@@ -1407,6 +1408,9 @@
 	spin_unlock(&dentry->d_lock);
 	return res;
 }
+
+/* kernel/fork.c */
+extern int unshare_files(void);
 
 #endif /* __KERNEL__ */
 #endif /* _LINUX_FS_H */
diff -Nru a/include/linux/hugetlb.h b/include/linux/hugetlb.h
--- a/include/linux/hugetlb.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/hugetlb.h	Thu Jan  8 23:00:24 2004
@@ -39,6 +39,7 @@
 
 #ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
 #define is_hugepage_only_range(addr, len)	0
+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
 #endif
 
 #else /* !CONFIG_HUGETLB_PAGE */
@@ -63,6 +64,7 @@
 #define is_aligned_hugepage_range(addr, len)	0
 #define pmd_huge(x)	0
 #define is_hugepage_only_range(addr, len)	0
+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
 
 #ifndef HPAGE_MASK
 #define HPAGE_MASK	0		/* Keep the compiler happy */
diff -Nru a/include/linux/i2c-dev.h b/include/linux/i2c-dev.h
--- a/include/linux/i2c-dev.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/i2c-dev.h	Thu Jan  8 23:00:23 2004
@@ -43,4 +43,6 @@
 	__u32 nmsgs;			/* number of i2c_msgs */
 };
 
+#define  I2C_RDRW_IOCTL_MAX_MSGS	42
+
 #endif /* _LINUX_I2C_DEV_H */
diff -Nru a/include/linux/i2c-id.h b/include/linux/i2c-id.h
--- a/include/linux/i2c-id.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/i2c-id.h	Thu Jan  8 23:00:23 2004
@@ -153,6 +153,7 @@
 #define I2C_DRIVERID_FS451 1037
 #define I2C_DRIVERID_W83627HF 1038
 #define I2C_DRIVERID_LM85 1039
+#define I2C_DRIVERID_LM83 1040
 
 /*
  * ---- Adapter types ----------------------------------------------------
@@ -258,6 +259,7 @@
 #define I2C_HW_SMBUS_AMD8111	0x0a
 #define I2C_HW_SMBUS_SCX200	0x0b
 #define I2C_HW_SMBUS_NFORCE2	0x0c
+#define I2C_HW_SMBUS_W9968CF	0x0d
 
 /* --- ISA pseudo-adapter						*/
 #define I2C_HW_ISA 0x00
diff -Nru a/include/linux/ide.h b/include/linux/ide.h
--- a/include/linux/ide.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/ide.h	Thu Jan  8 23:00:23 2004
@@ -51,9 +51,6 @@
 #ifndef SUPPORT_VLB_SYNC		/* 1 to support weird 32-bit chips */
 #define SUPPORT_VLB_SYNC	1	/* 0 to reduce kernel size */
 #endif
-#ifndef DISK_RECOVERY_TIME		/* off=0; on=access_delay_time */
-#define DISK_RECOVERY_TIME	0	/*  for hardware that needs it */
-#endif
 #ifndef OK_TO_RESET_CONTROLLER		/* 1 needed for good error recovery */
 #define OK_TO_RESET_CONTROLLER	1	/* 0 for use with AH2372A/B interface */
 #endif
@@ -246,11 +243,11 @@
 /*
  * Timeouts for various operations:
  */
-#define WAIT_DRQ	(5*HZ/100)	/* 50msec - spec allows up to 20ms */
+#define WAIT_DRQ	(HZ/10)		/* 100msec - spec allows up to 20ms */
 #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
 #define WAIT_READY	(5*HZ)		/* 5sec - some laptops are very slow */
 #else
-#define WAIT_READY	(3*HZ/100)	/* 30msec - should be instantaneous */
+#define WAIT_READY	(HZ/10)		/* 100msec - should be instantaneous */
 #endif /* CONFIG_APM || CONFIG_APM_MODULE */
 #define WAIT_PIDENTIFY	(10*HZ)	/* 10sec  - should be less than 3ms (?), if all ATAPI CD is closed at boot */
 #define WAIT_WORSTCASE	(30*HZ)	/* 30sec  - worst case when spinning up */
@@ -999,10 +996,6 @@
 	unsigned	dma_extra;	/* extra addr for dma ports */
 	unsigned long	config_data;	/* for use by chipset-specific code */
 	unsigned long	select_data;	/* for use by chipset-specific code */
-#if (DISK_RECOVERY_TIME > 0)
-	unsigned long	last_time;	/* time when previous rq was done */
-#endif
-
 
 	unsigned	noprobe    : 1;	/* don't probe for this interface */
 	unsigned	present    : 1;	/* this interface exists */
@@ -1693,6 +1686,8 @@
 #define GOOD_DMA_DRIVE		1
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
+extern int ide_build_sglist(ide_drive_t *, struct request *);
+extern int ide_raw_build_sglist(ide_drive_t *, struct request *);
 extern int ide_build_dmatable(ide_drive_t *, struct request *);
 extern void ide_destroy_dmatable(ide_drive_t *);
 extern ide_startstop_t ide_dma_intr(ide_drive_t *);
diff -Nru a/include/linux/input.h b/include/linux/input.h
--- a/include/linux/input.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/input.h	Thu Jan  8 23:00:24 2004
@@ -870,6 +870,7 @@
 	char *name;
 
 	struct input_device_id *id_table;
+	struct input_device_id *blacklist;
 
 	struct list_head	h_list;
 	struct list_head	node;
diff -Nru a/include/linux/ip.h b/include/linux/ip.h
--- a/include/linux/ip.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/ip.h	Thu Jan  8 23:00:23 2004
@@ -159,7 +159,10 @@
 	struct inet_opt   inet;
 };
 
-#define inet_sk(__sk) (&((struct inet_sock *)__sk)->inet)
+static inline struct inet_opt * inet_sk(const struct sock *__sk)
+{
+	return &((struct inet_sock *)__sk)->inet;
+}
 
 #endif
 
diff -Nru a/include/linux/ipv6.h b/include/linux/ipv6.h
--- a/include/linux/ipv6.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/ipv6.h	Thu Jan  8 23:00:24 2004
@@ -270,8 +270,15 @@
 	struct ipv6_pinfo inet6;
 };
 
-#define inet6_sk(__sk) ((struct raw6_sock *)__sk)->pinet6
-#define raw6_sk(__sk) (&((struct raw6_sock *)__sk)->raw6)
+static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
+{
+	return ((struct raw6_sock *)__sk)->pinet6;
+}
+
+static inline struct raw6_opt * raw6_sk(const struct sock *__sk)
+{
+	return &((struct raw6_sock *)__sk)->raw6;
+}
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #define __ipv6_only_sock(sk)	(inet6_sk(sk)->ipv6only)
diff -Nru a/include/linux/jiffies.h b/include/linux/jiffies.h
--- a/include/linux/jiffies.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/jiffies.h	Thu Jan  8 23:00:23 2004
@@ -10,7 +10,7 @@
 
 /*
  * The 64-bit value is not volatile - you MUST NOT read it
- * without holding read_lock_irq(&xtime_lock).
+ * without sampling the sequence number in xtime_lock.
  * get_jiffies_64() will do this for you as appropriate.
  */
 extern u64 jiffies_64;
diff -Nru a/include/linux/kernel.h b/include/linux/kernel.h
--- a/include/linux/kernel.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/kernel.h	Thu Jan  8 23:00:23 2004
@@ -87,6 +87,8 @@
 asmlinkage int printk(const char * fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
+unsigned long int_sqrt(unsigned long);
+
 static inline void console_silent(void)
 {
 	console_loglevel = 0;
diff -Nru a/include/linux/keyboard.h b/include/linux/keyboard.h
--- a/include/linux/keyboard.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/keyboard.h	Thu Jan  8 23:00:23 2004
@@ -2,7 +2,6 @@
 #define __LINUX_KEYBOARD_H
 
 #include <linux/wait.h>
-#include <linux/input.h>
 
 #define KG_SHIFT	0
 #define KG_CTRL		2
@@ -17,7 +16,7 @@
 
 #define NR_SHIFT	9
 
-#define NR_KEYS		(KEY_MAX+1)
+#define NR_KEYS		255
 #define MAX_NR_KEYMAPS	256
 /* This means 128Kb if all keymaps are allocated. Only the superuser
 	may increase the number of keymaps beyond MAX_NR_OF_USER_KEYMAPS. */
diff -Nru a/include/linux/kmod.h b/include/linux/kmod.h
--- a/include/linux/kmod.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/kmod.h	Thu Jan  8 23:00:23 2004
@@ -24,6 +24,8 @@
 #include <linux/compiler.h>
 
 #ifdef CONFIG_KMOD
+/* modprobe exit status on success, -ve on error.  Return value
+ * usually useless though. */
 extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
 #else
 static inline int request_module(const char * name, ...) { return -ENOSYS; }
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/libata.h	Thu Jan  8 23:00:23 2004
@@ -28,6 +28,7 @@
 #include <asm/io.h>
 #include <linux/ata.h>
 
+
 /*
  * compile-time options
  */
@@ -66,8 +67,6 @@
 
 /* defines only for the constants which don't work well as enums */
 #define ATA_TAG_POISON		0xfafbfcfdU
-#define ATA_DMA_BOUNDARY	0xffffUL
-#define ATA_DMA_MASK		0xffffffffULL
 
 enum {
 	/* various global constants */
@@ -171,6 +170,7 @@
 };
 
 /* forward declarations */
+struct scsi_device;
 struct ata_port_operations;
 struct ata_port;
 struct ata_queued_cmd;
@@ -247,8 +247,8 @@
 	struct ata_port		*ap;
 	struct ata_device	*dev;
 
-	Scsi_Cmnd		*scsicmd;
-	void			(*scsidone)(Scsi_Cmnd *);
+	struct scsi_cmnd		*scsicmd;
+	void			(*scsidone)(struct scsi_cmnd *);
 
 	struct list_head	node;
 	unsigned long		flags;		/* ATA_QCFLAG_xxx */
@@ -403,7 +403,7 @@
 extern void ata_pci_remove_one (struct pci_dev *pdev);
 extern int ata_device_add(struct ata_probe_ent *ent);
 extern int ata_scsi_detect(Scsi_Host_Template *sht);
-extern int ata_scsi_queuecmd(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *));
+extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
 extern int ata_scsi_error(struct Scsi_Host *host);
 extern int ata_scsi_release(struct Scsi_Host *host);
 extern int ata_scsi_slave_config(struct scsi_device *sdev);
@@ -427,6 +427,9 @@
 extern int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits);
 extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat, unsigned int done_late);
 extern void ata_eng_timeout(struct ata_port *ap);
+extern int ata_std_bios_param(struct scsi_device *sdev,
+			      struct block_device *bdev,
+			      sector_t capacity, int geom[]);
 
 
 static inline unsigned long msecs_to_jiffies(unsigned long msecs)
diff -Nru a/include/linux/list.h b/include/linux/list.h
--- a/include/linux/list.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/list.h	Thu Jan  8 23:00:24 2004
@@ -212,6 +212,12 @@
  * list_empty_careful - tests whether a list is
  * empty _and_ checks that no other CPU might be
  * in the process of still modifying either member
+ *
+ * NOTE: using list_empty_careful() without synchronization
+ * can only be safe if the only activity that can happen
+ * to the list entry is list_del_init(). Eg. it cannot be used
+ * if another CPU could re-list_add() it.
+ *
  * @head: the list to test.
  */
 static inline int list_empty_careful(const struct list_head *head)
diff -Nru a/include/linux/mm.h b/include/linux/mm.h
--- a/include/linux/mm.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/mm.h	Thu Jan  8 23:00:23 2004
@@ -143,7 +143,7 @@
 struct vm_operations_struct {
 	void (*open)(struct vm_area_struct * area);
 	void (*close)(struct vm_area_struct * area);
-	struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);
+	struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type);
 	int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
 };
 
@@ -322,8 +322,10 @@
 /*
  * The zone field is never updated after free_area_init_core()
  * sets it, so none of the operations on it need to be atomic.
+ * We'll have up to log2(MAX_NUMNODES * MAX_NR_ZONES) zones
+ * total, so we use NODES_SHIFT here to get enough bits.
  */
-#define ZONE_SHIFT (BITS_PER_LONG - 8)
+#define ZONE_SHIFT (BITS_PER_LONG - NODES_SHIFT - MAX_NR_ZONES_SHIFT)
 
 struct zone;
 extern struct zone *zone_table[];
@@ -405,7 +407,7 @@
 extern void show_free_areas(void);
 
 struct page *shmem_nopage(struct vm_area_struct * vma,
-			unsigned long address, int unused);
+			unsigned long address, int *type);
 struct file *shmem_file_setup(char * name, loff_t size, unsigned long flags);
 void shmem_lock(struct file * file, int lock);
 int shmem_zero_setup(struct vm_area_struct *);
@@ -563,7 +565,7 @@
 extern void truncate_inode_pages(struct address_space *, loff_t);
 
 /* generic vm_area_ops exported for stackable file systems */
-extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int);
+struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *);
 
 /* mm/page-writeback.c */
 int write_one_page(struct page *page, int wait);
diff -Nru a/include/linux/mmzone.h b/include/linux/mmzone.h
--- a/include/linux/mmzone.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/mmzone.h	Thu Jan  8 23:00:24 2004
@@ -159,7 +159,10 @@
 #define ZONE_DMA		0
 #define ZONE_NORMAL		1
 #define ZONE_HIGHMEM		2
-#define MAX_NR_ZONES		3
+
+#define MAX_NR_ZONES		3	/* Sync this with MAX_NR_ZONES_SHIFT */
+#define MAX_NR_ZONES_SHIFT	2	/* ceil(log2(MAX_NR_ZONES)) */
+
 #define GFP_ZONEMASK	0x03
 
 /*
@@ -284,8 +287,6 @@
 struct file;
 int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
 					  void *, size_t *);
-extern void setup_per_zone_pages_min(void);
-
 
 #ifdef CONFIG_NUMA
 #define MAX_NR_MEMBLKS	BITS_PER_LONG /* Max number of Memory Blocks */
diff -Nru a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h
--- a/include/linux/msdos_fs.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/msdos_fs.h	Thu Jan  8 23:00:24 2004
@@ -4,13 +4,8 @@
 /*
  * The MS-DOS filesystem constants/structures
  */
-#include <linux/buffer_head.h>
-#include <linux/string.h>
 #include <asm/byteorder.h>
 
-struct statfs;
-
-
 #define SECTOR_SIZE	512		/* sector size (bytes) */
 #define SECTOR_BITS	9		/* log2(SECTOR_SIZE) */
 #define MSDOS_DPB	(MSDOS_DPS)	/* dir entries per block */
@@ -18,6 +13,9 @@
 #define MSDOS_DPS	(SECTOR_SIZE / sizeof(struct msdos_dir_entry))
 #define MSDOS_DPS_BITS	4		/* log2(MSDOS_DPS) */
 
+
+#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
+
 #define MSDOS_ROOT_INO	1	/* == MINIX_ROOT_INO */
 #define MSDOS_DIR_BITS	5	/* log2(sizeof(struct msdos_dir_entry)) */
 
@@ -25,8 +23,6 @@
 #define FAT_MAX_DIR_ENTRIES	(65536)
 #define FAT_MAX_DIR_SIZE	(FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)
 
-#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
-
 #define ATTR_NONE    0 /* no attribute bits */
 #define ATTR_RO      1  /* read-only */
 #define ATTR_HIDDEN  2  /* hidden */
@@ -35,10 +31,10 @@
 #define ATTR_DIR     16 /* directory */
 #define ATTR_ARCH    32 /* archived */
 
+/* attribute bits that are copied "as is" */
 #define ATTR_UNUSED  (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
-	/* attribute bits that are copied "as is" */
+/* bits that are used by the Windows 95/Windows NT extended FAT */
 #define ATTR_EXT     (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
-	/* bits that are used by the Windows 95/Windows NT extended FAT */
 
 #define CASE_LOWER_BASE 8	/* base is lower case */
 #define CASE_LOWER_EXT  16	/* extension is lower case */
@@ -46,8 +42,12 @@
 #define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
 #define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)
 
+/* valid file mode bits */
 #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
-	/* valid file mode bits */
+/* Convert attribute bits and a mask to the UNIX mode. */
+#define MSDOS_MKMODE(a, m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
+/* Convert the UNIX mode to MS-DOS attribute bits. */
+#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
 
 #define MSDOS_NAME 11 /* maximum name length */
 #define MSDOS_LONGNAME 256 /* maximum name length */
@@ -55,24 +55,29 @@
 #define MSDOS_DOT    ".          " /* ".", padded to MSDOS_NAME chars */
 #define MSDOS_DOTDOT "..         " /* "..", padded to MSDOS_NAME chars */
 
-#define MSDOS_FAT12 4084 /* maximum number of clusters in a 12 bit FAT */
-
 /* media of boot sector */
 #define FAT_VALID_MEDIA(x)	((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
 #define FAT_FIRST_ENT(s, x)	((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
 	MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
 
+/* maximum number of clusters */
+#define MAX_FAT12 0xFF4
+#define MAX_FAT16 0xFFF4
+#define MAX_FAT32 0x0FFFFFF6
+#define MAX_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \
+	MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12)
+
 /* bad cluster mark */
 #define BAD_FAT12 0xFF7
 #define BAD_FAT16 0xFFF7
-#define BAD_FAT32 0xFFFFFF7
+#define BAD_FAT32 0x0FFFFFF7
 #define BAD_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? BAD_FAT32 : \
 	MSDOS_SB(s)->fat_bits == 16 ? BAD_FAT16 : BAD_FAT12)
 
 /* standard EOF */
 #define EOF_FAT12 0xFFF
 #define EOF_FAT16 0xFFFF
-#define EOF_FAT32 0xFFFFFFF
+#define EOF_FAT32 0x0FFFFFFF
 #define EOF_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? EOF_FAT32 : \
 	MSDOS_SB(s)->fat_bits == 16 ? EOF_FAT16 : EOF_FAT12)
 
@@ -80,8 +85,8 @@
 #define FAT_ENT_BAD	(BAD_FAT32)
 #define FAT_ENT_EOF	(EOF_FAT32)
 
-#define FAT_FSINFO_SIG1		0x41615252
-#define FAT_FSINFO_SIG2		0x61417272
+#define FAT_FSINFO_SIG1	0x41615252
+#define FAT_FSINFO_SIG2	0x61417272
 #define IS_FSINFO(x)	(CF_LE_L((x)->signature1) == FAT_FSINFO_SIG1	\
 			 && CF_LE_L((x)->signature2) == FAT_FSINFO_SIG2)
 
@@ -179,15 +184,10 @@
 	loff_t i_pos;		       /* on-disk position of directory entry */
 };
 
-/* Convert attribute bits and a mask to the UNIX mode. */
-#define MSDOS_MKMODE(a,m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
-
-/* Convert the UNIX mode to MS-DOS attribute bits. */
-#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
-
-
 #ifdef __KERNEL__
 
+#include <linux/buffer_head.h>
+#include <linux/string.h>
 #include <linux/nls.h>
 #include <linux/msdos_fs_i.h>
 #include <linux/msdos_fs_sb.h>
diff -Nru a/include/linux/msdos_fs_sb.h b/include/linux/msdos_fs_sb.h
--- a/include/linux/msdos_fs_sb.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/msdos_fs_sb.h	Thu Jan  8 23:00:24 2004
@@ -47,9 +47,9 @@
 	unsigned long data_start;    /* first data sector */
 	unsigned long clusters;      /* number of clusters */
 	unsigned long root_cluster;  /* first cluster of the root directory */
-	unsigned long fsinfo_sector; /* FAT32 fsinfo offset from start of disk */
+	unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
 	struct semaphore fat_lock;
-	int prev_free;               /* previously returned free cluster number */
+	int prev_free;               /* previously allocated cluster number */
 	int free_clusters;           /* -1 if undefined */
 	struct fat_mount_options options;
 	struct nls_table *nls_disk;  /* Codepage used on disk */
diff -Nru a/include/linux/nbd.h b/include/linux/nbd.h
--- a/include/linux/nbd.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/nbd.h	Thu Jan  8 23:00:24 2004
@@ -35,6 +35,9 @@
 /* Define PARANOIA to include extra sanity checking code in here & driver */
 #define PARANOIA
 
+/* userspace doesn't need the nbd_device structure */
+#ifdef __KERNEL__
+
 struct nbd_device {
 	int flags;
 	int harderror;		/* Code of hard error			*/
@@ -52,6 +55,8 @@
 	int blksize;
 	u64 bytesize;
 };
+
+#endif
 
 /* This now IS in some kind of include file...	*/
 
diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/netdevice.h	Thu Jan  8 23:00:24 2004
@@ -634,7 +634,7 @@
  */
 static inline void dev_kfree_skb_any(struct sk_buff *skb)
 {
-	if (in_irq())
+	if (in_irq() || irqs_disabled())
 		dev_kfree_skb_irq(skb);
 	else
 		dev_kfree_skb(skb);
diff -Nru a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h
--- a/include/linux/netfilter_bridge.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/netfilter_bridge.h	Thu Jan  8 23:00:24 2004
@@ -8,10 +8,8 @@
 #include <linux/netfilter.h>
 #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER)
 #include <asm/atomic.h>
-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 #include <linux/if_ether.h>
 #endif
-#endif
 
 /* Bridge Hooks */
 /* After promisc drops, checksum checks. */
@@ -71,13 +69,11 @@
 void nf_bridge_maybe_copy_header(struct sk_buff *skb)
 {
 	if (skb->nf_bridge) {
-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 		if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
-			memcpy(skb->data - 18, skb->nf_bridge->hh, 18);
+			memcpy(skb->data - 18, skb->nf_bridge->data, 18);
 			skb_push(skb, 4);
 		} else
-#endif
-			memcpy(skb->data - 16, skb->nf_bridge->hh, 16);
+			memcpy(skb->data - 16, skb->nf_bridge->data, 16);
 	}
 }
 
@@ -86,11 +82,10 @@
 {
         int header_size = 16;
 
-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 	if (skb->protocol == __constant_htons(ETH_P_8021Q))
 		header_size = 18;
-#endif
-	memcpy(skb->nf_bridge->hh, skb->data - header_size, header_size);
+
+	memcpy(skb->nf_bridge->data, skb->data - header_size, header_size);
 }
 
 struct bridge_skb_cb {
diff -Nru a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h
--- a/include/linux/netfilter_ipv4.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/netfilter_ipv4.h	Thu Jan  8 23:00:24 2004
@@ -51,6 +51,7 @@
 
 enum nf_ip_hook_priorities {
 	NF_IP_PRI_FIRST = INT_MIN,
+	NF_IP_PRI_SELINUX_FIRST = -225,
 	NF_IP_PRI_CONNTRACK = -200,
 	NF_IP_PRI_BRIDGE_SABOTAGE_FORWARD = -175,
 	NF_IP_PRI_MANGLE = -150,
@@ -58,6 +59,7 @@
 	NF_IP_PRI_BRIDGE_SABOTAGE_LOCAL_OUT = -50,
 	NF_IP_PRI_FILTER = 0,
 	NF_IP_PRI_NAT_SRC = 100,
+	NF_IP_PRI_SELINUX_LAST = 225,
 	NF_IP_PRI_LAST = INT_MAX,
 };
 
diff -Nru a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h
--- a/include/linux/netfilter_ipv6.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/netfilter_ipv6.h	Thu Jan  8 23:00:24 2004
@@ -56,11 +56,13 @@
 
 enum nf_ip6_hook_priorities {
 	NF_IP6_PRI_FIRST = INT_MIN,
+	NF_IP6_PRI_SELINUX_FIRST = -225,
 	NF_IP6_PRI_CONNTRACK = -200,
 	NF_IP6_PRI_MANGLE = -150,
 	NF_IP6_PRI_NAT_DST = -100,
 	NF_IP6_PRI_FILTER = 0,
 	NF_IP6_PRI_NAT_SRC = 100,
+	NF_IP6_PRI_SELINUX_LAST = 225,
 	NF_IP6_PRI_LAST = INT_MAX,
 };
 
diff -Nru a/include/linux/page-flags.h b/include/linux/page-flags.h
--- a/include/linux/page-flags.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/page-flags.h	Thu Jan  8 23:00:24 2004
@@ -133,6 +133,7 @@
 
 #define inc_page_state(member)	mod_page_state(member, 1UL)
 #define dec_page_state(member)	mod_page_state(member, 0UL - 1)
+#define add_page_state(member,delta) mod_page_state(member, (delta))
 #define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))
 
 
diff -Nru a/include/linux/pagemap.h b/include/linux/pagemap.h
--- a/include/linux/pagemap.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/pagemap.h	Thu Jan  8 23:00:23 2004
@@ -8,7 +8,6 @@
 #include <linux/fs.h>
 #include <linux/list.h>
 #include <linux/highmem.h>
-#include <linux/pagemap.h>
 #include <asm/uaccess.h>
 #include <linux/gfp.h>
 
diff -Nru a/include/linux/parser.h b/include/linux/parser.h
--- a/include/linux/parser.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/parser.h	Thu Jan  8 23:00:24 2004
@@ -1,3 +1,14 @@
+/*
+ * linux/include/linux/parser.h
+ *
+ * Header for lib/parser.c
+ * Intended use of these functions is parsing filesystem argument lists,
+ * but could potentially be used anywhere else that simple option=arg
+ * parsing is required.
+ */
+
+
+/* associates an integer enumerator with a pattern string. */
 struct match_token {
 	int token;
 	char *pattern;
@@ -5,15 +16,16 @@
 
 typedef struct match_token match_table_t[];
 
+/* Maximum number of arguments that match_token will find in a pattern */
 enum {MAX_OPT_ARGS = 3};
 
+/* Describe the location within a string of a substring */
 typedef struct {
 	char *from;
 	char *to;
 } substring_t;
 
-int match_token(char *s, match_table_t table, substring_t args[]);
-
+int match_token(char *, match_table_t table, substring_t args[]);
 int match_int(substring_t *, int *result);
 int match_octal(substring_t *, int *result);
 int match_hex(substring_t *, int *result);
diff -Nru a/include/linux/pci.h b/include/linux/pci.h
--- a/include/linux/pci.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/pci.h	Thu Jan  8 23:00:24 2004
@@ -36,6 +36,7 @@
 #define  PCI_COMMAND_WAIT 	0x80	/* Enable address/data stepping */
 #define  PCI_COMMAND_SERR	0x100	/* Enable SERR */
 #define  PCI_COMMAND_FAST_BACK	0x200	/* Enable back-to-back writes */
+#define  PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
 
 #define PCI_STATUS		0x06	/* 16 bits */
 #define  PCI_STATUS_CAP_LIST	0x10	/* Support Capability List */
@@ -198,6 +199,8 @@
 #define  PCI_CAP_ID_MSI		0x05	/* Message Signalled Interrupts */
 #define  PCI_CAP_ID_CHSWP	0x06	/* CompactPCI HotSwap */
 #define  PCI_CAP_ID_PCIX	0x07	/* PCI-X */
+#define  PCI_CAP_ID_EXP 	0x10	/* PCI Express */
+#define  PCI_CAP_ID_MSIX	0x11	/* MSI-X */
 #define PCI_CAP_LIST_NEXT	1	/* Next capability in the list */
 #define PCI_CAP_FLAGS		2	/* Capability defined flags (16 bits) */
 #define PCI_CAP_SIZEOF		4
@@ -275,11 +278,13 @@
 #define  PCI_MSI_FLAGS_QSIZE	0x70	/* Message queue size configured */
 #define  PCI_MSI_FLAGS_QMASK	0x0e	/* Maximum queue size available */
 #define  PCI_MSI_FLAGS_ENABLE	0x01	/* MSI feature enabled */
+#define  PCI_MSI_FLAGS_MASKBIT	0x100	/* 64-bit mask bits allowed */
 #define PCI_MSI_RFU		3	/* Rest of capability flags */
 #define PCI_MSI_ADDRESS_LO	4	/* Lower 32 bits */
 #define PCI_MSI_ADDRESS_HI	8	/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
 #define PCI_MSI_DATA_32		8	/* 16 bits of data for 32-bit devices */
 #define PCI_MSI_DATA_64		12	/* 16 bits of data for 64-bit devices */
+#define PCI_MSI_MASK_BIT	16	/* Mask bits register */
 
 /* CompactPCI Hotswap Register */
 
@@ -693,6 +698,18 @@
 
 #if defined(CONFIG_ISA) || defined(CONFIG_EISA)
 extern struct pci_dev *isa_bridge;
+#endif
+
+#ifndef CONFIG_PCI_USE_VECTOR
+static inline void pci_scan_msi_device(struct pci_dev *dev) {}
+static inline int pci_enable_msi(struct pci_dev *dev) {return -1;}
+static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) {}
+#else
+extern void pci_scan_msi_device(struct pci_dev *dev);
+extern int pci_enable_msi(struct pci_dev *dev);
+extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
+extern int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec);
+extern int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec);
 #endif
 
 #endif /* CONFIG_PCI */
diff -Nru a/include/linux/pci_ids.h b/include/linux/pci_ids.h
--- a/include/linux/pci_ids.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/pci_ids.h	Thu Jan  8 23:00:23 2004
@@ -325,6 +325,7 @@
 /* RadeonIGP */
 #define PCI_DEVICE_ID_ATI_RS100		0xcab0
 #define PCI_DEVICE_ID_ATI_RS200		0xcab2
+#define PCI_DEVICE_ID_ATI_RS200_B	0xcbb3
 #define PCI_DEVICE_ID_ATI_RS250		0xcab3
 #define PCI_DEVICE_ID_ATI_RS300_100	0x5830
 #define PCI_DEVICE_ID_ATI_RS300_133	0x5831
@@ -900,6 +901,7 @@
 
 #define PCI_VENDOR_ID_SGI		0x10a9
 #define PCI_DEVICE_ID_SGI_IOC3		0x0003
+#define PCI_DEVICE_ID_SGI_IOC4		0x100a
 #define PCI_VENDOR_ID_SGI_LITHIUM	0x1002
 
 #define PCI_VENDOR_ID_ACC		0x10aa
@@ -1784,11 +1786,13 @@
 #define PCI_DEVICE_ID_TIGON3_5702	0x1646
 #define PCI_DEVICE_ID_TIGON3_5703	0x1647
 #define PCI_DEVICE_ID_TIGON3_5704	0x1648
+#define PCI_DEVICE_ID_TIGON3_5704S_2	0x1649
 #define PCI_DEVICE_ID_TIGON3_5702FE	0x164d
 #define PCI_DEVICE_ID_TIGON3_5705	0x1653
 #define PCI_DEVICE_ID_TIGON3_5705_2	0x1654
 #define PCI_DEVICE_ID_TIGON3_5705M	0x165d
 #define PCI_DEVICE_ID_TIGON3_5705M_2	0x165e
+#define PCI_DEVICE_ID_TIGON3_5705F	0x166e
 #define PCI_DEVICE_ID_TIGON3_5782	0x1696
 #define PCI_DEVICE_ID_TIGON3_5788	0x169c
 #define PCI_DEVICE_ID_TIGON3_5702X	0x16a6
@@ -2052,6 +2056,7 @@
 #define PCI_DEVICE_ID_INTEL_82443MX_3	0x719b
 #define PCI_DEVICE_ID_INTEL_82443GX_0	0x71a0
 #define PCI_DEVICE_ID_INTEL_82443GX_1	0x71a1
+#define PCI_DEVICE_ID_INTEL_82443GX_2	0x71a2
 #define PCI_DEVICE_ID_INTEL_82372FB_0	0x7600
 #define PCI_DEVICE_ID_INTEL_82372FB_1	0x7601
 #define PCI_DEVICE_ID_INTEL_82372FB_2	0x7602
diff -Nru a/include/linux/pci_msi.h b/include/linux/pci_msi.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/linux/pci_msi.h	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,193 @@
+/*
+ *	../include/linux/pci_msi.h
+ *
+ */
+
+#ifndef _ASM_PCI_MSI_H
+#define _ASM_PCI_MSI_H
+
+#include <linux/pci.h>
+
+#define MSI_AUTO -1
+#define NR_REPEATS	23
+#define NR_RESERVED_VECTORS 3 /*FIRST_DEVICE_VECTOR,FIRST_SYSTEM_VECTOR,0x80 */
+
+/*
+ * Assume the maximum number of hot plug slots supported by the system is about
+ * ten. The worstcase is that each of these slots is hot-added with a device,
+ * which has two MSI/MSI-X capable functions. To avoid any MSI-X driver, which
+ * attempts to request all available vectors, NR_HP_RESERVED_VECTORS is defined
+ * as below to ensure at least one message is assigned to each detected MSI/
+ * MSI-X device function.
+ */
+#define NR_HP_RESERVED_VECTORS 	20
+
+extern int vector_irq[NR_IRQS];
+extern cpumask_t pending_irq_balance_cpumask[NR_IRQS];
+extern void (*interrupt[NR_IRQS])(void);
+
+#ifdef CONFIG_SMP
+#define set_msi_irq_affinity	set_msi_affinity
+#else
+#define set_msi_irq_affinity	NULL
+static inline void move_msi(int vector) {}
+#endif
+
+#ifndef CONFIG_X86_IO_APIC
+static inline int get_ioapic_vector(struct pci_dev *dev) { return -1;}
+static inline void restore_ioapic_irq_handler(int irq) {}
+#else
+extern void restore_ioapic_irq_handler(int irq);
+#endif
+
+/*
+ * MSI-X Address Register
+ */
+#define PCI_MSIX_FLAGS_QSIZE		0x7FF
+#define PCI_MSIX_FLAGS_ENABLE		(1 << 15)
+#define PCI_MSIX_FLAGS_BIRMASK		(7 << 0)
+#define PCI_MSIX_FLAGS_BITMASK		(1 << 0)
+
+#define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET	0
+#define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET	4
+#define PCI_MSIX_ENTRY_DATA_OFFSET		8
+#define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET	12
+#define PCI_MSIX_ENTRY_SIZE			16
+
+#define msi_control_reg(base)		(base + PCI_MSI_FLAGS)
+#define msi_lower_address_reg(base)	(base + PCI_MSI_ADDRESS_LO)
+#define msi_upper_address_reg(base)	(base + PCI_MSI_ADDRESS_HI)
+#define msi_data_reg(base, is64bit)	\
+	( (is64bit == 1) ? base+PCI_MSI_DATA_64 : base+PCI_MSI_DATA_32 )
+#define msi_mask_bits_reg(base, is64bit) \
+	( (is64bit == 1) ? base+PCI_MSI_MASK_BIT : base+PCI_MSI_MASK_BIT-4)
+#define msi_disable(control)		control &= ~PCI_MSI_FLAGS_ENABLE
+#define multi_msi_capable(control) \
+	(1 << ((control & PCI_MSI_FLAGS_QMASK) >> 1))
+#define multi_msi_enable(control, num) \
+	control |= (((num >> 1) << 4) & PCI_MSI_FLAGS_QSIZE);
+#define is_64bit_address(control)	(control & PCI_MSI_FLAGS_64BIT)
+#define is_mask_bit_support(control)	(control & PCI_MSI_FLAGS_MASKBIT)
+#define msi_enable(control, num) multi_msi_enable(control, num); \
+	control |= PCI_MSI_FLAGS_ENABLE
+
+#define msix_control_reg		msi_control_reg
+#define msix_table_offset_reg(base)	(base + 0x04)
+#define msix_pba_offset_reg(base)	(base + 0x08)
+#define msix_enable(control)	 	control |= PCI_MSIX_FLAGS_ENABLE
+#define msix_disable(control)	 	control &= ~PCI_MSIX_FLAGS_ENABLE
+#define msix_table_size(control) 	((control & PCI_MSIX_FLAGS_QSIZE)+1)
+#define multi_msix_capable		msix_table_size
+#define msix_unmask(address)	 	(address & ~PCI_MSIX_FLAGS_BITMASK)
+#define msix_mask(address)		(address | PCI_MSIX_FLAGS_BITMASK)
+#define msix_is_pending(address) 	(address & PCI_MSIX_FLAGS_PENDMASK)
+
+extern char __dbg_str_buf[256];
+#define _DEFINE_DBG_BUFFER	char __dbg_str_buf[256];
+#define _DBG_K_TRACE_ENTRY	((unsigned int)0x00000001)
+#define _DBG_K_TRACE_EXIT	((unsigned int)0x00000002)
+#define _DBG_K_INFO		((unsigned int)0x00000004)
+#define _DBG_K_ERROR		((unsigned int)0x00000008)
+#define _DBG_K_TRACE	(_DBG_K_TRACE_ENTRY | _DBG_K_TRACE_EXIT)
+
+#define _DEBUG_LEVEL	(_DBG_K_INFO | _DBG_K_ERROR | _DBG_K_TRACE)
+#define _DBG_PRINT( dbg_flags, args... )		\
+if ( _DEBUG_LEVEL & (dbg_flags) )			\
+{							\
+	int len;					\
+	len = sprintf(__dbg_str_buf, "%s:%d: %s ", 	\
+		__FILE__, __LINE__, __FUNCTION__ ); 	\
+	sprintf(__dbg_str_buf + len, args);		\
+	printk(KERN_INFO "%s\n", __dbg_str_buf);	\
+}
+
+#define MSI_FUNCTION_TRACE_ENTER	\
+	_DBG_PRINT (_DBG_K_TRACE_ENTRY, "%s", "[Entry]");
+#define MSI_FUNCTION_TRACE_EXIT		\
+	_DBG_PRINT (_DBG_K_TRACE_EXIT, "%s", "[Entry]");
+
+/*
+ * MSI Defined Data Structures
+ */
+#define MSI_ADDRESS_HEADER		0xfee
+#define MSI_ADDRESS_HEADER_SHIFT	12
+#define MSI_ADDRESS_HEADER_MASK		0xfff000
+#define MSI_TARGET_CPU_SHIFT		4
+#define MSI_TARGET_CPU_MASK		0xff
+#define MSI_DELIVERY_MODE		0
+#define MSI_LEVEL_MODE			1	/* Edge always assert */
+#define MSI_TRIGGER_MODE		0	/* MSI is edge sensitive */
+#define MSI_LOGICAL_MODE		1
+#define MSI_REDIRECTION_HINT_MODE	0
+#ifdef CONFIG_SMP
+#define MSI_TARGET_CPU			logical_smp_processor_id()
+#else
+#define MSI_TARGET_CPU			TARGET_CPUS
+#endif
+
+struct msg_data {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+	__u32	vector		:  8;
+	__u32	delivery_mode	:  3;	/* 000b: FIXED | 001b: lowest prior */
+	__u32	reserved_1	:  3;
+	__u32	level		:  1;	/* 0: deassert | 1: assert */
+	__u32	trigger		:  1;	/* 0: edge | 1: level */
+	__u32	reserved_2	: 16;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+	__u32	reserved_2	: 16;
+	__u32	trigger		:  1;	/* 0: edge | 1: level */
+	__u32	level		:  1;	/* 0: deassert | 1: assert */
+	__u32	reserved_1	:  3;
+	__u32	delivery_mode	:  3;	/* 000b: FIXED | 001b: lowest prior */
+	__u32	vector		:  8;
+#else
+#error "Bitfield endianness not defined! Check your byteorder.h"
+#endif
+} __attribute__ ((packed));
+
+struct msg_address {
+	union {
+		struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+			__u32	reserved_1	:  2;
+			__u32	dest_mode	:  1;	/*0:physic | 1:logic */
+			__u32	redirection_hint:  1;  	/*0: dedicated CPU
+							  1: lowest priority */
+			__u32	reserved_2	:  4;
+ 			__u32	dest_id		: 24;	/* Destination ID */
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ 			__u32	dest_id		: 24;	/* Destination ID */
+			__u32	reserved_2	:  4;
+			__u32	redirection_hint:  1;  	/*0: dedicated CPU
+							  1: lowest priority */
+			__u32	dest_mode	:  1;	/*0:physic | 1:logic */
+			__u32	reserved_1	:  2;
+#else
+#error "Bitfield endianness not defined! Check your byteorder.h"
+#endif
+      		}u;
+       		__u32  value;
+	}lo_address;
+	__u32 	hi_address;
+} __attribute__ ((packed));
+
+struct msi_desc {
+	struct {
+		__u8	type	: 5; 	/* {0: unused, 5h:MSI, 11h:MSI-X} */
+		__u8	maskbit	: 1; 	/* mask-pending bit supported ?   */
+		__u8	reserved: 2; 	/* reserved			  */
+		__u8	entry_nr;    	/* specific enabled entry 	  */
+		__u8	default_vector; /* default pre-assigned vector    */
+		__u8	current_cpu; 	/* current destination cpu	  */
+	}msi_attrib;
+
+	struct {
+		__u16	head;
+		__u16	tail;
+	}link;
+
+	unsigned long mask_base;
+	struct pci_dev *dev;
+};
+
+#endif /* _ASM_PCI_MSI_H */
diff -Nru a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h
--- a/include/linux/percpu_counter.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/percpu_counter.h	Thu Jan  8 23:00:24 2004
@@ -8,17 +8,14 @@
 #include <linux/spinlock.h>
 #include <linux/smp.h>
 #include <linux/threads.h>
+#include <linux/percpu.h>
 
 #ifdef CONFIG_SMP
 
-struct __percpu_counter {
-	long count;
-} ____cacheline_aligned;
-
 struct percpu_counter {
 	spinlock_t lock;
 	long count;
-	struct __percpu_counter counters[NR_CPUS];
+	long *counters;
 };
 
 #if NR_CPUS >= 16
@@ -29,12 +26,14 @@
 
 static inline void percpu_counter_init(struct percpu_counter *fbc)
 {
-	int i;
-
 	spin_lock_init(&fbc->lock);
 	fbc->count = 0;
-	for (i = 0; i < NR_CPUS; i++)
-		fbc->counters[i].count = 0;
+	fbc->counters = alloc_percpu(long);
+}
+
+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
+{
+	free_percpu(fbc->counters);
 }
 
 void percpu_counter_mod(struct percpu_counter *fbc, long amount);
@@ -67,6 +66,10 @@
 static inline void percpu_counter_init(struct percpu_counter *fbc)
 {
 	fbc->count = 0;
+}
+
+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
+{
 }
 
 static inline void
diff -Nru a/include/linux/proc_fs.h b/include/linux/proc_fs.h
--- a/include/linux/proc_fs.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/proc_fs.h	Thu Jan  8 23:00:23 2004
@@ -141,6 +141,8 @@
 extern struct proc_dir_entry *proc_symlink(const char *,
 		struct proc_dir_entry *, const char *);
 extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
+extern struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
+			struct proc_dir_entry *parent);
 
 static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
 	mode_t mode, struct proc_dir_entry *base, 
diff -Nru a/include/linux/quota.h b/include/linux/quota.h
--- a/include/linux/quota.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/quota.h	Thu Jan  8 23:00:24 2004
@@ -250,7 +250,7 @@
 	void (*free_space) (struct inode *, qsize_t);
 	void (*free_inode) (const struct inode *, unsigned long);
 	int (*transfer) (struct inode *, struct iattr *);
-	int (*sync_dquot) (struct dquot *);
+	int (*write_dquot) (struct dquot *);
 };
 
 /* Operations handling requests from userspace */
diff -Nru a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h
--- a/include/linux/reiserfs_fs.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/reiserfs_fs.h	Thu Jan  8 23:00:24 2004
@@ -1719,7 +1719,7 @@
 void reiserfs_check_lock_depth(char *caller) ;
 void reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh, int wait) ;
 void reiserfs_restore_prepared_buffer(struct super_block *, struct buffer_head *bh) ;
-int journal_init(struct super_block *, const char * j_dev_name, int old_format) ;
+int journal_init(struct super_block *, const char * j_dev_name, int old_format, unsigned int) ;
 int journal_release(struct reiserfs_transaction_handle*, struct super_block *) ;
 int journal_release_error(struct reiserfs_transaction_handle*, struct super_block *) ;
 int journal_end(struct reiserfs_transaction_handle *, struct super_block *, unsigned long) ;
diff -Nru a/include/linux/sched.h b/include/linux/sched.h
--- a/include/linux/sched.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/sched.h	Thu Jan  8 23:00:23 2004
@@ -205,7 +205,6 @@
 	unsigned long rss, total_vm, locked_vm;
 	unsigned long def_flags;
 	cpumask_t cpu_vm_mask;
-	unsigned long swap_address;
 
 	unsigned long saved_auxv[40]; /* for /proc/PID/auxv */
 
diff -Nru a/include/linux/serio.h b/include/linux/serio.h
--- a/include/linux/serio.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/serio.h	Thu Jan  8 23:00:24 2004
@@ -49,6 +49,7 @@
 	irqreturn_t (*interrupt)(struct serio *, unsigned char,
 			unsigned int, struct pt_regs *);
 	void (*connect)(struct serio *, struct serio_dev *dev);
+	int  (*reconnect)(struct serio *);
 	void (*disconnect)(struct serio *);
 	void (*cleanup)(struct serio *);
 
@@ -58,12 +59,15 @@
 int serio_open(struct serio *serio, struct serio_dev *dev);
 void serio_close(struct serio *serio);
 void serio_rescan(struct serio *serio);
+void serio_reconnect(struct serio *serio);
 irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs);
 
 void serio_register_port(struct serio *serio);
-void serio_register_slave_port(struct serio *serio);
+void serio_register_port_delayed(struct serio *serio);
+void __serio_register_port(struct serio *serio);
 void serio_unregister_port(struct serio *serio);
-void serio_unregister_slave_port(struct serio *serio);
+void serio_unregister_port_delayed(struct serio *serio);
+void __serio_unregister_port(struct serio *serio);
 void serio_register_device(struct serio_dev *dev);
 void serio_unregister_device(struct serio_dev *dev);
 
diff -Nru a/include/linux/skbuff.h b/include/linux/skbuff.h
--- a/include/linux/skbuff.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/skbuff.h	Thu Jan  8 23:00:24 2004
@@ -107,7 +107,7 @@
 	struct net_device *netoutdev;
 #endif
 	unsigned int mask;
-	unsigned long hh[32 / sizeof(unsigned long)];
+	unsigned long data[32 / sizeof(unsigned long)];
 };
 #endif
 
@@ -764,10 +764,10 @@
 }
 
 /**
- *	skb_dequeue - remove from the head of the queue
+ *	skb_dequeue_tail - remove from the tail of the queue
  *	@list: list to dequeue from
  *
- *	Remove the head of the list. The list lock is taken so the function
+ *	Remove the tail of the list. The list lock is taken so the function
  *	may be used safely with other locking list functions. The tail item is
  *	returned or %NULL if the list is empty.
  */
@@ -1132,7 +1132,7 @@
  *	is returned and the old skb data released.
  */
 extern int __skb_linearize(struct sk_buff *skb, int gfp);
-static inline int __deprecated skb_linearize(struct sk_buff *skb, int gfp)
+static inline int skb_linearize(struct sk_buff *skb, int gfp)
 {
 	return __skb_linearize(skb, gfp);
 }
diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h
--- a/include/linux/sysctl.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/sysctl.h	Thu Jan  8 23:00:24 2004
@@ -579,6 +579,14 @@
 	NET_SCTP_MAX_BURST               = 12,
 };
 
+/* /proc/sys/net/bridge */
+enum {
+	NET_BRIDGE_NF_CALL_ARPTABLES = 1,
+	NET_BRIDGE_NF_CALL_IPTABLES = 2,
+	NET_BRIDGE_NF_CALL_IP6TABLES = 3,
+	NET_BRIDGE_NF_FILTER_VLAN_TAGGED = 4,
+};
+
 /* CTL_PROC names: */
 
 /* CTL_FS names: */
diff -Nru a/include/linux/tcp.h b/include/linux/tcp.h
--- a/include/linux/tcp.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/tcp.h	Thu Jan  8 23:00:24 2004
@@ -386,7 +386,10 @@
 	struct tcp_opt	  tcp;
 };
 
-#define tcp_sk(__sk) (&((struct tcp_sock *)__sk)->tcp)
+static inline struct tcp_opt * tcp_sk(const struct sock *__sk)
+{
+	return &((struct tcp_sock *)__sk)->tcp;
+}
 
 #endif
 
diff -Nru a/include/linux/udp.h b/include/linux/udp.h
--- a/include/linux/udp.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/udp.h	Thu Jan  8 23:00:23 2004
@@ -60,7 +60,10 @@
 	struct udp_opt	  udp;
 };
 
-#define udp_sk(__sk) (&((struct udp_sock *)__sk)->udp)
+static inline struct udp_opt * udp_sk(const struct sock *__sk)
+{
+	return &((struct udp_sock *)__sk)->udp;
+}
 
 #endif
 
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h	Thu Jan  8 23:00:23 2004
+++ b/include/linux/usb.h	Thu Jan  8 23:00:24 2004
@@ -414,9 +414,6 @@
  *	Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set
  *	or your driver's probe function will never get called.
  * @driver: the driver model core driver structure.
- * @serialize: a semaphore used to serialize access to this driver.  Used
- * 	in the probe and disconnect functions.  Only the USB core should use
- * 	this lock.
  *
  * USB drivers must provide a name, probe() and disconnect() methods,
  * and an id_table.  Other driver fields are optional.
@@ -451,8 +448,6 @@
 	const struct usb_device_id *id_table;
 
 	struct device_driver driver;
-
-	struct semaphore serialize;
 };
 #define	to_usb_driver(d) container_of(d, struct usb_driver, driver)
 
diff -Nru a/include/linux/usb_ch9.h b/include/linux/usb_ch9.h
--- a/include/linux/usb_ch9.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/usb_ch9.h	Thu Jan  8 23:00:24 2004
@@ -116,6 +116,17 @@
 #define USB_DT_DEVICE_QUALIFIER		0x06
 #define USB_DT_OTHER_SPEED_CONFIG	0x07
 #define USB_DT_INTERFACE_POWER		0x08
+/* these are from a minor usb 2.0 revision (ECN) */
+#define USB_DT_OTG			0x09
+#define USB_DT_DEBUG			0x0a
+#define USB_DT_INTERFACE_ASSOCIATION	0x0b
+
+/* conventional codes for class-specific descriptors */
+#define USB_DT_CS_DEVICE		0x21
+#define USB_DT_CS_CONFIG		0x22
+#define USB_DT_CS_STRING		0x23
+#define USB_DT_CS_INTERFACE		0x24
+#define USB_DT_CS_ENDPOINT		0x25
 
 /* All standard descriptors have these 2 fields at the beginning */
 struct usb_descriptor_header {
@@ -165,6 +176,7 @@
 #define USB_CLASS_CDC_DATA		0x0a
 #define USB_CLASS_CSCID			0x0b	/* chip+ smart card */
 #define USB_CLASS_CONTENT_SEC		0x0d	/* content security */
+#define USB_CLASS_VIDEO			0x0e
 #define USB_CLASS_APP_SPEC		0xfe
 #define USB_CLASS_VENDOR_SPEC		0xff
 
@@ -278,6 +290,36 @@
 	__u8  bMaxPacketSize0;
 	__u8  bNumConfigurations;
 	__u8  bRESERVED;
+} __attribute__ ((packed));
+
+
+/*-------------------------------------------------------------------------*/
+
+/* USB_DT_OTG (from OTG 1.0a supplement) */
+struct usb_otg_descriptor {
+	__u8  bLength;
+	__u8  bDescriptorType;
+
+	__u8  bmAttributes;	/* support for HNP, SRP, etc */
+} __attribute__ ((packed));
+
+/* from usb_otg_descriptor.bmAttributes */
+#define USB_OTG_SRP		(1 << 0)
+#define USB_OTG_HNP		(1 << 1)	/* swap host/device roles */
+
+/*-------------------------------------------------------------------------*/
+
+/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */
+struct usb_interface_assoc_descriptor {
+	__u8  bLength;
+	__u8  bDescriptorType;
+
+	__u8  bFirstInterface;
+	__u8  bInterfaceCount;
+	__u8  bFunctionClass;
+	__u8  bFunctionSubClass;
+	__u8  bFunctionProtocol;
+	__u8  iFunction;
 } __attribute__ ((packed));
 
 
diff -Nru a/include/linux/usb_gadget.h b/include/linux/usb_gadget.h
--- a/include/linux/usb_gadget.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/usb_gadget.h	Thu Jan  8 23:00:24 2004
@@ -28,12 +28,20 @@
  * 	for mapping and unmapping the buffer.
  * @length: Length of that data
  * @no_interrupt: If true, hints that no completion irq is needed.
- *	Helpful sometimes with deep request queues.
+ *	Helpful sometimes with deep request queues that are handled
+ *	directly by DMA controllers.
  * @zero: If true, when writing data, makes the last packet be "short"
  *     by adding a zero length packet as needed;
  * @short_not_ok: When reading data, makes short packets be
  *     treated as errors (queue stops advancing till cleanup).
- * @complete: Function called when request completes
+ * @complete: Function called when request completes, so this request and
+ *	its buffer may be re-used.
+ *	Reads terminate with a short packet, or when the buffer fills,
+ *	whichever comes first.  When writes terminate, some data bytes
+ *	will usually still be in flight (often in a hardware fifo).
+ *	Errors (for reads or writes) stop the queue from advancing
+ *	until the completion function returns, so that any transfers
+ *	invalidated by the error may first be dequeued.
  * @context: For use by the completion callback
  * @list: For use by the gadget driver.
  * @status: Reports completion code, zero or a negative errno.
@@ -41,12 +49,13 @@
  * 	the completion callback returns.
  * 	Code "-ESHUTDOWN" indicates completion caused by device disconnect,
  * 	or when the driver disabled the endpoint.
- * @actual: Reports actual bytes transferred.  For reads (OUT
+ * @actual: Reports bytes transferred to/from the buffer.  For reads (OUT
  * 	transfers) this may be less than the requested length.  If the
  * 	short_not_ok flag is set, short reads are treated as errors
  * 	even when status otherwise indicates successful completion.
- * 	Note that for writes (IN transfers) the data bytes may still
- * 	reside in a device-side FIFO.
+ * 	Note that for writes (IN transfers) some data bytes may still
+ * 	reside in a device-side FIFO when the request is reported as
+ *	complete.
  *
  * These are allocated/freed through the endpoint they're used with.  The
  * hardware's driver can add extra per-request data to the memory it returns,
@@ -287,6 +296,9 @@
  * Each request is turned into one or more packets.  The controller driver
  * never merges adjacent requests into the same packet.  OUT transfers
  * will sometimes use data that's already buffered in the hardware.
+ * Drivers can rely on the fact that the first byte of the request's buffer
+ * always corresponds to the first byte of some USB packet, for both
+ * IN and OUT transfers.
  *
  * Bulk endpoints can queue any amount of data; the transfer is packetized
  * automatically.  The last packet will be short if the request doesn't fill it
@@ -361,6 +373,9 @@
  *
  * Returns zero, or a negative error code.  On success, this call sets
  * underlying hardware state that blocks data transfers.
+ * Attempts to halt IN endpoints will fail (returning -EAGAIN) if any
+ * transfer requests are still queued, or if the controller hardware
+ * (usually a FIFO) still holds bytes that the host hasn't collected.
  */
 static inline int
 usb_ep_set_halt (struct usb_ep *ep)
@@ -393,8 +408,8 @@
  *
  * FIFO endpoints may have "unclaimed data" in them in certain cases,
  * such as after aborted transfers.  Hosts may not have collected all
- * the IN data written by the gadget driver, as reported by a request
- * completion.  The gadget driver may not have collected all the data
+ * the IN data written by the gadget driver (and reported by a request
+ * completion).  The gadget driver may not have collected all the data
  * written OUT to it by the host.  Drivers that need precise handling for
  * fault reporting or recovery may need to use this call.
  *
diff -Nru a/include/linux/videodev.h b/include/linux/videodev.h
--- a/include/linux/videodev.h	Thu Jan  8 23:00:24 2004
+++ b/include/linux/videodev.h	Thu Jan  8 23:00:24 2004
@@ -429,6 +429,7 @@
 #define VID_HARDWARE_CPIA2	33
 #define VID_HARDWARE_VICAM      34
 #define VID_HARDWARE_SF16FMR2	35
+#define VID_HARDWARE_W9968CF	36	/* W996[87]CF JPEG USB Dual Mode Cam */
 #endif /* __LINUX_VIDEODEV_H */
 
 /*
diff -Nru a/include/media/saa7146.h b/include/media/saa7146.h
--- a/include/media/saa7146.h	Thu Jan  8 23:00:23 2004
+++ b/include/media/saa7146.h	Thu Jan  8 23:00:23 2004
@@ -87,6 +87,7 @@
 {
 	char	name[32];		/* name of the device */
 #define SAA7146_USE_I2C_IRQ	0x1
+#define SAA7146_I2C_SHORT_DELAY	0x2
 	int	flags;
 	
 	/* pairs of subvendor and subdevice ids for
@@ -162,9 +163,10 @@
 struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc);
 int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt);
 void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt);
-void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
 char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt);
 void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data);
+int saa7146_wait_for_debi_done(struct saa7146_dev *dev);
 
 /* some memory sizes */
 #define SAA7146_I2C_MEM		( 1*PAGE_SIZE)
@@ -186,6 +188,9 @@
 #define SAA7146_GPIO_IRQHL 0x30
 #define SAA7146_GPIO_OUTLO 0x40
 #define SAA7146_GPIO_OUTHI 0x50
+
+/* debi defines */
+#define DEBINOSWAP 0x000e0000
 
 /* define for the register programming sequencer (rps) */
 #define CMD_NOP		0x00000000  /* No operation */
diff -Nru a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h
--- a/include/media/saa7146_vv.h	Thu Jan  8 23:00:23 2004
+++ b/include/media/saa7146_vv.h	Thu Jan  8 23:00:23 2004
@@ -149,7 +149,7 @@
 };
 
 /* flags */
-#define SAA7146_EXT_SWAP_ODD_EVEN       0x1     /* needs odd/even fields swapped */
+// #define SAA7146_EXT_SWAP_ODD_EVEN	0x1     /* needs odd/even fields swapped */
 #define SAA7146_USE_PORT_B_FOR_VBI	0x2     /* use input port b for vbi hardware bug workaround */
 
 struct saa7146_ext_vv
@@ -171,12 +171,10 @@
 
 struct saa7146_use_ops  {
         void (*init)(struct saa7146_dev *, struct saa7146_vv *);
-        void(*open)(struct saa7146_dev *, struct saa7146_fh *);
-        void (*release)(struct saa7146_dev *, struct saa7146_fh *,struct file *);
+        void(*open)(struct saa7146_dev *, struct file *);
+        void (*release)(struct saa7146_dev *, struct file *);
         void (*irq_done)(struct saa7146_dev *, unsigned long status);
 	ssize_t (*read)(struct file *, char *, size_t, loff_t *);
-        int (*capture_begin)(struct saa7146_fh *);
-        int (*capture_end)(struct saa7146_fh *);
 };
 
 /* from saa7146_fops.c */
diff -Nru a/include/net/ax25.h b/include/net/ax25.h
--- a/include/net/ax25.h	Thu Jan  8 23:00:24 2004
+++ b/include/net/ax25.h	Thu Jan  8 23:00:24 2004
@@ -227,8 +227,7 @@
 struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
 struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
 extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
-extern struct sock *ax25_addr_match(ax25_address *);
-extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
+extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
 extern void ax25_destroy_socket(ax25_cb *);
 extern ax25_cb *ax25_create_cb(void);
 extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);
diff -Nru a/include/net/ipv6.h b/include/net/ipv6.h
--- a/include/net/ipv6.h	Thu Jan  8 23:00:24 2004
+++ b/include/net/ipv6.h	Thu Jan  8 23:00:24 2004
@@ -329,13 +329,6 @@
 					   struct in6_addr *daddr,
 					   int proto, int len);
 
-extern int			ip6_build_xmit(struct sock *sk,
-					       inet_getfrag_t getfrag,
-					       const void *data,
-					       struct flowi *fl,
-					       unsigned length,
-					       struct ipv6_txoptions *opt,
-					       int hlimit, int flags);
 extern int			ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
 
 extern int			ip6_append_data(struct sock *sk,
diff -Nru a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h
--- a/include/net/irda/ircomm_tty.h	Thu Jan  8 23:00:23 2004
+++ b/include/net/irda/ircomm_tty.h	Thu Jan  8 23:00:23 2004
@@ -52,6 +52,11 @@
 /* Same for payload size. See qos.c for the smallest max data size */
 #define IRCOMM_TTY_DATA_UNINITIALISED	(64 - IRCOMM_TTY_HDR_UNINITIALISED)
 
+/* Those are really defined in include/linux/serial.h - Jean II */
+#define ASYNC_B_INITIALIZED	31	/* Serial port was initialized */
+#define ASYNC_B_NORMAL_ACTIVE	29	/* Normal device is active */
+#define ASYNC_B_CLOSING		27	/* Serial port is closing */
+
 /*
  * IrCOMM TTY driver state
  */
@@ -75,7 +80,7 @@
 	LOCAL_FLOW flow;          /* IrTTP flow status */
 
 	int line;
-	__u32 flags;
+	volatile unsigned long flags;
 
 	__u8 dlsap_sel;
 	__u8 slsap_sel;
diff -Nru a/include/net/pkt_cls.h b/include/net/pkt_cls.h
--- a/include/net/pkt_cls.h	Thu Jan  8 23:00:24 2004
+++ b/include/net/pkt_cls.h	Thu Jan  8 23:00:24 2004
@@ -81,7 +81,12 @@
 	return -1;
 }
 
-
+static inline void tcf_destroy(struct tcf_proto *tp)
+{
+	tp->ops->destroy(tp);
+	module_put(tp->ops->owner);
+	kfree(tp);
+}
 
 extern int register_tcf_proto_ops(struct tcf_proto_ops *ops);
 extern int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);
diff -Nru a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
--- a/include/net/sctp/sctp.h	Thu Jan  8 23:00:23 2004
+++ b/include/net/sctp/sctp.h	Thu Jan  8 23:00:23 2004
@@ -90,7 +90,6 @@
 #include <net/snmp.h>
 #include <net/sctp/structs.h>
 #include <net/sctp/constants.h>
-#include <net/sctp/sm.h>
 
 
 /* Set SCTP_DEBUG flag via config if not already set. */
diff -Nru a/include/net/sock.h b/include/net/sock.h
--- a/include/net/sock.h	Thu Jan  8 23:00:24 2004
+++ b/include/net/sock.h	Thu Jan  8 23:00:24 2004
@@ -542,24 +542,9 @@
 extern void __lock_sock(struct sock *sk);
 extern void __release_sock(struct sock *sk);
 #define sock_owned_by_user(sk)	((sk)->sk_lock.owner)
-#define lock_sock(__sk) \
-do {	might_sleep(); \
-	spin_lock_bh(&((__sk)->sk_lock.slock)); \
-	if ((__sk)->sk_lock.owner) \
-		__lock_sock(__sk); \
-	(__sk)->sk_lock.owner = (void *)1; \
-	spin_unlock_bh(&((__sk)->sk_lock.slock)); \
-} while(0)
 
-#define release_sock(__sk) \
-do {	spin_lock_bh(&((__sk)->sk_lock.slock)); \
-	if ((__sk)->sk_backlog.tail) \
-		__release_sock(__sk); \
-	(__sk)->sk_lock.owner = NULL; \
-        if (waitqueue_active(&((__sk)->sk_lock.wq))) \
-		wake_up(&((__sk)->sk_lock.wq)); \
-	spin_unlock_bh(&((__sk)->sk_lock.slock)); \
-} while(0)
+extern void lock_sock(struct sock *sk);
+extern void release_sock(struct sock *sk);
 
 /* BH context may only use the following locking interface. */
 #define bh_lock_sock(__sk)	spin_lock(&((__sk)->sk_lock.slock))
diff -Nru a/include/net/xfrm.h b/include/net/xfrm.h
--- a/include/net/xfrm.h	Thu Jan  8 23:00:24 2004
+++ b/include/net/xfrm.h	Thu Jan  8 23:00:24 2004
@@ -860,7 +860,7 @@
 extern void xfrm_policy_kill(struct xfrm_policy *);
 extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
 extern struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struct flowi *fl);
-extern int xfrm_flush_bundles(struct xfrm_state *x);
+extern int xfrm_flush_bundles(void);
 
 extern wait_queue_head_t km_waitq;
 extern void km_state_expired(struct xfrm_state *x, int hard);
diff -Nru a/include/scsi/scsi.h b/include/scsi/scsi.h
--- a/include/scsi/scsi.h	Thu Jan  8 23:00:24 2004
+++ b/include/scsi/scsi.h	Thu Jan  8 23:00:24 2004
@@ -302,6 +302,7 @@
 #define QUEUED          0x2004
 #define SOFT_ERROR      0x2005
 #define ADD_TO_MLQUEUE  0x2006
+#define TIMEOUT         0x2007
 
 /*
  * Midlevel queue return values.
diff -Nru a/init/Kconfig b/init/Kconfig
--- a/init/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/init/Kconfig	Thu Jan  8 23:00:24 2004
@@ -196,6 +196,19 @@
 
 source "drivers/block/Kconfig.iosched"
 
+config CC_OPTIMIZE_FOR_SIZE
+	bool "Optimize for size" if EMBEDDED
+	default y if ARM || H8300
+	default n
+	help
+	  Enabling this option will pass "-Os" instead of "-O2" to gcc
+	  resulting in a smaller kernel.
+
+	  WARNING: some versions of gcc may generate incorrect code with this
+	  option.  If problems are observed, a gcc upgrade may be needed.
+
+	  If unsure, say N.
+
 endmenu		# General setup
 
 
diff -Nru a/init/do_mounts.c b/init/do_mounts.c
--- a/init/do_mounts.c	Thu Jan  8 23:00:23 2004
+++ b/init/do_mounts.c	Thu Jan  8 23:00:23 2004
@@ -130,11 +130,11 @@
  *	Driverfs is used to check if something is a disk name - it has
  *	all known disks under bus/block/devices.  If the disk name
  *	contains slashes, name of driverfs node has them replaced with
- *	dots.  try_name() does the actual checks, assuming that driverfs
+ *	bangs.  try_name() does the actual checks, assuming that driverfs
  *	is mounted on rootfs /sys.
  */
 
-dev_t name_to_dev_t(char *name)
+dev_t __init name_to_dev_t(char *name)
 {
 	char s[32];
 	char *p;
@@ -169,7 +169,7 @@
 	strcpy(s, name);
 	for (p = s; *p; p++)
 		if (*p == '/')
-			*p = '.';
+			*p = '!';
 	res = try_name(s, 0);
 	if (res)
 		goto done;
diff -Nru a/init/main.c b/init/main.c
--- a/init/main.c	Thu Jan  8 23:00:23 2004
+++ b/init/main.c	Thu Jan  8 23:00:23 2004
@@ -38,6 +38,7 @@
 #include <linux/moduleparam.h>
 #include <linux/writeback.h>
 #include <linux/cpu.h>
+#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -107,9 +108,7 @@
 void (*late_time_init)(void) = NULL;
 extern void softirq_init(void);
 
-int rows, cols;
-
-char *execute_command;
+static char *execute_command;
 
 /* Setup configured maximum number of CPUs to activate */
 static unsigned int max_cpus = NR_CPUS;
@@ -374,7 +373,7 @@
 
 static void rest_init(void)
 {
-	kernel_thread(init, NULL, CLONE_KERNEL);
+	kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
 	unlock_kernel();
  	cpu_idle();
 } 
@@ -395,7 +394,6 @@
 	lock_kernel();
 	printk(linux_banner);
 	setup_arch(&command_line);
-	setup_per_zone_pages_min();
 	setup_per_cpu_areas();
 
 	/*
@@ -443,6 +441,10 @@
 	pidmap_init();
 	pgtable_cache_init();
 	pte_chain_init();
+#ifdef CONFIG_X86
+	if (efi_enabled)
+		efi_enter_virtual_mode();
+#endif
 	fork_init(num_physpages);
 	proc_caches_init();
 	buffer_init();
@@ -470,7 +472,7 @@
 	rest_init();
 }
 
-int __initdata initcall_debug;
+static int __initdata initcall_debug;
 
 static int __init initcall_debug_setup(char *str)
 {
diff -Nru a/ipc/sem.c b/ipc/sem.c
--- a/ipc/sem.c	Thu Jan  8 23:00:23 2004
+++ b/ipc/sem.c	Thu Jan  8 23:00:23 2004
@@ -59,6 +59,8 @@
  * (c) 1999 Manfred Spraul <manfreds@colorfullife.com>
  * Enforced range limit on SEM_UNDO
  * (c) 2001 Red Hat Inc <alan@redhat.com>
+ * Lockless wakeup
+ * (c) 2003 Manfred Spraul <manfred@colorfullife.com>
  */
 
 #include <linux/config.h>
@@ -118,6 +120,40 @@
 #endif
 }
 
+/*
+ * Lockless wakeup algorithm:
+ * Without the check/retry algorithm a lockless wakeup is possible:
+ * - queue.status is initialized to -EINTR before blocking.
+ * - wakeup is performed by
+ *	* unlinking the queue entry from sma->sem_pending
+ *	* setting queue.status to IN_WAKEUP
+ *	  This is the notification for the blocked thread that a
+ *	  result value is imminent.
+ *	* call wake_up_process
+ *	* set queue.status to the final value.
+ * - the previously blocked thread checks queue.status:
+ *   	* if it's IN_WAKEUP, then it must wait until the value changes
+ *   	* if it's not -EINTR, then the operation was completed by
+ *   	  update_queue. semtimedop can return queue.status without
+ *   	  performing any operation on the semaphore array.
+ *   	* otherwise it must acquire the spinlock and check what's up.
+ *
+ * The two-stage algorithm is necessary to protect against the following
+ * races:
+ * - if queue.status is set after wake_up_process, then the woken up idle
+ *   thread could race forward and try (and fail) to acquire sma->lock
+ *   before update_queue had a chance to set queue.status
+ * - if queue.status is written before wake_up_process and if the
+ *   blocked process is woken up by a signal between writing
+ *   queue.status and the wake_up_process, then the woken up
+ *   process could return from semtimedop and die by calling
+ *   sys_exit before wake_up_process is called. Then wake_up_process
+ *   will oops, because the task structure is already invalid.
+ *   (yes, this happened on s390 with sysv msg).
+ *
+ */
+#define IN_WAKEUP	1
+
 static int newary (key_t key, int nsems, int semflg)
 {
 	int id;
@@ -331,16 +367,25 @@
 	int error;
 	struct sem_queue * q;
 
-	for (q = sma->sem_pending; q; q = q->next) {
-			
+	q = sma->sem_pending;
+	while(q) {
 		error = try_atomic_semop(sma, q->sops, q->nsops,
 					 q->undo, q->pid);
 
 		/* Does q->sleeper still need to sleep? */
 		if (error <= 0) {
-			q->status = error;
+			struct sem_queue *n;
 			remove_from_queue(sma,q);
+			n = q->next;
+			q->status = IN_WAKEUP;
 			wake_up_process(q->sleeper);
+			/* hands-off: q will disappear immediately after
+			 * writing q->status.
+			 */
+			q->status = error;
+			q = n;
+		} else {
+			q = q->next;
 		}
 	}
 }
@@ -409,10 +454,16 @@
 		un->semid = -1;
 
 	/* Wake up all pending processes and let them fail with EIDRM. */
-	for (q = sma->sem_pending; q; q = q->next) {
-		q->status = -EIDRM;
+	q = sma->sem_pending;
+	while(q) {
+		struct sem_queue *n;
+		/* lazy remove_from_queue: we are killing the whole queue */
 		q->prev = NULL;
+		n = q->next;
+		q->status = IN_WAKEUP;
 		wake_up_process(q->sleeper); /* doesn't sleep */
+		q->status = -EIDRM;	/* hands-off q */
+		q = n;
 	}
 
 	/* Remove the semaphore set from the ID array*/
@@ -1083,6 +1134,18 @@
 	else
 		schedule();
 
+	error = queue.status;
+	while(unlikely(error == IN_WAKEUP)) {
+		cpu_relax();
+		error = queue.status;
+	}
+
+	if (error != -EINTR) {
+		/* fast path: update_queue already obtained all requested
+		 * resources */
+		goto out_free;
+	}
+
 	sma = sem_lock(semid);
 	if(sma==NULL) {
 		if(queue.prev != NULL)
@@ -1095,7 +1158,7 @@
 	 * If queue.status != -EINTR we are woken up by another process
 	 */
 	error = queue.status;
-	if (queue.status != -EINTR) {
+	if (error != -EINTR) {
 		goto out_unlock_free;
 	}
 
diff -Nru a/kernel/compat.c b/kernel/compat.c
--- a/kernel/compat.c	Thu Jan  8 23:00:24 2004
+++ b/kernel/compat.c	Thu Jan  8 23:00:24 2004
@@ -22,14 +22,14 @@
 
 #include <asm/uaccess.h>
 
-int get_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
+int get_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
 {
 	return (verify_area(VERIFY_READ, cts, sizeof(*cts)) ||
 			__get_user(ts->tv_sec, &cts->tv_sec) ||
 			__get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
 }
 
-int put_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
+int put_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
 {
 	return (verify_area(VERIFY_WRITE, cts, sizeof(*cts)) ||
 			__put_user(ts->tv_sec, &cts->tv_sec) ||
@@ -204,7 +204,8 @@
 	ret = sys_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL);
 	set_fs(old_fs);
 	if (ret == 0)
-		ret = put_user(s, oset);
+		if (oset)
+			ret = put_user(s, oset);
 	return ret;
 }
 
diff -Nru a/kernel/exit.c b/kernel/exit.c
--- a/kernel/exit.c	Thu Jan  8 23:00:24 2004
+++ b/kernel/exit.c	Thu Jan  8 23:00:24 2004
@@ -472,21 +472,29 @@
 	if (!mm)
 		return;
 	/*
-	 * Serialize with any possible pending coredump:
+	 * Serialize with any possible pending coredump.
+	 * We must hold mmap_sem around checking core_waiters
+	 * and clearing tsk->mm.  The core-inducing thread
+	 * will increment core_waiters for each thread in the
+	 * group with ->mm != NULL.
 	 */
+	down_read(&mm->mmap_sem);
 	if (mm->core_waiters) {
+		up_read(&mm->mmap_sem);
 		down_write(&mm->mmap_sem);
 		if (!--mm->core_waiters)
 			complete(mm->core_startup_done);
 		up_write(&mm->mmap_sem);
 
 		wait_for_completion(&mm->core_done);
+		down_read(&mm->mmap_sem);
 	}
 	atomic_inc(&mm->mm_count);
 	if (mm != tsk->active_mm) BUG();
 	/* more a memory barrier than a real lock */
 	task_lock(tsk);
 	tsk->mm = NULL;
+	up_read(&mm->mmap_sem);
 	enter_lazy_tlb(mm, current);
 	task_unlock(tsk);
 	mmput(mm);
diff -Nru a/kernel/fork.c b/kernel/fork.c
--- a/kernel/fork.c	Thu Jan  8 23:00:23 2004
+++ b/kernel/fork.c	Thu Jan  8 23:00:23 2004
@@ -642,6 +642,11 @@
 		goto out;
 	}
 
+	/*
+	 * Note: we may be using current for both targets (See exec.c)
+	 * This works because we cache current->files (old) as oldf. Don't
+	 * break this.
+	 */
 	tsk->files = NULL;
 	error = -ENOMEM;
 	newf = kmem_cache_alloc(files_cachep, SLAB_KERNEL);
@@ -731,6 +736,35 @@
 	goto out;
 }
 
+/*
+ *	Helper to unshare the files of the current task.
+ *	We don't want to expose copy_files internals to
+ *	the exec layer of the kernel.
+ */
+
+int unshare_files(void)
+{
+	struct files_struct *files  = current->files;
+	int rc;
+
+	if(!files)
+		BUG();
+
+	/* This can race but the race causes us to copy when we don't
+	   need to and drop the copy */
+	if(atomic_read(&files->count) == 1)
+	{
+		atomic_inc(&files->count);
+		return 0;
+	}
+	rc = copy_files(0, current);
+	if(rc)
+		current->files = files;
+	return rc;
+}
+
+EXPORT_SYMBOL(unshare_files);
+
 static inline int copy_sighand(unsigned long clone_flags, struct task_struct * tsk)
 {
 	struct sighand_struct *sig;
@@ -884,7 +918,14 @@
 	p->thread_info->preempt_count = 1;
 #endif
 	p->did_exec = 0;
-	p->state = TASK_UNINTERRUPTIBLE;
+
+	/*
+	 * We mark the process as running here, but have not actually
+	 * inserted it onto the runqueue yet. This guarantees that
+	 * nobody will actually run it, and a signal or other external
+	 * event cannot wake it up and insert it on the runqueue either.
+	 */
+	p->state = TASK_RUNNING;
 
 	copy_flags(clone_flags, p);
 	if (clone_flags & CLONE_IDLETASK)
@@ -1175,9 +1216,10 @@
 			set_tsk_thread_flag(p, TIF_SIGPENDING);
 		}
 
-		p->state = TASK_STOPPED;
 		if (!(clone_flags & CLONE_STOPPED))
 			wake_up_forked_process(p);	/* do this last */
+		else
+			p->state = TASK_STOPPED;
 		++total_forks;
 
 		if (unlikely (trace)) {
diff -Nru a/kernel/futex.c b/kernel/futex.c
--- a/kernel/futex.c	Thu Jan  8 23:00:23 2004
+++ b/kernel/futex.c	Thu Jan  8 23:00:23 2004
@@ -246,7 +246,7 @@
  * Drop a reference to the resource addressed by a key.
  * The hash bucket spinlock must not be held.
  */
-static inline void drop_key_refs(union futex_key *key)
+static void drop_key_refs(union futex_key *key)
 {
 	if (key->both.ptr != 0) {
 		if (key->both.offset & 1)
@@ -260,7 +260,7 @@
  * The hash bucket lock must be held when this is called.
  * Afterwards, the futex_q must not be accessed.
  */
-static inline void wake_futex(struct futex_q *q)
+static void wake_futex(struct futex_q *q)
 {
 	list_del_init(&q->list);
 	if (q->filp)
@@ -384,7 +384,7 @@
  */
 
 /* The key must be already stored in q->key. */
-static inline void queue_me(struct futex_q *q, int fd, struct file *filp)
+static void queue_me(struct futex_q *q, int fd, struct file *filp)
 {
 	struct futex_hash_bucket *bh;
 
diff -Nru a/kernel/kmod.c b/kernel/kmod.c
--- a/kernel/kmod.c	Thu Jan  8 23:00:23 2004
+++ b/kernel/kmod.c	Thu Jan  8 23:00:23 2004
@@ -182,16 +182,21 @@
 {
 	struct subprocess_info *sub_info = data;
 	pid_t pid;
+	struct k_sigaction sa;
+
+	/* Install a handler: if SIGCLD isn't handled sys_wait4 won't
+	 * populate the status, but will return -ECHILD. */
+	sa.sa.sa_handler = SIG_IGN;
+	sa.sa.sa_flags = 0;
+	siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));
+	do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0);
+	allow_signal(SIGCHLD);
 
-	sub_info->retval = 0;
 	pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
 	if (pid < 0)
 		sub_info->retval = pid;
 	else
-		/* We don't have a SIGCHLD signal handler, so this
-		 * always returns -ECHILD, but the important thing is
-		 * that it blocks. */
-		sys_wait4(pid, NULL, 0, NULL);
+		sys_wait4(pid, &sub_info->retval, 0, NULL);
 
 	complete(sub_info->complete);
 	return 0;
@@ -210,7 +215,7 @@
 	 * until that is done.  */
 	if (sub_info->wait)
 		pid = kernel_thread(wait_for_helper, sub_info,
-				    CLONE_KERNEL | SIGCHLD);
+				    CLONE_FS | CLONE_FILES | SIGCHLD);
 	else
 		pid = kernel_thread(____call_usermodehelper, sub_info,
 				    CLONE_VFORK | SIGCHLD);
diff -Nru a/kernel/module.c b/kernel/module.c
--- a/kernel/module.c	Thu Jan  8 23:00:24 2004
+++ b/kernel/module.c	Thu Jan  8 23:00:24 2004
@@ -1618,6 +1618,16 @@
 	/* Now do relocations. */
 	for (i = 1; i < hdr->e_shnum; i++) {
 		const char *strtab = (char *)sechdrs[strindex].sh_addr;
+		unsigned int info = sechdrs[i].sh_info;
+
+		/* Not a valid relocation section? */
+		if (info >= hdr->e_shnum)
+			continue;
+
+		/* Don't bother with non-allocated sections */
+		if (!(sechdrs[info].sh_flags & SHF_ALLOC))
+			continue;
+
 		if (sechdrs[i].sh_type == SHT_REL)
 			err = apply_relocate(sechdrs, strtab, symindex, i,mod);
 		else if (sechdrs[i].sh_type == SHT_RELA)
diff -Nru a/kernel/power/Kconfig b/kernel/power/Kconfig
--- a/kernel/power/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/kernel/power/Kconfig	Thu Jan  8 23:00:24 2004
@@ -40,7 +40,7 @@
 	  involved in suspending. Also in this case there is a risk that buffers
 	  on disk won't match with saved ones.
 
-	  For more information take a look at Documentation/swsusp.txt.
+	  For more information take a look at Documentation/power/swsusp.txt.
 
 config PM_DISK
 	bool "Suspend-to-Disk Support"
diff -Nru a/kernel/power/swsusp.c b/kernel/power/swsusp.c
--- a/kernel/power/swsusp.c	Thu Jan  8 23:00:23 2004
+++ b/kernel/power/swsusp.c	Thu Jan  8 23:00:23 2004
@@ -33,7 +33,7 @@
  *
  * More state savers are welcome. Especially for the scsi layer...
  *
- * For TODOs,FIXMEs also look in Documentation/swsusp.txt
+ * For TODOs,FIXMEs also look in Documentation/power/swsusp.txt
  */
 
 #include <linux/module.h>
diff -Nru a/kernel/printk.c b/kernel/printk.c
--- a/kernel/printk.c	Thu Jan  8 23:00:24 2004
+++ b/kernel/printk.c	Thu Jan  8 23:00:24 2004
@@ -86,7 +86,19 @@
 static unsigned long log_end;	/* Index into log_buf: most-recently-written-char + 1 */
 static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
 
-struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
+/*
+ *	Array of consoles built from command line options (console=)
+ */
+struct console_cmdline
+{
+	char	name[8];			/* Name of the driver	    */
+	int	index;				/* Minor dev. to use	    */
+	char	*options;			/* Options for the driver   */
+};
+
+#define MAX_CMDLINECONSOLES 8
+
+static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
 static int preferred_console = -1;
 
 /* Flag: console code may call schedule() */
@@ -97,10 +109,9 @@
  */
 static int __init console_setup(char *str)
 {
-	struct console_cmdline *c;
-	char name[sizeof(c->name)];
+	char name[sizeof(console_cmdline[0].name)];
 	char *s, *options;
-	int i, idx;
+	int idx;
 
 	/*
 	 *	Decode str into name, index, options.
@@ -125,6 +136,27 @@
 	idx = simple_strtoul(s, NULL, 10);
 	*s = 0;
 
+	add_preferred_console(name, idx, options);
+	return 1;
+}
+
+__setup("console=", console_setup);
+
+/**
+ * add_preferred_console - add a device to the list of preferred consoles.
+ *
+ * The last preferred console added will be used for kernel messages
+ * and stdin/out/err for init.  Normally this is used by console_setup
+ * above to handle user-supplied console arguments; however it can also
+ * be used by arch-specific code either to override the user or more
+ * commonly to provide a default console (ie from PROM variables) when
+ * the user has not supplied one.
+ */
+int __init add_preferred_console(char *name, int idx, char *options)
+{
+	struct console_cmdline *c;
+	int i;
+
 	/*
 	 *	See if this tty is not yet registered, and
 	 *	if we have a slot free.
@@ -133,23 +165,23 @@
 		if (strcmp(console_cmdline[i].name, name) == 0 &&
 			  console_cmdline[i].index == idx) {
 				preferred_console = i;
-				return 1;
+				return 0;
 		}
 	if (i == MAX_CMDLINECONSOLES)
-		return 1;
+		return -E2BIG;
 	preferred_console = i;
 	c = &console_cmdline[i];
 	memcpy(c->name, name, sizeof(c->name));
+	c->name[sizeof(c->name) - 1] = 0;
 	c->options = options;
 	c->index = idx;
-	return 1;
+	return 0;
 }
 
-__setup("console=", console_setup);
-
 static int __init log_buf_len_setup(char *str)
 {
 	unsigned long size = memparse(str, &str);
+	unsigned long flags;
 
 	if (size > log_buf_len) {
 		unsigned long start, dest_idx, offset;
@@ -161,7 +193,7 @@
 			goto out;
 		}
 
-		spin_lock_irq(&logbuf_lock);
+		spin_lock_irqsave(&logbuf_lock, flags);
 		log_buf_len = size;
 		log_buf = new_log_buf;
 
@@ -175,7 +207,7 @@
 		log_start -= offset;
 		con_start -= offset;
 		log_end -= offset;
-		spin_unlock_irq(&logbuf_lock);
+		spin_unlock_irqrestore(&logbuf_lock, flags);
 
 		printk("log_buf_len: %d\n", log_buf_len);
 	}
diff -Nru a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c	Thu Jan  8 23:00:24 2004
+++ b/kernel/sched.c	Thu Jan  8 23:00:24 2004
@@ -684,7 +684,8 @@
 	unsigned long flags;
 	runqueue_t *rq = task_rq_lock(current, &flags);
 
-	p->state = TASK_RUNNING;
+	BUG_ON(p->state != TASK_RUNNING);
+
 	/*
 	 * We decrease the sleep average of forking parents
 	 * and children as well, to keep max-interactive tasks
@@ -1061,10 +1062,11 @@
 	 * the lock held.
 	 *
 	 * We fend off statistical fluctuations in runqueue lengths by
-	 * saving the runqueue length during the previous load-balancing
-	 * operation and using the smaller one the current and saved lengths.
-	 * If a runqueue is long enough for a longer amount of time then
-	 * we recognize it and pull tasks from it.
+	 * saving the runqueue length (as seen by the balancing CPU) during
+	 * the previous load-balancing operation and using the smaller one
+	 * of the current and saved lengths. If a runqueue is long enough
+	 * for a longer amount of time then we recognize it and pull tasks
+	 * from it.
 	 *
 	 * The 'current runqueue length' is a statistical maximum variable,
 	 * for that one we take the longer one - to avoid fluctuations in
@@ -1470,6 +1472,7 @@
  */
 asmlinkage void schedule(void)
 {
+	long *switch_count;
 	task_t *prev, *next;
 	runqueue_t *rq;
 	prio_array_t *array;
@@ -1516,32 +1519,25 @@
 	 * if entering off of a kernel preemption go straight
 	 * to picking the next task.
 	 */
-	if (unlikely(preempt_count() & PREEMPT_ACTIVE))
-		goto pick_next_task;
-
-	switch (prev->state) {
-	case TASK_INTERRUPTIBLE:
-		if (unlikely(signal_pending(prev))) {
+	switch_count = &prev->nivcsw;
+	if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
+		switch_count = &prev->nvcsw;
+		if (unlikely((prev->state & TASK_INTERRUPTIBLE) &&
+				unlikely(signal_pending(prev))))
 			prev->state = TASK_RUNNING;
-			break;
-		}
-	default:
-		deactivate_task(prev, rq);
-		prev->nvcsw++;
-		break;
-	case TASK_RUNNING:
-		prev->nivcsw++;
+		else
+			deactivate_task(prev, rq);
 	}
-pick_next_task:
+
 	if (unlikely(!rq->nr_running)) {
 #ifdef CONFIG_SMP
 		load_balance(rq, 1, cpu_to_node_mask(smp_processor_id()));
-		if (rq->nr_running)
-			goto pick_next_task;
 #endif
-		next = rq->idle;
-		rq->expired_timestamp = 0;
-		goto switch_tasks;
+		if (!rq->nr_running) {
+			next = rq->idle;
+			rq->expired_timestamp = 0;
+			goto switch_tasks;
+		}
 	}
 
 	array = rq->active;
@@ -1588,6 +1584,7 @@
 		next->timestamp = now;
 		rq->nr_switches++;
 		rq->curr = next;
+		++*switch_count;
 
 		prepare_arch_switch(rq, next);
 		prev = context_switch(rq, prev, next);
diff -Nru a/kernel/sys.c b/kernel/sys.c
--- a/kernel/sys.c	Thu Jan  8 23:00:23 2004
+++ b/kernel/sys.c	Thu Jan  8 23:00:23 2004
@@ -1323,8 +1323,6 @@
  * either stopped or zombied.  In the zombied case the task won't get
  * reaped till shortly after the call to getrusage(), in both cases the
  * task being examined is in a frozen state so the counters won't change.
- *
- * FIXME! Get the fault counts properly!
  */
 int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
 {
diff -Nru a/lib/Makefile b/lib/Makefile
--- a/lib/Makefile	Thu Jan  8 23:00:23 2004
+++ b/lib/Makefile	Thu Jan  8 23:00:23 2004
@@ -5,7 +5,7 @@
 
 lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
 	 bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-	 kobject.o idr.o div64.o parser.o
+	 kobject.o idr.o div64.o parser.o int_sqrt.o mask.o
 
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
diff -Nru a/lib/inflate.c b/lib/inflate.c
--- a/lib/inflate.c	Thu Jan  8 23:00:24 2004
+++ b/lib/inflate.c	Thu Jan  8 23:00:24 2004
@@ -221,7 +221,7 @@
     0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
 };
 
-#define NEXTBYTE()  (uch)get_byte()
+#define NEXTBYTE()  ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
 #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
 #define DUMPBITS(n) {b>>=(n);k-=(n);}
 
@@ -620,6 +620,9 @@
 
   /* done */
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -676,6 +679,9 @@
 
   DEBG(">");
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -908,6 +914,9 @@
 
   DEBG(">");
   return 0;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -956,6 +965,9 @@
 
   /* bad block type */
   return 2;
+
+ underrun:
+  return 4;			/* Input underrun */
 }
 
 
@@ -1079,9 +1091,9 @@
     ulg orig_len = 0;       /* original uncompressed length */
     int res;
 
-    magic[0] = (unsigned char)get_byte();
-    magic[1] = (unsigned char)get_byte();
-    method = (unsigned char)get_byte();
+    magic[0] = NEXTBYTE();
+    magic[1] = NEXTBYTE();
+    method   = NEXTBYTE();
 
     if (magic[0] != 037 ||
 	((magic[1] != 0213) && (magic[1] != 0236))) {
@@ -1108,29 +1120,29 @@
 	    error("Input has invalid flags");
 	    return -1;
     }
-    (ulg)get_byte();	/* Get timestamp */
-    ((ulg)get_byte()) << 8;
-    ((ulg)get_byte()) << 16;
-    ((ulg)get_byte()) << 24;
+    NEXTBYTE();	/* Get timestamp */
+    NEXTBYTE();
+    NEXTBYTE();
+    NEXTBYTE();
 
-    (void)get_byte();  /* Ignore extra flags for the moment */
-    (void)get_byte();  /* Ignore OS type for the moment */
+    (void)NEXTBYTE();  /* Ignore extra flags for the moment */
+    (void)NEXTBYTE();  /* Ignore OS type for the moment */
 
     if ((flags & EXTRA_FIELD) != 0) {
-	    unsigned len = (unsigned)get_byte();
-	    len |= ((unsigned)get_byte())<<8;
-	    while (len--) (void)get_byte();
+	    unsigned len = (unsigned)NEXTBYTE();
+	    len |= ((unsigned)NEXTBYTE())<<8;
+	    while (len--) (void)NEXTBYTE();
     }
 
     /* Get original file name if it was truncated */
     if ((flags & ORIG_NAME) != 0) {
 	    /* Discard the old name */
-	    while (get_byte() != 0) /* null */ ;
+	    while (NEXTBYTE() != 0) /* null */ ;
     } 
 
     /* Discard file comment if any */
     if ((flags & COMMENT) != 0) {
-	    while (get_byte() != 0) /* null */ ;
+	    while (NEXTBYTE() != 0) /* null */ ;
     }
 
     /* Decompress */
@@ -1147,6 +1159,9 @@
 	    case 3:
 		    error("out of memory");
 		    break;
+	    case 4:
+		    error("out of input data");
+		    break;
 	    default:
 		    error("invalid compressed format (other)");
 	    }
@@ -1157,15 +1172,15 @@
     /* crc32  (see algorithm.doc)
      * uncompressed input size modulo 2^32
      */
-    orig_crc = (ulg) get_byte();
-    orig_crc |= (ulg) get_byte() << 8;
-    orig_crc |= (ulg) get_byte() << 16;
-    orig_crc |= (ulg) get_byte() << 24;
+    orig_crc = (ulg) NEXTBYTE();
+    orig_crc |= (ulg) NEXTBYTE() << 8;
+    orig_crc |= (ulg) NEXTBYTE() << 16;
+    orig_crc |= (ulg) NEXTBYTE() << 24;
     
-    orig_len = (ulg) get_byte();
-    orig_len |= (ulg) get_byte() << 8;
-    orig_len |= (ulg) get_byte() << 16;
-    orig_len |= (ulg) get_byte() << 24;
+    orig_len = (ulg) NEXTBYTE();
+    orig_len |= (ulg) NEXTBYTE() << 8;
+    orig_len |= (ulg) NEXTBYTE() << 16;
+    orig_len |= (ulg) NEXTBYTE() << 24;
     
     /* Validate decompression */
     if (orig_crc != CRC_VALUE) {
@@ -1177,6 +1192,10 @@
 	    return -1;
     }
     return 0;
+
+ underrun:			/* NEXTBYTE() goto's here if needed */
+    error("out of input data");
+    return -1;
 }
 
 
diff -Nru a/lib/int_sqrt.c b/lib/int_sqrt.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/lib/int_sqrt.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,32 @@
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+/**
+ * int_sqrt - rough approximation to sqrt
+ * @x: integer of which to calculate the sqrt
+ *
+ * A very rough approximation to the sqrt() function.
+ */
+unsigned long int_sqrt(unsigned long x)
+{
+	unsigned long op, res, one;
+
+	op = x;
+	res = 0;
+
+	one = 1 << 30;
+	while (one > op)
+		one >>= 2;
+
+	while (one != 0) {
+		if (op >= res + one) {
+			op = op - (res + one);
+			res = res +  2 * one;
+		}
+		res /= 2;
+		one /= 4;
+	}
+	return res;
+}
+EXPORT_SYMBOL(int_sqrt);
diff -Nru a/lib/mask.c b/lib/mask.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/lib/mask.c	Thu Jan  8 23:00:24 2004
@@ -0,0 +1,178 @@
+/*
+ * lib/mask.c
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003 Silicon Graphics, Inc.  All Rights Reserved.
+ */
+
+/*
+ * Routines to manipulate multi-word bit masks, such as cpumasks.
+ *
+ * The ascii representation of multi-word bit masks displays each
+ * 32bit word in hex (not zero filled), and for masks longer than
+ * one word, uses a comma separator between words.  Words are
+ * displayed in big-endian order most significant first.  And hex
+ * digits within a word are also in big-endian order, of course.
+ *
+ * Examples:
+ *   A mask with just bit 0 set displays as "1".
+ *   A mask with just bit 127 set displays as "80000000,0,0,0".
+ *   A mask with just bit 64 set displays as "1,0,0".
+ *   A mask with bits 0, 1, 2, 4, 8, 16, 32 and 64 set displays
+ *     as "1,1,10117".  The first "1" is for bit 64, the second
+ *     for bit 32, the third for bit 16, and so forth, to the
+ *     "7", which is for bits 2, 1 and 0.
+ *   A mask with bits 32 through 39 set displays as "ff,0".
+ *
+ * The internal binary representation of masks is as one or
+ * an array of unsigned longs, perhaps wrapped in a struct for
+ * convenient use as an lvalue.  The following code doesn't know
+ * about any such struct details, relying on inline macros in
+ * files such as cpumask.h to pass in an unsigned long pointer
+ * and a length (in bytes), describing the mask contents.
+ * The 32bit words in the array are in little-endian order,
+ * low order word first.  Beware that this is the reverse order
+ * of the ascii representation.
+ *
+ * Even though the size of the input mask is provided in bytes,
+ * the following code may assume that the mask is a multiple of
+ * 32 or 64 bit words long, and ignore any fractional portion
+ * of a word at the end.  The main reason the size is passed in
+ * bytes is because it is so easy to write 'sizeof(somemask_t)'
+ * in the macros.
+ *
+ * Masks are not a single,simple type, like classic 'C'
+ * nul-term strings.  Rather they are a family of types, one
+ * for each different length.  Inline macros are used to pick
+ * up the actual length, where it is known to the compiler, and
+ * pass it down to these routines, which work on any specified
+ * length array of unsigned longs.  Poor man's templates.
+ *
+ * Many of the inline macros don't call into the following
+ * routines.  Some of them call into other kernel routines,
+ * such as memset(), set_bit() or ffs().  Some of them can
+ * accomplish their task right inline, such as returning the
+ * size or address of the unsigned long array, or optimized
+ * versions of the macros for the most common case of an array
+ * of a single unsigned long.
+ */
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
+#include <linux/gfp.h>
+#include <asm/uaccess.h>
+
+#define MAX_HEX_PER_BYTE 4	/* dont need > 4 hex chars to encode byte */
+#define BASE 16			/* masks are input in hex (base 16) */
+#define NUL ((char)'\0')	/* nul-terminator */
+
+/**
+ * __mask_snprintf_len - represent multi-word bit mask as string.
+ * @buf: The buffer to place the result into
+ * @buflen: The size of the buffer, including the trailing null space
+ * @maskp: Points to beginning of multi-word bit mask.
+ * @maskbytes: Number of bytes in bit mask at maskp.
+ *
+ * This routine is expected to be called from a macro such as:
+ *
+ * #define cpumask_snprintf(buf, buflen, mask) \
+ *   __mask_snprintf_len(buf, buflen, cpus_addr(mask), sizeof(mask))
+ */
+
+int __mask_snprintf_len(char *buf, unsigned int buflen,
+	const unsigned long *maskp, unsigned int maskbytes)
+{
+	u32 *wordp = (u32 *)maskp;
+	int i = maskbytes/sizeof(u32) - 1;
+	int len = 0;
+	char *sep = "";
+
+	while (i >= 1 && wordp[i] == 0)
+		i--;
+	while (i >= 0) {
+		len += snprintf(buf+len, buflen-len, "%s%x", sep, wordp[i]);
+		sep = ",";
+		i--;
+	}
+	return len;
+}
+
+/**
+ * __mask_parse_len - parse user string into maskbytes mask at maskp
+ * @ubuf: The user buffer from which to take the string
+ * @ubuflen: The size of this buffer, including the terminating char
+ * @maskp: Place resulting mask (array of unsigned longs) here
+ * @masklen: Construct mask at @maskp to have exactly @masklen bytes
+ *
+ * @masklen is a multiple of sizeof(unsigned long).  A mask of
+ * @masklen bytes is constructed starting at location @maskp.
+ * The value of this mask is specified by the user provided
+ * string starting at address @ubuf.  Only bytes in the range
+ * [@ubuf, @ubuf+@ubuflen) can be read from user space, and
+ * reading will stop after the first byte that is not a comma
+ * or valid hex digit in the characters [,0-9a-fA-F], or at
+ * the point @ubuf+@ubuflen, whichever comes first.
+ *
+ * Since the user only needs about 2.25 chars per byte to encode
+ * a mask (one char per nibble plus one comma separator or nul
+ * terminator per byte), we blow them off with -EINVAL if they
+ * claim a @ubuflen more than 4 (MAX_HEX_PER_BYTE) times maskbytes.
+ * An empty word (delimited by two consecutive commas, for example)
+ * is taken as zero.  If @buflen is zero, the entire @maskp is set
+ * to zero.
+ *
+ * If the user provides fewer comma-separated ascii words
+ * than there are 32 bit words in maskbytes, we zero fill the
+ * remaining high order words.  If they provide more, they fail
+ * with -EINVAL.  Each comma-separate ascii word is taken as
+ * a hex representation; leading zeros are ignored, and do not
+ * imply octal.  '00e1', 'e1', '00E1', 'E1' are all the same.
+ * If user passes a word that is larger than fits in a u32,
+ * they fail with -EOVERFLOW.
+ */
+
+int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
+	unsigned long *maskp, unsigned int maskbytes)
+{
+	char buf[maskbytes * MAX_HEX_PER_BYTE + sizeof(NUL)];
+	char *bp = buf;
+	u32 *wordp = (u32 *)maskp;
+	char *p;
+	int i, j;
+
+	if (ubuflen > maskbytes * MAX_HEX_PER_BYTE)
+		return -EINVAL;
+	if (copy_from_user(buf, ubuf, ubuflen))
+		return -EFAULT;
+	buf[ubuflen] = NUL;
+
+	/*
+	 * Put the words into wordp[] in big-endian order,
+	 * then go back and reverse them.
+	 */
+	memset(wordp, 0, maskbytes);
+	i = j = 0;
+	while ((p = strsep(&bp, ",")) != NULL) {
+		unsigned long long t;
+		if (j == maskbytes/sizeof(u32))
+			return -EINVAL;
+		t = simple_strtoull(p, 0, BASE);
+		if (t != (u32)t)
+			return -EOVERFLOW;
+		wordp[j++] = t;
+	}
+	--j;
+	while (i < j) {
+		u32 t = wordp[i];
+		wordp[i] = wordp[j];
+		wordp[j] = t;
+		i++, --j;
+	}
+	return 0;
+}
diff -Nru a/lib/parser.c b/lib/parser.c
--- a/lib/parser.c	Thu Jan  8 23:00:24 2004
+++ b/lib/parser.c	Thu Jan  8 23:00:24 2004
@@ -11,6 +11,17 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 
+/**
+ * match_one: - Determines if a string matches a simple pattern
+ * @s: the string to examine for presense of the pattern
+ * @p: the string containing the pattern
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Determines if the pattern @p is present in string @s. Can only
+ * match extremely simple token=arg style patterns. If the pattern is found,
+ * the location(s) of the arguments will be returned in the @args array.
+ */
 static int match_one(char *s, char *p, substring_t args[])
 {
 	char *meta;
@@ -74,6 +85,20 @@
 	}
 }
 
+/**
+ * match_token: - Find a token (and optional args) in a string
+ * @s: the string to examine for token/argument pairs
+ * @table: match_table_t describing the set of allowed option tokens and the
+ * arguments that may be associated with them. Must be terminated with a
+ * &struct match_token whose pattern is set to the NULL pointer.
+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
+ * locations.
+ *
+ * Description: Detects which if any of a set of token strings has been passed
+ * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
+ * format identifiers which will be taken into account when matching the
+ * tokens, and whose locations will be returned in the @args array.
+ */
 int match_token(char *s, match_table_t table, substring_t args[])
 {
 	struct match_token *p;
@@ -84,6 +109,16 @@
 	return p->token;
 }
 
+/**
+ * match_number: scan a number in the given base from a substring_t
+ * @s: substring to be scanned
+ * @result: resulting integer on success
+ * @base: base to use when converting string
+ *
+ * Description: Given a &substring_t and a base, attempts to parse the substring
+ * as a number in that base. On success, sets @result to the integer represented
+ * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 static int match_number(substring_t *s, int *result, int base)
 {
 	char *endp;
@@ -103,27 +138,71 @@
 	return ret;
 }
 
+/**
+ * match_int: - scan a decimal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a decimal integer. On
+ * success, sets @result to the integer represented by the string and returns 0.
+ * Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_int(substring_t *s, int *result)
 {
 	return match_number(s, result, 0);
 }
 
+/**
+ * match_octal: - scan an octal representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as an octal integer. On
+ * success, sets @result to the integer represented by the string and returns
+ * 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_octal(substring_t *s, int *result)
 {
 	return match_number(s, result, 8);
 }
 
+/**
+ * match_hex: - scan a hex representation of an integer from a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting integer on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
+ * On success, sets @result to the integer represented by the string and
+ * returns 0. Returns either -ENOMEM or -EINVAL on failure.
+ */
 int match_hex(substring_t *s, int *result)
 {
 	return match_number(s, result, 16);
 }
 
+/**
+ * match_strcpy: - copies the characters from a substring_t to a string
+ * @to: string to copy characters to.
+ * @s: &substring_t to copy
+ *
+ * Description: Copies the set of characters represented by the given
+ * &substring_t @s to the c-style string @to. Caller guarantees that @to is
+ * large enough to hold the characters of @s.
+ */
 void match_strcpy(char *to, substring_t *s)
 {
 	memcpy(to, s->from, s->to - s->from);
 	to[s->to - s->from] = '\0';
 }
 
+/**
+ * match_strdup: - allocate a new string with the contents of a substring_t
+ * @s: &substring_t to copy
+ *
+ * Description: Allocates and returns a string filled with the contents of
+ * the &substring_t @s. The caller is responsible for freeing the returned
+ * string with kfree().
+ */
 char *match_strdup(substring_t *s)
 {
 	char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
diff -Nru a/mm/filemap.c b/mm/filemap.c
--- a/mm/filemap.c	Thu Jan  8 23:00:23 2004
+++ b/mm/filemap.c	Thu Jan  8 23:00:23 2004
@@ -587,13 +587,22 @@
 			     read_actor_t actor)
 {
 	struct inode *inode = mapping->host;
-	unsigned long index, offset;
+	unsigned long index, offset, last;
 	struct page *cached_page;
 	int error;
 
 	cached_page = NULL;
 	index = *ppos >> PAGE_CACHE_SHIFT;
 	offset = *ppos & ~PAGE_CACHE_MASK;
+	last = (*ppos + desc->count) >> PAGE_CACHE_SHIFT;
+
+	/*
+	 * Let the readahead logic know upfront about all
+	 * the pages we'll need to satisfy this request
+	 */
+	for (; index < last; index++)
+		page_cache_readahead(mapping, ra, filp, index);
+	index = *ppos >> PAGE_CACHE_SHIFT;
 
 	for (;;) {
 		struct page *page;
@@ -612,7 +621,6 @@
 		}
 
 		cond_resched();
-		page_cache_readahead(mapping, ra, filp, index);
 
 		nr = nr - offset;
 find_page:
@@ -990,7 +998,7 @@
  * it in the page cache, and handles the special cases reasonably without
  * having a lot of duplicated code.
  */
-struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int unused)
+struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int *type)
 {
 	int error;
 	struct file *file = area->vm_file;
@@ -999,7 +1007,7 @@
 	struct inode *inode = mapping->host;
 	struct page *page;
 	unsigned long size, pgoff, endoff;
-	int did_readaround = 0;
+	int did_readaround = 0, majmin = VM_FAULT_MINOR;
 
 	pgoff = ((address - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
 	endoff = ((area->vm_end - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
@@ -1048,6 +1056,14 @@
 		if (ra->mmap_miss > ra->mmap_hit + MMAP_LOTSAMISS)
 			goto no_cached_page;
 
+		/*
+		 * To keep the pgmajfault counter straight, we need to
+		 * check did_readaround, as this is an inner loop.
+		 */
+		if (!did_readaround) {
+			majmin = VM_FAULT_MAJOR;
+			inc_page_state(pgmajfault);
+		}
 		did_readaround = 1;
 		do_page_cache_readahead(mapping, file,
 				pgoff & ~(MMAP_READAROUND-1), MMAP_READAROUND);
@@ -1069,6 +1085,8 @@
 	 * Found the page and have a reference on it.
 	 */
 	mark_page_accessed(page);
+	if (type)
+		*type = majmin;
 	return page;
 
 outside_data_content:
@@ -1104,7 +1122,10 @@
 	return NULL;
 
 page_not_uptodate:
-	inc_page_state(pgmajfault);
+	if (!did_readaround) {
+		majmin = VM_FAULT_MAJOR;
+		inc_page_state(pgmajfault);
+	}
 	lock_page(page);
 
 	/* Did it get unhashed while we waited for it? */
diff -Nru a/mm/highmem.c b/mm/highmem.c
--- a/mm/highmem.c	Thu Jan  8 23:00:24 2004
+++ b/mm/highmem.c	Thu Jan  8 23:00:24 2004
@@ -285,7 +285,7 @@
 	struct bio_vec *tovec, *fromvec;
 	int i;
 
-	__bio_for_each_segment(tovec, to, i, 0) {
+	bio_for_each_segment(tovec, to, i) {
 		fromvec = from->bi_io_vec + i;
 
 		/*
@@ -314,7 +314,7 @@
 	/*
 	 * free up bounce indirect pages used
 	 */
-	__bio_for_each_segment(bvec, bio, i, 0) {
+	bio_for_each_segment(bvec, bio, i) {
 		org_vec = bio_orig->bi_io_vec + i;
 		if (bvec->bv_page == org_vec->bv_page)
 			continue;
@@ -437,7 +437,7 @@
 	bio->bi_rw = (*bio_orig)->bi_rw;
 
 	bio->bi_vcnt = (*bio_orig)->bi_vcnt;
-	bio->bi_idx = 0;
+	bio->bi_idx = (*bio_orig)->bi_idx;
 	bio->bi_size = (*bio_orig)->bi_size;
 
 	if (pool == page_pool) {
diff -Nru a/mm/memory.c b/mm/memory.c
--- a/mm/memory.c	Thu Jan  8 23:00:24 2004
+++ b/mm/memory.c	Thu Jan  8 23:00:24 2004
@@ -1400,7 +1400,7 @@
 	pte_t entry;
 	struct pte_chain *pte_chain;
 	int sequence = 0;
-	int ret;
+	int ret = VM_FAULT_MINOR;
 
 	if (!vma->vm_ops || !vma->vm_ops->nopage)
 		return do_anonymous_page(mm, vma, page_table,
@@ -1414,7 +1414,7 @@
 	}
 	smp_rmb();  /* Prevent CPU from reordering lock-free ->nopage() */
 retry:
-	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
+	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, &ret);
 
 	/* no page was available -- either SIGBUS or OOM */
 	if (new_page == NOPAGE_SIGBUS)
@@ -1483,14 +1483,12 @@
 		pte_unmap(page_table);
 		page_cache_release(new_page);
 		spin_unlock(&mm->page_table_lock);
-		ret = VM_FAULT_MINOR;
 		goto out;
 	}
 
 	/* no need to invalidate: a not-present page shouldn't be cached */
 	update_mmu_cache(vma, address, entry);
 	spin_unlock(&mm->page_table_lock);
-	ret = VM_FAULT_MAJOR;
 	goto out;
 oom:
 	ret = VM_FAULT_OOM;
diff -Nru a/mm/mmap.c b/mm/mmap.c
--- a/mm/mmap.c	Thu Jan  8 23:00:24 2004
+++ b/mm/mmap.c	Thu Jan  8 23:00:24 2004
@@ -1138,7 +1138,11 @@
 	tlb = tlb_gather_mmu(mm, 0);
 	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted);
 	vm_unacct_memory(nr_accounted);
-	free_pgtables(tlb, prev, start, end);
+
+	if (is_hugepage_only_range(start, end - start))
+		hugetlb_free_pgtables(tlb, prev, start, end);
+	else
+		free_pgtables(tlb, prev, start, end);
 	tlb_finish_mmu(tlb, start, end);
 }
 
diff -Nru a/mm/mremap.c b/mm/mremap.c
--- a/mm/mremap.c	Thu Jan  8 23:00:24 2004
+++ b/mm/mremap.c	Thu Jan  8 23:00:24 2004
@@ -315,6 +315,10 @@
 	old_len = PAGE_ALIGN(old_len);
 	new_len = PAGE_ALIGN(new_len);
 
+	/* Don't allow the degenerate cases */
+	if (!old_len || !new_len)
+		goto out;
+
 	/* new_addr is only valid if MREMAP_FIXED is specified */
 	if (flags & MREMAP_FIXED) {
 		if (new_addr & ~PAGE_MASK)
diff -Nru a/mm/oom_kill.c b/mm/oom_kill.c
--- a/mm/oom_kill.c	Thu Jan  8 23:00:24 2004
+++ b/mm/oom_kill.c	Thu Jan  8 23:00:24 2004
@@ -24,20 +24,6 @@
 /* #define DEBUG */
 
 /**
- * int_sqrt - oom_kill.c internal function, rough approximation to sqrt
- * @x: integer of which to calculate the sqrt
- * 
- * A very rough approximation to the sqrt() function.
- */
-static unsigned int int_sqrt(unsigned int x)
-{
-	unsigned int out = x;
-	while (x & ~(unsigned int)1) x >>=2, out >>=1;
-	if (x) out -= out >> 2;
-	return (out ? out : 1);
-}	
-
-/**
  * oom_badness - calculate a numeric value for how bad this task has been
  * @p: task struct of which task we should calculate
  *
@@ -57,7 +43,7 @@
 
 static int badness(struct task_struct *p)
 {
-	int points, cpu_time, run_time;
+	int points, cpu_time, run_time, s;
 
 	if (!p->mm)
 		return 0;
@@ -77,8 +63,12 @@
 	cpu_time = (p->utime + p->stime) >> (SHIFT_HZ + 3);
 	run_time = (get_jiffies_64() - p->start_time) >> (SHIFT_HZ + 10);
 
-	points /= int_sqrt(cpu_time);
-	points /= int_sqrt(int_sqrt(run_time));
+	s = int_sqrt(cpu_time);
+	if (s)
+		points /= s;
+	s = int_sqrt(int_sqrt(run_time));
+	if (s)
+		points /= s;
 
 	/*
 	 * Niced processes are most likely less important, so double
diff -Nru a/mm/page_alloc.c b/mm/page_alloc.c
--- a/mm/page_alloc.c	Thu Jan  8 23:00:23 2004
+++ b/mm/page_alloc.c	Thu Jan  8 23:00:23 2004
@@ -267,9 +267,11 @@
 void __free_pages_ok(struct page *page, unsigned int order)
 {
 	LIST_HEAD(list);
+	int i;
 
 	mod_page_state(pgfree, 1 << order);
-	free_pages_check(__FUNCTION__, page);
+	for (i = 0 ; i < (1 << order) ; ++i)
+		free_pages_check(__FUNCTION__, page + i);
 	list_add(&page->list, &list);
 	kernel_map_pages(page, 1<<order, 0);
 	free_pages_bulk(page_zone(page), 1, &list, order);
@@ -1589,7 +1591,7 @@
  *	that the pages_{min,low,high} values for each zone are set correctly 
  *	with respect to min_free_kbytes.
  */
-void setup_per_zone_pages_min(void)
+static void setup_per_zone_pages_min(void)
 {
 	unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
 	unsigned long lowmem_pages = 0;
@@ -1631,6 +1633,45 @@
 		spin_unlock_irqrestore(&zone->lru_lock, flags);
 	}
 }
+
+/*
+ * Initialise min_free_kbytes.
+ *
+ * For small machines we want it small (128k min).  For large machines
+ * we want it large (16MB max).  But it is not linear, because network
+ * bandwidth does not increase linearly with machine size.  We use
+ *
+ *	min_free_kbytes = sqrt(lowmem_kbytes)
+ *
+ * which yields
+ *
+ * 16MB:	128k
+ * 32MB:	181k
+ * 64MB:	256k
+ * 128MB:	362k
+ * 256MB:	512k
+ * 512MB:	724k
+ * 1024MB:	1024k
+ * 2048MB:	1448k
+ * 4096MB:	2048k
+ * 8192MB:	2896k
+ * 16384MB:	4096k
+ */
+static int __init init_per_zone_pages_min(void)
+{
+	unsigned long lowmem_kbytes;
+
+	lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);
+
+	min_free_kbytes = int_sqrt(lowmem_kbytes);
+	if (min_free_kbytes < 128)
+		min_free_kbytes = 128;
+	if (min_free_kbytes > 16384)
+		min_free_kbytes = 16384;
+	setup_per_zone_pages_min();
+	return 0;
+}
+module_init(init_per_zone_pages_min)
 
 /*
  * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so 
diff -Nru a/mm/readahead.c b/mm/readahead.c
--- a/mm/readahead.c	Thu Jan  8 23:00:23 2004
+++ b/mm/readahead.c	Thu Jan  8 23:00:23 2004
@@ -347,6 +347,8 @@
 	unsigned min;
 	unsigned orig_next_size;
 	unsigned actual;
+	int first_access=0;
+	unsigned long preoffset=0;
 
 	/*
 	 * Here we detect the case where the application is performing
@@ -370,16 +372,18 @@
 	min = get_min_readahead(ra);
 	orig_next_size = ra->next_size;
 
-	if (ra->next_size == 0 && offset == 0) {
+	if (ra->next_size == 0) {
 		/*
-		 * Special case - first read from first page.
+		 * Special case - first read.
 		 * We'll assume it's a whole-file read, and
 		 * grow the window fast.
 		 */
+		first_access=1;
 		ra->next_size = max / 2;
 		goto do_io;
 	}
 
+	preoffset = ra->prev_page;
 	ra->prev_page = offset;
 
 	if (offset >= ra->start && offset <= (ra->start + ra->size)) {
@@ -439,20 +443,44 @@
 		 * ahead window and get some I/O underway for the new
 		 * current window.
 		 */
+		if (!first_access && preoffset >= ra->start &&
+				preoffset < (ra->start + ra->size)) {
+			 /* Heuristic:  If 'n' pages were
+			  * accessed in the current window, there
+			  * is a high probability that around 'n' pages
+			  * shall be used in the next current window.
+			  *
+			  * To minimize lazy-readahead triggered
+			  * in the next current window, read in
+			  * an extra page.
+			  */
+			ra->next_size = preoffset - ra->start + 2;
+		}
 		ra->start = offset;
 		ra->size = ra->next_size;
 		ra->ahead_start = 0;		/* Invalidate these */
 		ra->ahead_size = 0;
 		actual = do_page_cache_readahead(mapping, filp, offset,
 						 ra->size);
-		check_ra_success(ra, ra->size, actual, orig_next_size);
+		if(!first_access) {
+			/*
+			 * do not adjust the readahead window size the first
+			 * time, the ahead window might get closed if all
+			 * the pages are already in the cache.
+			 */
+			check_ra_success(ra, ra->size, actual, orig_next_size);
+		}
 	} else {
 		/*
 		 * This read request is within the current window.  It is time
 		 * to submit I/O for the ahead window while the application is
-		 * crunching through the current window.
+		 * about to step into the ahead window.
+		 * Heuristic: Defer reading the ahead window till we hit
+		 * the last page in the current window. (lazy readahead)
+		 * If we read in earlier we run the risk of wasting
+		 * the ahead window.
 		 */
-		if (ra->ahead_start == 0) {
+		if (ra->ahead_start == 0 && offset == (ra->start + ra->size -1)) {
 			ra->ahead_start = ra->start + ra->size;
 			ra->ahead_size = ra->next_size;
 			actual = do_page_cache_readahead(mapping, filp,
@@ -488,7 +516,7 @@
 		const unsigned long max = get_max_readahead(ra);
 
 		if (offset != ra->prev_page + 1) {
-			ra->size = 0;			/* Not sequential */
+			ra->size = ra->size?ra->size-1:0; /* Not sequential */
 		} else {
 			ra->size++;			/* A sequential read */
 			if (ra->size >= max) {		/* Resume readahead */
diff -Nru a/mm/shmem.c b/mm/shmem.c
--- a/mm/shmem.c	Thu Jan  8 23:00:23 2004
+++ b/mm/shmem.c	Thu Jan  8 23:00:23 2004
@@ -71,7 +71,7 @@
 };
 
 static int shmem_getpage(struct inode *inode, unsigned long idx,
-			 struct page **pagep, enum sgp_type sgp);
+			 struct page **pagep, enum sgp_type sgp, int *type);
 
 static inline struct page *shmem_dir_alloc(unsigned int gfp_mask)
 {
@@ -540,7 +540,7 @@
 			if (attr->ia_size & (PAGE_CACHE_SIZE-1)) {
 				(void) shmem_getpage(inode,
 					attr->ia_size>>PAGE_CACHE_SHIFT,
-						&page, SGP_READ);
+						&page, SGP_READ, NULL);
 			}
 			/*
 			 * Reset SHMEM_PAGEIN flag so that shmem_truncate can
@@ -765,7 +765,7 @@
  * vm. If we swap it in we mark it dirty since we also free the swap
  * entry since a page cannot live in both the swap and page cache
  */
-static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp)
+static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp, int *type)
 {
 	struct address_space *mapping = inode->i_mapping;
 	struct shmem_inode_info *info = SHMEM_I(inode);
@@ -774,7 +774,7 @@
 	struct page *swappage;
 	swp_entry_t *entry;
 	swp_entry_t swap;
-	int error;
+	int error, majmin = VM_FAULT_MINOR;
 
 	if (idx >= SHMEM_MAX_INDEX)
 		return -EFBIG;
@@ -811,6 +811,10 @@
 		if (!swappage) {
 			shmem_swp_unmap(entry);
 			spin_unlock(&info->lock);
+			/* here we actually do the io */
+			if (majmin == VM_FAULT_MINOR && type)
+				inc_page_state(pgmajfault);
+			majmin = VM_FAULT_MAJOR;
 			swapin_readahead(swap);
 			swappage = read_swap_cache_async(swap);
 			if (!swappage) {
@@ -959,6 +963,8 @@
 		} else
 			*pagep = ZERO_PAGE(0);
 	}
+	if (type)
+		*type = majmin;
 	return 0;
 
 failed:
@@ -969,7 +975,7 @@
 	return error;
 }
 
-struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int unused)
+struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int *type)
 {
 	struct inode *inode = vma->vm_file->f_dentry->d_inode;
 	struct page *page = NULL;
@@ -980,7 +986,7 @@
 	idx += vma->vm_pgoff;
 	idx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
 
-	error = shmem_getpage(inode, idx, &page, SGP_CACHE);
+	error = shmem_getpage(inode, idx, &page, SGP_CACHE, type);
 	if (error)
 		return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
 
@@ -1007,7 +1013,7 @@
 		/*
 		 * Will need changing if PAGE_CACHE_SIZE != PAGE_SIZE
 		 */
-		err = shmem_getpage(inode, pgoff, &page, sgp);
+		err = shmem_getpage(inode, pgoff, &page, sgp, NULL);
 		if (err)
 			return err;
 		if (page) {
@@ -1157,7 +1163,7 @@
 shmem_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
 {
 	struct inode *inode = page->mapping->host;
-	return shmem_getpage(inode, page->index, &page, SGP_WRITE);
+	return shmem_getpage(inode, page->index, &page, SGP_WRITE, NULL);
 }
 
 static ssize_t
@@ -1214,7 +1220,7 @@
 		 * But it still may be a good idea to prefault below.
 		 */
 
-		err = shmem_getpage(inode, index, &page, SGP_WRITE);
+		err = shmem_getpage(inode, index, &page, SGP_WRITE, NULL);
 		if (err)
 			break;
 
@@ -1296,7 +1302,7 @@
 				break;
 		}
 
-		desc->error = shmem_getpage(inode, index, &page, SGP_READ);
+		desc->error = shmem_getpage(inode, index, &page, SGP_READ, NULL);
 		if (desc->error) {
 			if (desc->error == -EINVAL)
 				desc->error = 0;
@@ -1552,7 +1558,7 @@
 			iput(inode);
 			return -ENOMEM;
 		}
-		error = shmem_getpage(inode, 0, &page, SGP_WRITE);
+		error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
 		if (error) {
 			vm_unacct_memory(VM_ACCT(1));
 			iput(inode);
@@ -1590,7 +1596,7 @@
 static int shmem_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 {
 	struct page *page = NULL;
-	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
+	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	if (res)
 		return res;
 	res = vfs_readlink(dentry, buffer, buflen, kmap(page));
@@ -1603,7 +1609,7 @@
 static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 	struct page *page = NULL;
-	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
+	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	if (res)
 		return res;
 	res = vfs_follow_link(nd, kmap(page));
diff -Nru a/mm/slab.c b/mm/slab.c
--- a/mm/slab.c	Thu Jan  8 23:00:24 2004
+++ b/mm/slab.c	Thu Jan  8 23:00:24 2004
@@ -805,13 +805,14 @@
 	void *addr;
 
 	flags |= cachep->gfpflags;
-	if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
-		atomic_add(1<<cachep->gfporder, &slab_reclaim_pages);
 	addr = (void*)__get_free_pages(flags, cachep->gfporder);
 	if (addr) {
 		int i = (1 << cachep->gfporder);
 		struct page *page = virt_to_page(addr);
 
+		if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
+			atomic_add(i, &slab_reclaim_pages);
+		add_page_state(nr_slab, i);
 		while (i--) {
 			SetPageSlab(page);
 			page++;
@@ -1608,7 +1609,6 @@
 	do {
 		SET_PAGE_CACHE(page, cachep);
 		SET_PAGE_SLAB(page, slabp);
-		inc_page_state(nr_slab);
 		page++;
 	} while (--i);
 
diff -Nru a/mm/swap.c b/mm/swap.c
--- a/mm/swap.c	Thu Jan  8 23:00:23 2004
+++ b/mm/swap.c	Thu Jan  8 23:00:23 2004
@@ -386,17 +386,19 @@
 #ifdef CONFIG_SMP
 void percpu_counter_mod(struct percpu_counter *fbc, long amount)
 {
+	long count;
+	long *pcount;
 	int cpu = get_cpu();
-	long count = fbc->counters[cpu].count;
 
-	count += amount;
+	pcount = per_cpu_ptr(fbc->counters, cpu);
+	count = *pcount + amount;
 	if (count >= FBC_BATCH || count <= -FBC_BATCH) {
 		spin_lock(&fbc->lock);
 		fbc->count += count;
 		spin_unlock(&fbc->lock);
 		count = 0;
 	}
-	fbc->counters[cpu].count = count;
+	*pcount = count;
 	put_cpu();
 }
 EXPORT_SYMBOL(percpu_counter_mod);
diff -Nru a/mm/vmscan.c b/mm/vmscan.c
--- a/mm/vmscan.c	Thu Jan  8 23:00:23 2004
+++ b/mm/vmscan.c	Thu Jan  8 23:00:23 2004
@@ -154,7 +154,7 @@
 	list_for_each_entry(shrinker, &shrinker_list, list) {
 		unsigned long long delta;
 
-		delta = scanned * shrinker->seeks;
+		delta = 4 * (scanned / shrinker->seeks);
 		delta *= (*shrinker->shrinker)(0, gfp_mask);
 		do_div(delta, pages + 1);
 		shrinker->nr += delta;
@@ -779,7 +779,7 @@
 		count = atomic_read(&zone->refill_counter);
 		if (count > SWAP_CLUSTER_MAX * 4)
 			count = SWAP_CLUSTER_MAX * 4;
-		atomic_sub(count, &zone->refill_counter);
+		atomic_set(&zone->refill_counter, 0);
 		refill_inactive_zone(zone, count, ps, priority);
 	}
 	return shrink_cache(nr_pages, zone, gfp_mask,
diff -Nru a/net/appletalk/sysctl_net_atalk.c b/net/appletalk/sysctl_net_atalk.c
--- a/net/appletalk/sysctl_net_atalk.c	Thu Jan  8 23:00:23 2004
+++ b/net/appletalk/sysctl_net_atalk.c	Thu Jan  8 23:00:23 2004
@@ -23,6 +23,7 @@
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec_jiffies,
+		.strategy	= &sysctl_jiffies,
 	},
 	{
 		.ctl_name	= NET_ATALK_AARP_TICK_TIME,
@@ -31,6 +32,7 @@
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec_jiffies,
+		.strategy	= &sysctl_jiffies,
 	},
 	{
 		.ctl_name	= NET_ATALK_AARP_RETRANSMIT_LIMIT,
@@ -47,6 +49,7 @@
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec_jiffies,
+		.strategy	= &sysctl_jiffies,
 	},
 	{ 0 },
 };
diff -Nru a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
--- a/net/ax25/af_ax25.c	Thu Jan  8 23:00:24 2004
+++ b/net/ax25/af_ax25.c	Thu Jan  8 23:00:24 2004
@@ -228,45 +228,26 @@
 	return NULL;
 }
 
-/*
- *	Look for any matching address - RAW sockets can bind to arbitrary names
- */
-struct sock *ax25_addr_match(ax25_address *addr)
+void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
 {
-	struct sock *sk = NULL;
 	ax25_cb *s;
+	struct sk_buff *copy;
 	struct hlist_node *node;
 
 	spin_lock_bh(&ax25_list_lock);
 	ax25_for_each(s, node, &ax25_list) {
 		if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
-		    s->sk->sk_type == SOCK_RAW) {
-			sk = s->sk;
-			lock_sock(sk);
-			break;
-		}
-	}
-
-	spin_unlock_bh(&ax25_list_lock);
-
-	return sk;
-}
-
-void ax25_send_to_raw(struct sock *sk, struct sk_buff *skb, int proto)
-{
-	struct sk_buff *copy;
-	struct hlist_node *node;
-
-	sk_for_each_from(sk, node)
-		if (sk->sk_type == SOCK_RAW &&
-		    sk->sk_protocol == proto &&
-		    atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) {
+		    s->sk->sk_type == SOCK_RAW &&
+		    s->sk->sk_protocol == proto &&
+		    s->ax25_dev->dev == skb->dev &&
+		    atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
 			if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
-				return;
-
-			if (sock_queue_rcv_skb(sk, copy) != 0)
+				continue;
+			if (sock_queue_rcv_skb(s->sk, copy) != 0)
 				kfree_skb(copy);
 		}
+	}
+	spin_unlock_bh(&ax25_list_lock);
 }
 
 /*
@@ -318,7 +299,7 @@
 				ax25_cb *sax25 = ax25_sk(skb->sk);
 
 				/* Queue the unaccepted socket for death */
-				sock_set_flag(skb->sk, SOCK_DEAD);
+				sock_orphan(skb->sk);
 
 				ax25_start_heartbeat(sax25);
 				sax25->state = AX25_STATE_0;
@@ -913,6 +894,7 @@
 	if (oax25->digipeat != NULL) {
 		if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
 			sk_free(sk);
+			ax25_cb_put(ax25);
 			return NULL;
 		}
 
@@ -934,20 +916,25 @@
 		return 0;
 
 	sock_hold(sk);
+	sock_orphan(sk);
 	lock_sock(sk);
 	ax25 = ax25_sk(sk);
 
 	if (sk->sk_type == SOCK_SEQPACKET) {
 		switch (ax25->state) {
 		case AX25_STATE_0:
+			release_sock(sk);
 			ax25_disconnect(ax25, 0);
+			lock_sock(sk);
 			ax25_destroy_socket(ax25);
 			break;
 
 		case AX25_STATE_1:
 		case AX25_STATE_2:
 			ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
+			release_sock(sk);
 			ax25_disconnect(ax25, 0);
+			lock_sock(sk);
 			ax25_destroy_socket(ax25);
 			break;
 
@@ -980,7 +967,6 @@
 			sk->sk_state                = TCP_CLOSE;
 			sk->sk_shutdown            |= SEND_SHUTDOWN;
 			sk->sk_state_change(sk);
-			sock_set_flag(sk, SOCK_DEAD);
 			sock_set_flag(sk, SOCK_DESTROY);
 			break;
 
@@ -991,12 +977,10 @@
 		sk->sk_state     = TCP_CLOSE;
 		sk->sk_shutdown |= SEND_SHUTDOWN;
 		sk->sk_state_change(sk);
-		sock_set_flag(sk, SOCK_DEAD);
 		ax25_destroy_socket(ax25);
 	}
 
 	sock->sk   = NULL;
-	sk->sk_socket = NULL;	/* Not used, but we should do this */
 	release_sock(sk);
 	sock_put(sk);
 
@@ -1334,11 +1318,13 @@
 
 		release_sock(sk);
 		current->state = TASK_INTERRUPTIBLE;
-		if (flags & O_NONBLOCK)
+		if (flags & O_NONBLOCK) {
+			current->state = TASK_RUNNING;
+			remove_wait_queue(sk->sk_sleep, &wait);
 			return -EWOULDBLOCK;
+		}
 		if (!signal_pending(tsk)) {
 			schedule();
-			current->state = TASK_RUNNING;
 			lock_sock(sk);
 			continue;
 		}
@@ -1633,16 +1619,16 @@
 	if (msg->msg_namelen != 0) {
 		struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 		ax25_digi digi;
-		ax25_address dest;
+		ax25_address src;
 
-		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
+		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
 
 		sax->sax25_family = AF_AX25;
 		/* We set this correctly, even though we may not let the
 		   application know the digi calls further down (because it
 		   did NOT ask to know them).  This could get political... **/
 		sax->sax25_ndigis = digi.ndigi;
-		sax->sax25_call   = dest;
+		sax->sax25_call   = src;
 
 		if (sax->sax25_ndigis != 0) {
 			int ct;
diff -Nru a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
--- a/net/ax25/ax25_in.c	Thu Jan  8 23:00:23 2004
+++ b/net/ax25/ax25_in.c	Thu Jan  8 23:00:23 2004
@@ -147,7 +147,6 @@
 	}
 
 	if (ax25->sk != NULL && ax25->ax25_dev->values[AX25_VALUES_CONMODE] == 2) {
-		bh_lock_sock(ax25->sk);
 		if ((!ax25->pidincl && ax25->sk->sk_protocol == pid) ||
 		    ax25->pidincl) {
 			if (sock_queue_rcv_skb(ax25->sk, skb) == 0)
@@ -155,7 +154,6 @@
 			else
 				ax25->condition |= AX25_COND_OWN_RX_BUSY;
 		}
-		bh_unlock_sock(ax25->sk);
 	}
 
 	return queued;
@@ -195,7 +193,7 @@
 {
 	ax25_address src, dest, *next_digi = NULL;
 	int type = 0, mine = 0, dama;
-	struct sock *make, *sk, *raw;
+	struct sock *make, *sk;
 	ax25_digi dp, reverse_dp;
 	ax25_cb *ax25;
 	ax25_dev *ax25_dev;
@@ -243,10 +241,7 @@
 	if ((*skb->data & ~0x10) == AX25_UI && dp.lastrepeat + 1 == dp.ndigi) {
 		skb->h.raw = skb->data + 2;		/* skip control and pid */
 
-		if ((raw = ax25_addr_match(&dest)) != NULL) {
-			ax25_send_to_raw(raw, skb, skb->data[1]);
-			release_sock(raw);
-		}
+		ax25_send_to_raw(&dest, skb, skb->data[1]);
 
 		if (!mine && ax25cmp(&dest, (ax25_address *)dev->broadcast) != 0) {
 			kfree_skb(skb);
@@ -381,7 +376,6 @@
 
 		sk->sk_ack_backlog++;
 		bh_unlock_sock(sk);
-		sock_put(sk);
 	} else {
 		if (!mine) {
 			kfree_skb(skb);
@@ -407,6 +401,8 @@
 	    (ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
 		kfree_skb(skb);
 		ax25_destroy_socket(ax25);
+		if (sk)
+			sock_put(sk);
 		return 0;
 	}
 
@@ -446,6 +442,7 @@
 	if (sk) {
 		if (!sock_flag(sk, SOCK_DEAD))
 			sk->sk_data_ready(sk, skb->len);
+		sock_put(sk);
 	} else
 		kfree_skb(skb);
 
diff -Nru a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
--- a/net/bluetooth/af_bluetooth.c	Thu Jan  8 23:00:23 2004
+++ b/net/bluetooth/af_bluetooth.c	Thu Jan  8 23:00:23 2004
@@ -360,3 +360,4 @@
 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>");
 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);
diff -Nru a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
--- a/net/bluetooth/bnep/core.c	Thu Jan  8 23:00:24 2004
+++ b/net/bluetooth/bnep/core.c	Thu Jan  8 23:00:24 2004
@@ -707,4 +707,3 @@
 MODULE_DESCRIPTION("Bluetooth BNEP ver " VERSION);
 MODULE_AUTHOR("David Libault <david.libault@inventel.fr>, Maxim Krasnyanskiy <maxk@qualcomm.com>");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);
diff -Nru a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
--- a/net/bridge/br_netfilter.c	Thu Jan  8 23:00:24 2004
+++ b/net/bridge/br_netfilter.c	Thu Jan  8 23:00:24 2004
@@ -35,22 +35,34 @@
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
 #include "br_private.h"
+#ifdef CONFIG_SYSCTL
+#include <linux/sysctl.h>
+#endif
 
 
 #define skb_origaddr(skb)	 (((struct bridge_skb_cb *) \
-				 (skb->cb))->daddr.ipv4)
+				 (skb->nf_bridge->data))->daddr.ipv4)
 #define store_orig_dstaddr(skb)	 (skb_origaddr(skb) = (skb)->nh.iph->daddr)
 #define dnat_took_place(skb)	 (skb_origaddr(skb) != (skb)->nh.iph->daddr)
-#define clear_cb(skb)		 (memset(&skb_origaddr(skb), 0, \
-				 sizeof(struct bridge_skb_cb)))
 
 #define has_bridge_parent(device)	((device)->br_port != NULL)
 #define bridge_parent(device)		((device)->br_port->br->dev)
 
-#define IS_VLAN_IP (skb->protocol == __constant_htons(ETH_P_8021Q) && \
-	hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_IP))
-#define IS_VLAN_ARP (skb->protocol == __constant_htons(ETH_P_8021Q) && \
-	hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_ARP))
+#ifdef CONFIG_SYSCTL
+static struct ctl_table_header *brnf_sysctl_header;
+static int brnf_call_iptables = 1;
+static int brnf_call_arptables = 1;
+static int brnf_filter_vlan_tagged = 1;
+#else
+#define brnf_filter_vlan_tagged 1
+#endif
+
+#define IS_VLAN_IP (skb->protocol == __constant_htons(ETH_P_8021Q) &&    \
+	hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_IP) &&  \
+	brnf_filter_vlan_tagged)
+#define IS_VLAN_ARP (skb->protocol == __constant_htons(ETH_P_8021Q) &&   \
+	hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_ARP) && \
+	brnf_filter_vlan_tagged)
 
 /* We need these fake structures to make netfilter happy --
  * lots of places assume that skb->dst != NULL, which isn't
@@ -74,8 +86,7 @@
 			.metrics		= {[RTAX_MTU - 1] = 1500},
 		}
 	},
-
-	.rt_flags	= 0
+	.rt_flags	= 0,
 };
 
 
@@ -203,7 +214,6 @@
 				 */
 				nf_bridge->mask |= BRNF_BRIDGED_DNAT;
 				skb->dev = nf_bridge->physindev;
-				clear_cb(skb);
 				if (skb->protocol ==
 				    __constant_htons(ETH_P_8021Q)) {
 					skb_push(skb, VLAN_HLEN);
@@ -224,7 +234,6 @@
 		dst_hold(skb->dst);
 	}
 
-	clear_cb(skb);
 	skb->dev = nf_bridge->physindev;
 	if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
 		skb_push(skb, VLAN_HLEN);
@@ -251,6 +260,11 @@
 	struct sk_buff *skb = *pskb;
 	struct nf_bridge_info *nf_bridge;
 
+#ifdef CONFIG_SYSCTL
+	if (!brnf_call_iptables)
+		return NF_ACCEPT;
+#endif
+
 	if (skb->protocol != __constant_htons(ETH_P_IP)) {
 		struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)
 					  ((*pskb)->mac.ethernet);
@@ -338,6 +352,7 @@
 	return NF_ACCEPT;
 }
 
+
 /* PF_BRIDGE/FORWARD *************************************************/
 static int br_nf_forward_finish(struct sk_buff *skb)
 {
@@ -373,7 +388,7 @@
  * because of the ipt_physdev.c module. For ARP, indev and outdev are the
  * bridge ports.
  */
-static unsigned int br_nf_forward(unsigned int hook, struct sk_buff **pskb,
+static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb,
    const struct net_device *in, const struct net_device *out,
    int (*okfn)(struct sk_buff *))
 {
@@ -381,9 +396,13 @@
 	struct nf_bridge_info *nf_bridge;
 	struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet);
 
-	if (skb->protocol != __constant_htons(ETH_P_IP) &&
-	    skb->protocol != __constant_htons(ETH_P_ARP)) {
-		if (!IS_VLAN_IP && !IS_VLAN_ARP)
+#ifdef CONFIG_SYSCTL
+	if (!skb->nf_bridge)
+		return NF_ACCEPT;
+#endif
+
+	if (skb->protocol != __constant_htons(ETH_P_IP)) {
+		if (!IS_VLAN_IP)
 			return NF_ACCEPT;
 		skb_pull(*pskb, VLAN_HLEN);
 		(*pskb)->nh.raw += VLAN_HLEN;
@@ -392,34 +411,54 @@
 #ifdef CONFIG_NETFILTER_DEBUG
 	skb->nf_debug ^= (1 << NF_BR_FORWARD);
 #endif
-	if (skb->protocol == __constant_htons(ETH_P_IP) || IS_VLAN_IP) {
-		nf_bridge = skb->nf_bridge;
-		if (skb->pkt_type == PACKET_OTHERHOST) {
-			skb->pkt_type = PACKET_HOST;
-			nf_bridge->mask |= BRNF_PKT_TYPE;
-		}
+	nf_bridge = skb->nf_bridge;
+	if (skb->pkt_type == PACKET_OTHERHOST) {
+		skb->pkt_type = PACKET_HOST;
+		nf_bridge->mask |= BRNF_PKT_TYPE;
+	}
+
+	/* The physdev module checks on this */
+	nf_bridge->mask |= BRNF_BRIDGED;
+	nf_bridge->physoutdev = skb->dev;
 
-		/* The physdev module checks on this */
-		nf_bridge->mask |= BRNF_BRIDGED;
-		nf_bridge->physoutdev = skb->dev;
+	NF_HOOK(PF_INET, NF_IP_FORWARD, skb, bridge_parent(in),
+		bridge_parent(out), br_nf_forward_finish);
 
-		NF_HOOK(PF_INET, NF_IP_FORWARD, skb, bridge_parent(in),
-			bridge_parent(out), br_nf_forward_finish);
-	} else {
-		struct net_device **d = (struct net_device **)(skb->cb);
-		struct arphdr *arp = skb->nh.arph;
+	return NF_STOLEN;
+}
 
-		if (arp->ar_pln != 4) {
-			if (IS_VLAN_ARP) {
-				skb_push(*pskb, VLAN_HLEN);
-				(*pskb)->nh.raw -= VLAN_HLEN;
-			}
+static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb,
+   const struct net_device *in, const struct net_device *out,
+   int (*okfn)(struct sk_buff *))
+{
+	struct sk_buff *skb = *pskb;
+	struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet);
+	struct net_device **d = (struct net_device **)(skb->cb);
+
+	if (!brnf_call_arptables)
+		return NF_ACCEPT;
+
+	if (skb->protocol != __constant_htons(ETH_P_ARP)) {
+		if (!IS_VLAN_ARP)
 			return NF_ACCEPT;
+		skb_pull(*pskb, VLAN_HLEN);
+		(*pskb)->nh.raw += VLAN_HLEN;
+	}
+
+#ifdef CONFIG_NETFILTER_DEBUG
+	skb->nf_debug ^= (1 << NF_BR_FORWARD);
+#endif
+
+	if (skb->nh.arph->ar_pln != 4) {
+		if (IS_VLAN_ARP) {
+			skb_push(*pskb, VLAN_HLEN);
+			(*pskb)->nh.raw -= VLAN_HLEN;
 		}
-		*d = (struct net_device *)in;
-		NF_HOOK(NF_ARP, NF_ARP_FORWARD, skb, (struct net_device *)in,
-			(struct net_device *)out, br_nf_forward_finish);
+		return NF_ACCEPT;
 	}
+	*d = (struct net_device *)in;
+	NF_HOOK(NF_ARP, NF_ARP_FORWARD, skb, (struct net_device *)in,
+		(struct net_device *)out, br_nf_forward_finish);
 
 	return NF_STOLEN;
 }
@@ -475,6 +514,11 @@
 	struct nf_bridge_info *nf_bridge;
 	struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet);
 
+#ifdef CONFIG_SYSCTL
+	if (!skb->nf_bridge)
+		return NF_ACCEPT;
+#endif
+
 	if (skb->protocol != __constant_htons(ETH_P_IP) && !IS_VLAN_IP)
 		return NF_ACCEPT;
 
@@ -486,7 +530,6 @@
 
 	nf_bridge = skb->nf_bridge;
 	nf_bridge->physoutdev = skb->dev;
-
 	realindev = nf_bridge->physindev;
 
 	/* Bridged, take PF_BRIDGE/FORWARD.
@@ -554,29 +597,34 @@
 	struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet);
 	struct net_device *realoutdev = bridge_parent(skb->dev);
 
-	/* Be very paranoid. Must be a device driver bug. */
+#ifdef CONFIG_NETFILTER_DEBUG
+	/* Be very paranoid. This probably won't happen anymore, but let's
+	 * keep the check just to be sure... */
 	if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) {
 		printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: "
 				 "bad mac.raw pointer.");
-		if (skb->dev != NULL) {
-			printk("[%s]", skb->dev->name);
-			if (has_bridge_parent(skb->dev))
-				printk("[%s]", bridge_parent(skb->dev)->name);
-		}
-		printk(" head:%p, raw:%p\n", skb->head, skb->mac.raw);
-		return NF_ACCEPT;
+		goto print_error;
 	}
+#endif
+
+#ifdef CONFIG_SYSCTL
+	if (!nf_bridge)
+		return NF_ACCEPT;
+#endif
 
 	if (skb->protocol != __constant_htons(ETH_P_IP) && !IS_VLAN_IP)
 		return NF_ACCEPT;
 
+#ifdef CONFIG_NETFILTER_DEBUG
 	/* Sometimes we get packets with NULL ->dst here (for example,
-	 * running a dhcp client daemon triggers this).
+	 * running a dhcp client daemon triggers this). This should now
+	 * be fixed, but let's keep the check around.
 	 */
-	if (skb->dst == NULL)
-		return NF_ACCEPT;
+	if (skb->dst == NULL) {
+		printk(KERN_CRIT "br_netfilter: skb->dst == NULL.");
+		goto print_error;
+	}
 
-#ifdef CONFIG_NETFILTER_DEBUG
 	skb->nf_debug ^= (1 << NF_IP_POST_ROUTING);
 #endif
 
@@ -603,6 +651,18 @@
 		realoutdev, br_dev_queue_push_xmit);
 
 	return NF_STOLEN;
+
+#ifdef CONFIG_NETFILTER_DEBUG
+print_error:
+	if (skb->dev != NULL) {
+		printk("[%s]", skb->dev->name);
+		if (has_bridge_parent(skb->dev))
+			printk("[%s]", bridge_parent(skb->dev)->name);
+	}
+	printk(" head:%p, raw:%p, data:%p\n", skb->head, skb->mac.raw,
+					      skb->data);
+	return NF_ACCEPT;
+#endif
 }
 
 
@@ -632,6 +692,13 @@
    const struct net_device *in, const struct net_device *out,
    int (*okfn)(struct sk_buff *))
 {
+	struct sk_buff *skb = *pskb;
+
+#ifdef CONFIG_SYSCTL
+	if (!brnf_call_iptables && !skb->nf_bridge)
+		return NF_ACCEPT;
+#endif
+
 	if ((out->hard_start_xmit == br_dev_xmit &&
 	    okfn != br_nf_forward_finish &&
 	    okfn != br_nf_local_out_finish &&
@@ -641,7 +708,6 @@
 	    VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit)
 #endif
 	    ) {
-		struct sk_buff *skb = *pskb;
 		struct nf_bridge_info *nf_bridge;
 
 		if (!skb->nf_bridge && !nf_bridge_alloc(skb))
@@ -687,7 +753,12 @@
 	  .pf = PF_BRIDGE,
 	  .hooknum = NF_BR_LOCAL_IN,
 	  .priority = NF_BR_PRI_BRNF, },
-	{ .hook = br_nf_forward,
+	{ .hook = br_nf_forward_ip,
+	  .owner = THIS_MODULE,
+	  .pf = PF_BRIDGE,
+	  .hooknum = NF_BR_FORWARD,
+	  .priority = NF_BR_PRI_BRNF - 1, },
+	{ .hook = br_nf_forward_arp,
 	  .owner = THIS_MODULE,
 	  .pf = PF_BRIDGE,
 	  .hooknum = NF_BR_FORWARD,
@@ -724,6 +795,69 @@
 	  .priority = NF_IP_PRI_FIRST, },
 };
 
+#ifdef CONFIG_SYSCTL
+static
+int brnf_sysctl_call_tables(ctl_table *ctl, int write, struct file * filp,
+			void *buffer, size_t *lenp)
+{
+	int ret;
+
+	ret = proc_dointvec(ctl, write, filp, buffer, lenp);
+
+	if (write && *(int *)(ctl->data))
+		*(int *)(ctl->data) = 1;
+	return ret;
+}
+
+static ctl_table brnf_table[] = {
+	{
+		.ctl_name	= NET_BRIDGE_NF_CALL_ARPTABLES,
+		.procname	= "bridge-nf-call-arptables",
+		.data		= &brnf_call_arptables,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &brnf_sysctl_call_tables,
+	},
+	{
+		.ctl_name	= NET_BRIDGE_NF_CALL_IPTABLES,
+		.procname	= "bridge-nf-call-iptables",
+		.data		= &brnf_call_iptables,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &brnf_sysctl_call_tables,
+	},
+	{
+		.ctl_name	= NET_BRIDGE_NF_FILTER_VLAN_TAGGED,
+		.procname	= "bridge-nf-filter-vlan-tagged",
+		.data		= &brnf_filter_vlan_tagged,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &brnf_sysctl_call_tables,
+	},
+	{ .ctl_name = 0 }
+};
+
+static ctl_table brnf_bridge_table[] = {
+	{
+		.ctl_name	= NET_BRIDGE,
+		.procname	= "bridge",
+		.mode		= 0555,
+		.child		= brnf_table,
+	},
+	{ .ctl_name = 0 }
+};
+
+static ctl_table brnf_net_table[] = {
+	{
+		.ctl_name	= CTL_NET,
+		.procname	= "net",
+		.mode		= 0555,
+		.child		= brnf_bridge_table,
+	},
+	{ .ctl_name = 0 }
+};
+#endif
+
 int br_netfilter_init(void)
 {
 	int i;
@@ -740,6 +874,16 @@
 		return ret;
 	}
 
+#ifdef CONFIG_SYSCTL
+	brnf_sysctl_header = register_sysctl_table(brnf_net_table, 0);
+	if (brnf_sysctl_header == NULL) {
+		printk(KERN_WARNING "br_netfilter: can't register to sysctl.\n");
+		for (i = 0; i < ARRAY_SIZE(br_nf_ops); i++)
+			nf_unregister_hook(&br_nf_ops[i]);
+		return -EFAULT;
+	}
+#endif
+
 	printk(KERN_NOTICE "Bridge firewalling registered\n");
 
 	return 0;
@@ -751,4 +895,7 @@
 
 	for (i = ARRAY_SIZE(br_nf_ops) - 1; i >= 0; i--)
 		nf_unregister_hook(&br_nf_ops[i]);
+#ifdef CONFIG_SYSCTL
+	unregister_sysctl_table(brnf_sysctl_header);
+#endif
 }
diff -Nru a/net/bridge/netfilter/Kconfig b/net/bridge/netfilter/Kconfig
--- a/net/bridge/netfilter/Kconfig	Thu Jan  8 23:00:23 2004
+++ b/net/bridge/netfilter/Kconfig	Thu Jan  8 23:00:23 2004
@@ -92,7 +92,7 @@
 	  equivalent of the iptables limit match.
 
 	  If you want to compile it as a module, say M here and read
-	  <file:Documentation/modules.txt>.  If unsure, say `N'.
+	  <file:Documentation/kbuild/modules.txt>.  If unsure, say `N'.
 
 config BRIDGE_EBT_MARK
 	tristate "ebt: mark filter support"
diff -Nru a/net/compat.c b/net/compat.c
--- a/net/compat.c	Thu Jan  8 23:00:24 2004
+++ b/net/compat.c	Thu Jan  8 23:00:24 2004
@@ -215,15 +215,25 @@
 
 int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data)
 {
+	struct compat_timeval ctv;
 	struct compat_cmsghdr *cm = (struct compat_cmsghdr *) kmsg->msg_control;
 	struct compat_cmsghdr cmhdr;
-	int cmlen = CMSG_COMPAT_LEN(len);
+	int cmlen;
 
 	if(cm == NULL || kmsg->msg_controllen < sizeof(*cm)) {
 		kmsg->msg_flags |= MSG_CTRUNC;
 		return 0; /* XXX: return error? check spec. */
 	}
 
+	if (level == SOL_SOCKET && type == SO_TIMESTAMP) { 
+		struct timeval *tv = (struct timeval *)data;
+		ctv.tv_sec = tv->tv_sec;
+		ctv.tv_usec = tv->tv_usec;
+		data = &ctv;
+		len = sizeof(struct compat_timeval);
+	} 
+	
+	cmlen = CMSG_COMPAT_LEN(len);
 	if(kmsg->msg_controllen < cmlen) {
 		kmsg->msg_flags |= MSG_CTRUNC;
 		cmlen = kmsg->msg_controllen;
diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	Thu Jan  8 23:00:24 2004
+++ b/net/core/dev.c	Thu Jan  8 23:00:24 2004
@@ -1543,7 +1543,7 @@
 			struct packet_type **pt_prev, int *ret)
 {
 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
-	if (skb->dev->br_port) {
+	if (skb->dev->br_port && skb->pkt_type != PACKET_LOOPBACK) {
 		*ret = handle_bridge(skb, *pt_prev);
 		if (br_handle_frame_hook(skb) == 0)
 			return 1;
diff -Nru a/net/core/neighbour.c b/net/core/neighbour.c
--- a/net/core/neighbour.c	Thu Jan  8 23:00:23 2004
+++ b/net/core/neighbour.c	Thu Jan  8 23:00:23 2004
@@ -98,7 +98,7 @@
 /*
  * It is random distribution in the interval (1/2)*base...(3/2)*base.
  * It corresponds to default IPv6 settings and is not overridable,
- * because it is really reasonbale choice.
+ * because it is really reasonable choice.
  */
 
 unsigned long neigh_rand_reach_time(unsigned long base)
@@ -120,7 +120,7 @@
 		while ((n = *np) != NULL) {
 			/* Neighbour record may be discarded if:
 			   - nobody refers to it.
-			   - it is not premanent
+			   - it is not permanent
 			   - (NEW and probably wrong)
 			     INCOMPLETE entries are kept at least for
 			     n->parms->retrans_time, otherwise we could
@@ -510,7 +510,7 @@
 {
 	struct hh_cache *hh;
 
-	NEIGH_PRINTK2("neigh %p is suspecteded.\n", neigh);
+	NEIGH_PRINTK2("neigh %p is suspected.\n", neigh);
 
 	neigh->output = neigh->ops->output;
 
@@ -537,7 +537,7 @@
 
 /*
    Transitions NUD_STALE <-> NUD_REACHABLE do not occur
-   when fast path is built: we have no timers assotiated with
+   when fast path is built: we have no timers associated with
    these states, we do not have time to check state when sending.
    neigh_periodic_timer check periodically neigh->confirmed
    time and moves NUD_REACHABLE -> NUD_STALE.
@@ -962,7 +962,7 @@
 
 /* This function can be used in contexts, where only old dev_queue_xmit
    worked, f.e. if you want to override normal output path (eql, shaper),
-   but resoltution is not made yet.
+   but resolution is not made yet.
  */
 
 int neigh_compat_output(struct sk_buff *skb)
@@ -1518,6 +1518,7 @@
 			.maxlen		= sizeof(int),
 			.mode		= 0644,
 			.proc_handler	= &proc_dointvec_jiffies,
+			.strategy	= &sysctl_jiffies,
 		},
 		{
 			.ctl_name	= NET_NEIGH_DELAY_PROBE_TIME,
@@ -1525,6 +1526,7 @@
 			.maxlen		= sizeof(int),
 			.mode		= 0644,
 			.proc_handler	= &proc_dointvec_jiffies,
+			.strategy	= &sysctl_jiffies,
 		},
 		{
 			.ctl_name	= NET_NEIGH_GC_STALE_TIME,
@@ -1532,6 +1534,7 @@
 			.maxlen		= sizeof(int),
 			.mode		= 0644,
 			.proc_handler	= &proc_dointvec_jiffies,
+			.strategy	= &sysctl_jiffies,
 		},
 		{
 			.ctl_name	= NET_NEIGH_UNRES_QLEN,
@@ -1574,6 +1577,7 @@
 			.maxlen		= sizeof(int),
 			.mode		= 0644,
 			.proc_handler	= &proc_dointvec_jiffies,
+			.strategy	= &sysctl_jiffies,
 		},
 		{
 			.ctl_name	= NET_NEIGH_GC_THRESH1,
diff -Nru a/net/core/sock.c b/net/core/sock.c
--- a/net/core/sock.c	Thu Jan  8 23:00:24 2004
+++ b/net/core/sock.c	Thu Jan  8 23:00:24 2004
@@ -1119,6 +1119,31 @@
 	atomic_set(&sk->sk_refcnt, 1);
 }
 
+void lock_sock(struct sock *sk)
+{
+	might_sleep();
+	spin_lock_bh(&(sk->sk_lock.slock));
+	if (sk->sk_lock.owner)
+		__lock_sock(sk);
+	sk->sk_lock.owner = (void *)1;
+	spin_unlock_bh(&(sk->sk_lock.slock));
+}
+
+EXPORT_SYMBOL(lock_sock);
+
+void release_sock(struct sock *sk)
+{
+	spin_lock_bh(&(sk->sk_lock.slock));
+	if (sk->sk_backlog.tail)
+		__release_sock(sk);
+	sk->sk_lock.owner = NULL;
+        if (waitqueue_active(&(sk->sk_lock.wq)))
+		wake_up(&(sk->sk_lock.wq));
+	spin_unlock_bh(&(sk->sk_lock.slock));
+}
+
+EXPORT_SYMBOL(release_sock);
+
 EXPORT_SYMBOL(__lock_sock);
 EXPORT_SYMBOL(__release_sock);
 EXPORT_SYMBOL(sk_alloc);
diff -Nru a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
--- a/net/core/sysctl_net_core.c	Thu Jan  8 23:00:23 2004
+++ b/net/core/sysctl_net_core.c	Thu Jan  8 23:00:23 2004
@@ -146,7 +146,8 @@
 		.data		= &net_msg_cost,
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
-		.proc_handler	= &proc_dointvec_jiffies
+		.proc_handler	= &proc_dointvec_jiffies,
+		.strategy	= &sysctl_jiffies,
 	},
 	{
 		.ctl_name	= NET_CORE_MSG_BURST,
@@ -154,7 +155,8 @@
 		.data		= &net_msg_burst,
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
-		.proc_handler	= &proc_dointvec_jiffies
+		.proc_handler	= &proc_dointvec_jiffies,
+		.strategy	= &sysctl_jiffies,
 	},
 	{
 		.ctl_name	= NET_CORE_OPTMEM_MAX,
diff -Nru a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
--- a/net/decnet/af_decnet.c	Thu Jan  8 23:00:24 2004
+++ b/net/decnet/af_decnet.c	Thu Jan  8 23:00:24 2004
@@ -2376,17 +2376,17 @@
 
 	dn_register_sysctl();
 
-	/*
-	 * Prevent DECnet module unloading until its fixed properly.
-	 * Requires an audit of the code to check for memory leaks and
-	 * initialisation problems etc.
-	 */
-	try_module_get(THIS_MODULE);
-
 	return 0;
 
 }
+module_init(decnet_init);
 
+/*
+ * Prevent DECnet module unloading until its fixed properly.
+ * Requires an audit of the code to check for memory leaks and
+ * initialisation problems etc.
+ */
+#if 0
 static void __exit decnet_exit(void)
 {
 	sock_unregister(AF_DECnet);
@@ -2405,6 +2405,5 @@
 
 	kmem_cache_destroy(dn_sk_cachep);
 }
-
-module_init(decnet_init);
 module_exit(decnet_exit);
+#endif
diff -Nru a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
--- a/net/ipv4/ip_output.c	Thu Jan  8 23:00:24 2004
+++ b/net/ipv4/ip_output.c	Thu Jan  8 23:00:24 2004
@@ -417,6 +417,7 @@
 	to->nfct = from->nfct;
 	nf_conntrack_get(to->nfct);
 #ifdef CONFIG_BRIDGE_NETFILTER
+	nf_bridge_put(to->nf_bridge);
 	to->nf_bridge = from->nf_bridge;
 	nf_bridge_get(to->nf_bridge);
 #endif
diff -Nru a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c
--- a/net/ipv4/netfilter/ipt_recent.c	Thu Jan  8 23:00:23 2004
+++ b/net/ipv4/netfilter/ipt_recent.c	Thu Jan  8 23:00:23 2004
@@ -91,8 +91,10 @@
  */
 static spinlock_t recent_lock = SPIN_LOCK_UNLOCKED;
 
+#ifdef CONFIG_PROC_FS
 /* Our /proc/net/ipt_recent entry */
 static struct proc_dir_entry *proc_net_ipt_recent = NULL;
+#endif
 
 /* Function declaration for later. */
 static int
@@ -959,8 +961,10 @@
 	int count;
 
 	printk(version);
+#ifdef CONFIG_PROC_FS
 	proc_net_ipt_recent = proc_mkdir("ipt_recent",proc_net);
 	if(!proc_net_ipt_recent) return -ENOMEM;
+#endif
 
 	if(ip_list_hash_size && ip_list_hash_size <= ip_list_tot) {
 	  printk(KERN_WARNING RECENT_NAME ": ip_list_hash_size too small, resetting to default.\n");
diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
--- a/net/ipv6/addrconf.c	Thu Jan  8 23:00:24 2004
+++ b/net/ipv6/addrconf.c	Thu Jan  8 23:00:24 2004
@@ -1809,6 +1809,54 @@
 		sit_route_add(dev);
 }
 
+static inline int
+ipv6_inherit_linklocal(struct inet6_dev *idev, struct net_device *link_dev)
+{
+	struct in6_addr lladdr;
+
+	if (!ipv6_get_lladdr(link_dev, &lladdr)) {
+		addrconf_add_linklocal(idev, &lladdr);
+		return 0;
+	}
+	return -1;
+}
+
+static void ip6_tnl_add_linklocal(struct inet6_dev *idev)
+{
+	struct net_device *link_dev;
+
+	/* first try to inherit the link-local address from the link device */
+	if (idev->dev->iflink &&
+	    (link_dev = __dev_get_by_index(idev->dev->iflink))) {
+		if (!ipv6_inherit_linklocal(idev, link_dev))
+			return;
+	}
+	/* then try to inherit it from any device */
+	for (link_dev = dev_base; link_dev; link_dev = link_dev->next) {
+		if (!ipv6_inherit_linklocal(idev, link_dev))
+			return;
+	}
+	printk(KERN_DEBUG "init ip6-ip6: add_linklocal failed\n");
+}
+
+/*
+ * Autoconfigure tunnel with a link-local address so routing protocols,
+ * DHCPv6, MLD etc. can be run over the virtual link
+ */
+
+static void addrconf_ip6_tnl_config(struct net_device *dev)
+{
+	struct inet6_dev *idev;
+
+	ASSERT_RTNL();
+
+	if ((idev = addrconf_add_dev(dev)) == NULL) {
+		printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n");
+		return;
+	}
+	ip6_tnl_add_linklocal(idev);
+	addrconf_add_mroute(dev);
+}
 
 int addrconf_notify(struct notifier_block *this, unsigned long event, 
 		    void * data)
@@ -1822,7 +1870,9 @@
 		case ARPHRD_SIT:
 			addrconf_sit_config(dev);
 			break;
-
+		case ARPHRD_TUNNEL6:
+			addrconf_ip6_tnl_config(dev);
+			break;
 		case ARPHRD_LOOPBACK:
 			init_loopback(dev);
 			break;
@@ -2121,6 +2171,7 @@
 	 */
 
 	if (ifp->idev->cnf.forwarding == 0 &&
+	    ifp->idev->cnf.rtr_solicits > 0 &&
 	    (dev->flags&IFF_LOOPBACK) == 0 &&
 	    (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
 		struct in6_addr all_routers;
@@ -2946,6 +2997,7 @@
 			.maxlen		=	sizeof(int),
 			.mode		=	0644,
          		.proc_handler	=	&proc_dointvec_jiffies,
+			.strategy	=	&sysctl_jiffies,
 		},
 		{
 			.ctl_name	=	NET_IPV6_RTR_SOLICIT_DELAY,
@@ -2954,6 +3006,7 @@
 			.maxlen		=	sizeof(int),
 			.mode		=	0644,
          		.proc_handler	=	&proc_dointvec_jiffies,
+			.strategy	=	&sysctl_jiffies,
 		},
 #ifdef CONFIG_IPV6_PRIVACY
 		{
diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
--- a/net/ipv6/ip6_output.c	Thu Jan  8 23:00:23 2004
+++ b/net/ipv6/ip6_output.c	Thu Jan  8 23:00:23 2004
@@ -304,422 +304,6 @@
 	return 0;
 }
 
-static struct ipv6hdr * ip6_bld_1(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
-				  int hlimit, unsigned pktlength)
-{
-	struct ipv6hdr *hdr;
-	
-	skb->nh.raw = skb_put(skb, sizeof(struct ipv6hdr));
-	hdr = skb->nh.ipv6h;
-	
-	*(u32*)hdr = fl->fl6_flowlabel | htonl(0x60000000);
-
-	hdr->payload_len = htons(pktlength - sizeof(struct ipv6hdr));
-	hdr->hop_limit = hlimit;
-	hdr->nexthdr = fl->proto;
-
-	ipv6_addr_copy(&hdr->saddr, &fl->fl6_src);
-	ipv6_addr_copy(&hdr->daddr, &fl->fl6_dst);
-	return hdr;
-}
-
-static __inline__ u8 * ipv6_build_fraghdr(struct sk_buff *skb, u8* prev_hdr, unsigned offset)
-{
-	struct frag_hdr *fhdr;
-
-	fhdr = (struct frag_hdr *) skb_put(skb, sizeof(struct frag_hdr));
-
-	fhdr->nexthdr  = *prev_hdr;
-	*prev_hdr = NEXTHDR_FRAGMENT;
-	prev_hdr = &fhdr->nexthdr;
-
-	fhdr->reserved = 0;
-	fhdr->frag_off = htons(offset);
-	ipv6_select_ident(skb, fhdr);
-	return &fhdr->nexthdr;
-}
-
-static int ip6_frag_xmit(struct sock *sk, inet_getfrag_t getfrag,
-			 const void *data, struct dst_entry *dst,
-			 struct flowi *fl, struct ipv6_txoptions *opt,
-			 struct in6_addr *final_dst,
-			 int hlimit, int flags, unsigned length, int mtu)
-{
-	struct ipv6hdr *hdr;
-	struct sk_buff *last_skb;
-	u8 *prev_hdr;
-	int unfrag_len;
-	int frag_len;
-	int last_len;
-	int nfrags;
-	int fhdr_dist;
-	int frag_off;
-	int data_off;
-	int err;
-
-	/*
-	 *	Fragmentation
-	 *
-	 *	Extension header order:
-	 *	Hop-by-hop -> Dest0 -> Routing -> Fragment -> Auth -> Dest1 -> rest (...)
-	 *	
-	 *	We must build the non-fragmented part that
-	 *	will be in every packet... this also means
-	 *	that other extension headers (Dest, Auth, etc)
-	 *	must be considered in the data to be fragmented
-	 */
-
-	unfrag_len = sizeof(struct ipv6hdr) + sizeof(struct frag_hdr);
-	last_len = length;
-
-	if (opt) {
-		unfrag_len += opt->opt_nflen;
-		last_len += opt->opt_flen;
-	}
-
-	/*
-	 *	Length of fragmented part on every packet but 
-	 *	the last must be an:
-	 *	"integer multiple of 8 octets".
-	 */
-
-	frag_len = (mtu - unfrag_len) & ~0x7;
-
-	/* Unfragmentable part exceeds mtu. */
-	if (frag_len <= 0) {
-		ipv6_local_error(sk, EMSGSIZE, fl, mtu);
-		return -EMSGSIZE;
-	}
-
-	nfrags = last_len / frag_len;
-
-	/*
-	 *	We must send from end to start because of 
-	 *	UDP/ICMP checksums. We do a funny trick:
-	 *	fill the last skb first with the fixed
-	 *	header (and its data) and then use it
-	 *	to create the following segments and send it
-	 *	in the end. If the peer is checking the M_flag
-	 *	to trigger the reassembly code then this 
-	 *	might be a good idea.
-	 */
-
-	frag_off = nfrags * frag_len;
-	last_len -= frag_off;
-
-	if (last_len == 0) {
-		last_len = frag_len;
-		frag_off -= frag_len;
-		nfrags--;
-	}
-	data_off = frag_off;
-
-	/* And it is implementation problem: for now we assume, that
-	   all the exthdrs will fit to the first fragment.
-	 */
-	if (opt) {
-		if (frag_len < opt->opt_flen) {
-			ipv6_local_error(sk, EMSGSIZE, fl, mtu);
-			return -EMSGSIZE;
-		}
-		data_off = frag_off - opt->opt_flen;
-	}
-
-	if (flags&MSG_PROBE)
-		return 0;
-
-	last_skb = sock_alloc_send_skb(sk, unfrag_len + frag_len +
-				       dst->dev->hard_header_len + 15,
-				       flags & MSG_DONTWAIT, &err);
-
-	if (last_skb == NULL)
-		return err;
-
-	last_skb->dst = dst_clone(dst);
-
-	skb_reserve(last_skb, (dst->dev->hard_header_len + 15) & ~15);
-
-	hdr = ip6_bld_1(sk, last_skb, fl, hlimit, frag_len+unfrag_len);
-	prev_hdr = &hdr->nexthdr;
-
-	if (opt && opt->opt_nflen)
-		prev_hdr = ipv6_build_nfrag_opts(last_skb, prev_hdr, opt, final_dst, 0);
-
-	prev_hdr = ipv6_build_fraghdr(last_skb, prev_hdr, frag_off);
-	fhdr_dist = prev_hdr - last_skb->data;
-
-	err = getfrag(data, &hdr->saddr, last_skb->tail, data_off, last_len);
-
-	if (!err) {
-		while (nfrags--) {
-			struct sk_buff *skb;
-			
-			struct frag_hdr *fhdr2;
-				
-			skb = skb_copy(last_skb, sk->sk_allocation);
-
-			if (skb == NULL) {
-				IP6_INC_STATS(Ip6FragFails);
-				kfree_skb(last_skb);
-				return -ENOMEM;
-			}
-
-			frag_off -= frag_len;
-			data_off -= frag_len;
-
-			fhdr2 = (struct frag_hdr *) (skb->data + fhdr_dist);
-
-			/* more flag on */
-			fhdr2->frag_off = htons(frag_off | 1);
-
-			/* Write fragmentable exthdrs to the first chunk */
-			if (nfrags == 0 && opt && opt->opt_flen) {
-				ipv6_build_frag_opts(skb, &fhdr2->nexthdr, opt);
-				frag_len -= opt->opt_flen;
-				data_off = 0;
-			}
-
-			err = getfrag(data, &hdr->saddr,skb_put(skb, frag_len),
-				      data_off, frag_len);
-
-			if (err) {
-				kfree_skb(skb);
-				break;
-			}
-
-			IP6_INC_STATS(Ip6FragCreates);
-			IP6_INC_STATS(Ip6OutRequests);
-			err = NF_HOOK(PF_INET6,NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, ip6_maybe_reroute);
-			if (err) {
-				kfree_skb(last_skb);
-				return err;
-			}
-		}
-	}
-
-	if (err) {
-		IP6_INC_STATS(Ip6FragFails);
-		kfree_skb(last_skb);
-		return -EFAULT;
-	}
-
-	hdr->payload_len = htons(unfrag_len + last_len - sizeof(struct ipv6hdr));
-
-	/*
-	 *	update last_skb to reflect the getfrag we did
-	 *	on start.
-	 */
-
-	skb_put(last_skb, last_len);
-
-	IP6_INC_STATS(Ip6FragCreates);
-	IP6_INC_STATS(Ip6FragOKs);
-	IP6_INC_STATS(Ip6OutRequests);
-	return NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, last_skb, NULL,dst->dev, ip6_maybe_reroute);
-}
-
-int ip6_build_xmit(struct sock *sk, inet_getfrag_t getfrag, const void *data,
-		   struct flowi *fl, unsigned length,
-		   struct ipv6_txoptions *opt, int hlimit, int flags)
-{
-	struct inet_opt *inet = inet_sk(sk);
-	struct ipv6_pinfo *np = inet6_sk(sk);
-	struct in6_addr final_dst_buf, *final_dst = NULL;
-	struct dst_entry *dst;
-	int err = 0;
-	unsigned int pktlength, jumbolen, mtu;
-
-	if (opt && opt->srcrt) {
-		struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
-		ipv6_addr_copy(&final_dst_buf, &fl->fl6_dst);
-		final_dst = &final_dst_buf;
-		ipv6_addr_copy(&fl->fl6_dst, rt0->addr);
-	}
-
-	if (!fl->oif && ipv6_addr_is_multicast(&fl->fl6_dst))
-		fl->oif = np->mcast_oif;
-
-	dst = __sk_dst_check(sk, np->dst_cookie);
-	if (dst) {
-		struct rt6_info *rt = (struct rt6_info*)dst;
-
-			/* Yes, checking route validity in not connected
-			   case is not very simple. Take into account,
-			   that we do not support routing by source, TOS,
-			   and MSG_DONTROUTE 		--ANK (980726)
-
-			   1. If route was host route, check that
-			      cached destination is current.
-			      If it is network route, we still may
-			      check its validity using saved pointer
-			      to the last used address: daddr_cache.
-			      We do not want to save whole address now,
-			      (because main consumer of this service
-			       is tcp, which has not this problem),
-			      so that the last trick works only on connected
-			      sockets.
-			   2. oif also should be the same.
-			 */
-
-		if (((rt->rt6i_dst.plen != 128 ||
-		      ipv6_addr_cmp(&fl->fl6_dst, &rt->rt6i_dst.addr))
-		     && (np->daddr_cache == NULL ||
-			 ipv6_addr_cmp(&fl->fl6_dst, np->daddr_cache)))
-		    || (fl->oif && fl->oif != dst->dev->ifindex)) {
-			dst = NULL;
-		} else
-			dst_hold(dst);
-	}
-
-	if (dst == NULL)
-		dst = ip6_route_output(sk, fl);
-
-	if (dst->error) {
-		IP6_INC_STATS(Ip6OutNoRoutes);
-		dst_release(dst);
-		return -ENETUNREACH;
-	}
-
-	if (ipv6_addr_any(&fl->fl6_src)) {
-		err = ipv6_get_saddr(dst, &fl->fl6_dst, &fl->fl6_src);
-
-		if (err) {
-#if IP6_DEBUG >= 2
-			printk(KERN_DEBUG "ip6_build_xmit: "
-			       "no available source address\n");
-#endif
-			goto out;
-		}
-	}
-	pktlength = length;
-
-        if (dst) {
-		if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) {
-			dst_release(dst);	
-			return -ENETUNREACH;
-		}
-        }
-
-	if (hlimit < 0) {
-		if (ipv6_addr_is_multicast(&fl->fl6_dst))
-			hlimit = np->mcast_hops;
-		else
-			hlimit = np->hop_limit;
-		if (hlimit < 0)
-			hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-	}
-
-	jumbolen = 0;
-
-	if (!inet->hdrincl) {
-		pktlength += sizeof(struct ipv6hdr);
-		if (opt)
-			pktlength += opt->opt_flen + opt->opt_nflen;
-
-		if (pktlength > sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
-			/* Jumbo datagram.
-			   It is assumed, that in the case of hdrincl
-			   jumbo option is supplied by user.
-			 */
-			pktlength += 8;
-			jumbolen = pktlength - sizeof(struct ipv6hdr);
-		}
-	}
-
-	mtu = dst_pmtu(dst);
-	if (np->frag_size < mtu) {
-		if (np->frag_size)
-			mtu = np->frag_size;
-		else if (np->pmtudisc == IPV6_PMTUDISC_DONT)
-			mtu = IPV6_MIN_MTU;
-	}
-
-	/* Critical arithmetic overflow check.
-	   FIXME: may gcc optimize it out? --ANK (980726)
-	 */
-	if (pktlength < length) {
-		ipv6_local_error(sk, EMSGSIZE, fl, mtu);
-		err = -EMSGSIZE;
-		goto out;
-	}
-
-	if (flags&MSG_CONFIRM)
-		dst_confirm(dst);
-
-	if (pktlength <= mtu) {
-		struct sk_buff *skb;
-		struct ipv6hdr *hdr;
-		struct net_device *dev = dst->dev;
-
-		err = 0;
-		if (flags&MSG_PROBE)
-			goto out;
-		/* alloc skb with mtu as we do in the IPv4 stack for IPsec */
-		skb = sock_alloc_send_skb(sk, mtu + LL_RESERVED_SPACE(dev),
-					  flags & MSG_DONTWAIT, &err);
-
-		if (skb == NULL) {
-			IP6_INC_STATS(Ip6OutDiscards);
-			goto out;
-		}
-
-		skb->dst = dst_clone(dst);
-
-		skb_reserve(skb, (dev->hard_header_len + 15) & ~15);
-
-		hdr = (struct ipv6hdr *) skb->tail;
-		skb->nh.ipv6h = hdr;
-
-		if (!inet->hdrincl) {
-			ip6_bld_1(sk, skb, fl, hlimit,
-				  jumbolen ? sizeof(struct ipv6hdr) : pktlength);
-
-			if (opt || jumbolen) {
-				u8 *prev_hdr = &hdr->nexthdr;
-				prev_hdr = ipv6_build_nfrag_opts(skb, prev_hdr, opt, final_dst, jumbolen);
-				if (opt && opt->opt_flen)
-					ipv6_build_frag_opts(skb, prev_hdr, opt);
-			}
-		}
-
-		skb_put(skb, length);
-		err = getfrag(data, &hdr->saddr,
-			      ((char *) hdr) + (pktlength - length),
-			      0, length);
-		if (!opt || !opt->dst1opt)
-			skb->h.raw = ((char *) hdr) + (pktlength - length);
-
-		if (!err) {
-			IP6_INC_STATS(Ip6OutRequests);
-			err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, ip6_maybe_reroute);
-		} else {
-			err = -EFAULT;
-			kfree_skb(skb);
-		}
-	} else {
-		if (inet->hdrincl || jumbolen ||
-		    np->pmtudisc == IPV6_PMTUDISC_DO) {
-			ipv6_local_error(sk, EMSGSIZE, fl, mtu);
-			err = -EMSGSIZE;
-			goto out;
-		}
-
-		err = ip6_frag_xmit(sk, getfrag, data, dst, fl, opt, final_dst, hlimit,
-				    flags, length, mtu);
-	}
-
-	/*
-	 *	cleanup
-	 */
-out:
-	ip6_dst_store(sk, dst,
-		      !ipv6_addr_cmp(&fl->fl6_dst, &np->daddr) ?
-		      &np->daddr : NULL);
-	if (err > 0)
-		err = np->recverr ? net_xmit_errno(err) : 0;
-	return err;
-}
-
 int ip6_call_ra_chain(struct sk_buff *skb, int sel)
 {
 	struct ip6_ra_chain *ra;
@@ -877,6 +461,7 @@
 	to->nfct = from->nfct;
 	nf_conntrack_get(to->nfct);
 #ifdef CONFIG_BRIDGE_NETFILTER
+	nf_bridge_put(to->nf_bridge);
 	to->nf_bridge = from->nf_bridge;
 	nf_bridge_get(to->nf_bridge);
 #endif
diff -Nru a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
--- a/net/ipv6/ip6_tunnel.c	Thu Jan  8 23:00:23 2004
+++ b/net/ipv6/ip6_tunnel.c	Thu Jan  8 23:00:23 2004
@@ -821,6 +821,8 @@
 	else
 		dev->flags &= ~IFF_POINTOPOINT;
 
+	dev->iflink = p->link;
+
 	if (p->flags & IP6_TNL_F_CAP_XMIT) {
 		struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr,
 						 p->link, 0);
@@ -829,8 +831,6 @@
 			return;
 
 		if (rt->rt6i_dev) {
-			dev->iflink = rt->rt6i_dev->ifindex;
-
 			dev->hard_header_len = rt->rt6i_dev->hard_header_len +
 				sizeof (struct ipv6hdr);
 
@@ -1040,7 +1040,6 @@
 	dev->hard_header_len = LL_MAX_HEADER + sizeof (struct ipv6hdr);
 	dev->mtu = ETH_DATA_LEN - sizeof (struct ipv6hdr);
 	dev->flags |= IFF_NOARP;
-	dev->iflink = 0;
 	dev->addr_len = sizeof(struct in6_addr);
 }
 
diff -Nru a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
--- a/net/ipv6/ndisc.c	Thu Jan  8 23:00:24 2004
+++ b/net/ipv6/ndisc.c	Thu Jan  8 23:00:24 2004
@@ -75,6 +75,9 @@
 #include <net/checksum.h>
 #include <linux/proc_fs.h>
 
+#include <linux/netfilter.h>
+#include <linux/netfilter_ipv6.h>
+
 static struct socket *ndisc_socket;
 
 static u32 ndisc_hash(const void *pkey, const struct net_device *dev);
@@ -207,9 +210,8 @@
 		case ND_OPT_MTU:
 		case ND_OPT_REDIRECT_HDR:
 			if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
-				ND_PRINTK2((KERN_WARNING
-					    "ndisc_parse_options(): duplicated ND6 option found: type=%d\n",
-					    nd_opt->nd_opt_type));
+				ND_PRINTK2("ndisc_parse_options(): duplicated ND6 option found: type=%d\n",
+					    nd_opt->nd_opt_type);
 			} else {
 				ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
 			}
@@ -498,10 +500,11 @@
 
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
-	dst_output(skb);
-
-	ICMP6_INC_STATS(idev, Icmp6OutNeighborAdvertisements);
-	ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
+	if (!err) {
+		ICMP6_INC_STATS(idev, Icmp6OutNeighborAdvertisements);
+		ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	}
 
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
@@ -577,10 +580,11 @@
 	/* send it! */
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
-	dst_output(skb);
-
-	ICMP6_INC_STATS(idev, Icmp6OutNeighborSolicits);
-	ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
+	if (!err) {
+		ICMP6_INC_STATS(idev, Icmp6OutNeighborSolicits);
+		ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	}
 
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
@@ -619,6 +623,7 @@
 				  1, &err);
 	if (skb == NULL) {
 		ND_PRINTK1("send_ns: alloc skb failed\n");
+		dst_release(dst);
 		return;
 	}
 
@@ -644,10 +649,11 @@
 	/* send it! */
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
-	dst_output(skb);
-
-	ICMP6_INC_STATS(idev, Icmp6OutRouterSolicits);
-	ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
+	if (!err) {
+		ICMP6_INC_STATS(idev, Icmp6OutRouterSolicits);
+		ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	}
 
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
@@ -1166,9 +1172,7 @@
 				ND_PRINTK0("NDISC: router announcement with mtu = %d\n",
 					   mtu);
 			}
-		}
-
-		if (in6_dev->cnf.mtu6 != mtu) {
+		} else if (in6_dev->cnf.mtu6 != mtu) {
 			in6_dev->cnf.mtu6 = mtu;
 
 			if (rt)
@@ -1406,10 +1410,11 @@
 
 	buff->dst = dst;
 	idev = in6_dev_get(dst->dev);
-	dst_output(buff);
-
-	ICMP6_INC_STATS(idev, Icmp6OutRedirects);
-	ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output);
+	if (!err) {
+		ICMP6_INC_STATS(idev, Icmp6OutRedirects);
+		ICMP6_INC_STATS(idev, Icmp6OutMsgs);
+	}
 
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
diff -Nru a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
--- a/net/irda/ircomm/ircomm_tty.c	Thu Jan  8 23:00:23 2004
+++ b/net/irda/ircomm/ircomm_tty.c	Thu Jan  8 23:00:23 2004
@@ -181,15 +181,15 @@
 static int ircomm_tty_startup(struct ircomm_tty_cb *self)
 {
 	notify_t notify;
-	int ret;
+	int ret = -ENODEV;
 
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
 	ASSERT(self != NULL, return -1;);
 	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
-	/* Already open */
-	if (self->flags & ASYNC_INITIALIZED) {
+	/* Check if already open */
+	if (test_and_set_bit(ASYNC_B_INITIALIZED, &self->flags)) {
 		IRDA_DEBUG(2, "%s(), already open so break out!\n", __FUNCTION__ );
 		return 0;
 	}
@@ -213,7 +213,7 @@
 					   self->line);
 	}
 	if (!self->ircomm)
-		return -ENODEV;
+		goto err;
 
 	self->slsap_sel = self->ircomm->slsap_sel;
 
@@ -221,12 +221,13 @@
 	ret = ircomm_tty_attach_cable(self);
 	if (ret < 0) {
 		ERROR("%s(), error attaching cable!\n", __FUNCTION__);
-		return ret;
+		goto err;
 	}
 
-	self->flags |= ASYNC_INITIALIZED;
-
 	return 0;
+err:
+	clear_bit(ASYNC_B_INITIALIZED, &self->flags);
+	return ret;
 }
 
 /*
@@ -299,7 +300,8 @@
 		
 		current->state = TASK_INTERRUPTIBLE;
 		
-		if (tty_hung_up_p(filp) || !(self->flags & ASYNC_INITIALIZED)){
+		if (tty_hung_up_p(filp) ||
+		    !test_bit(ASYNC_B_INITIALIZED, &self->flags)) {
 			retval = (self->flags & ASYNC_HUP_NOTIFY) ?
 					-EAGAIN : -ERESTARTSYS;
 			break;
@@ -310,7 +312,7 @@
 		 * specified, we cannot return before the IrCOMM link is
 		 * ready 
 		 */
- 		if (!(self->flags & ASYNC_CLOSING) &&
+ 		if (!test_bit(ASYNC_B_CLOSING, &self->flags) &&
  		    (do_clocal || (self->settings.dce & IRCOMM_CD)) &&
 		    self->state == IRCOMM_TTY_READY)
 		{
@@ -425,7 +427,7 @@
 	 * If the port is the middle of closing, bail out now
 	 */
 	if (tty_hung_up_p(filp) ||
-	    (self->flags & ASYNC_CLOSING)) {
+	    test_bit(ASYNC_B_CLOSING, &self->flags)) {
 
 		/* Hm, why are we blocking on ASYNC_CLOSING if we
 		 * do return -EAGAIN/-ERESTARTSYS below anyway?
@@ -435,7 +437,7 @@
 		 * probably better sleep uninterruptible?
 		 */
 
-		if (wait_event_interruptible(self->close_wait, !(self->flags&ASYNC_CLOSING))) {
+		if (wait_event_interruptible(self->close_wait, !test_bit(ASYNC_B_CLOSING, &self->flags))) {
 			WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n",
 				__FUNCTION__);
 			return -ERESTARTSYS;
@@ -530,11 +532,13 @@
 		IRDA_DEBUG(0, "%s(), open count > 0\n", __FUNCTION__ );
 		return;
 	}
-	self->flags |= ASYNC_CLOSING;
+
+	/* Hum... Should be test_and_set_bit ??? - Jean II */
+	set_bit(ASYNC_B_CLOSING, &self->flags);
 
 	/* We need to unlock here (we were unlocking at the end of this
 	 * function), because tty_wait_until_sent() may schedule.
-	 * I don't know if the rest should be locked somehow,
+	 * I don't know if the rest should be protected somehow,
 	 * so someone should check. - Jean II */
 	spin_unlock_irqrestore(&self->spinlock, flags);
 
@@ -978,10 +982,12 @@
 	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
 	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
-	
-	if (!(self->flags & ASYNC_INITIALIZED))
+
+	if (!test_and_clear_bit(ASYNC_B_INITIALIZED, &self->flags))
 		return;
 
+	ircomm_tty_detach_cable(self);
+
 	spin_lock_irqsave(&self->spinlock, flags);
 
 	del_timer(&self->watchdog_timer);
@@ -998,13 +1004,10 @@
 		self->tx_skb = NULL;
 	}
 
-	ircomm_tty_detach_cable(self);
-
 	if (self->ircomm) {
 		ircomm_close(self->ircomm);
 		self->ircomm = NULL;
 	}
-	self->flags &= ~ASYNC_INITIALIZED;
 
 	spin_unlock_irqrestore(&self->spinlock, flags);
 }
diff -Nru a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
--- a/net/netrom/af_netrom.c	Thu Jan  8 23:00:24 2004
+++ b/net/netrom/af_netrom.c	Thu Jan  8 23:00:24 2004
@@ -532,7 +532,7 @@
 		sk->sk_state    = TCP_CLOSE;
 		sk->sk_shutdown |= SEND_SHUTDOWN;
 		sk->sk_state_change(sk);
-		sock_set_flag(sk, SOCK_DEAD);
+		sock_orphan(sk);
 		sock_set_flag(sk, SOCK_DESTROY);
 		sk->sk_socket   = NULL;
 		break;
@@ -727,6 +727,8 @@
 				lock_sock(sk);
 				continue;
 			}
+			current->state = TASK_RUNNING;
+			remove_wait_queue(sk->sk_sleep, &wait);
 			return -ERESTARTSYS;
 		}
 		current->state = TASK_RUNNING;
@@ -780,13 +782,18 @@
 
 		current->state = TASK_INTERRUPTIBLE;
 		release_sock(sk);
-		if (flags & O_NONBLOCK)
+		if (flags & O_NONBLOCK) {
+			current->state = TASK_RUNNING;
+			remove_wait_queue(sk->sk_sleep, &wait);
 			return -EWOULDBLOCK;
+		}
 		if (!signal_pending(tsk)) {
 			schedule();
 			lock_sock(sk);
 			continue;
 		}
+		current->state = TASK_RUNNING;
+		remove_wait_queue(sk->sk_sleep, &wait);
 		return -ERESTARTSYS;
 	}
 	current->state = TASK_RUNNING;
@@ -1377,7 +1384,7 @@
 {
 	int i;
 
-	if (nr_ndevs > 0x7fffffff/sizeof(struct net_device)) {
+	if (nr_ndevs > 0x7fffffff/sizeof(struct net_device *)) {
 		printk(KERN_ERR "NET/ROM: nr_proto_init - nr_ndevs parameter to large\n");
 		return -1;
 	}
@@ -1405,6 +1412,7 @@
 		dev->base_addr = i;
 		if (register_netdev(dev)) {
 			printk(KERN_ERR "NET/ROM: nr_proto_init - unable to register network device\n");
+			free_netdev(dev);
 			goto fail;
 		}
 		dev_nr[i] = dev;
@@ -1433,8 +1441,10 @@
 	return 0;
 
  fail:
-	while (--i >= 0)
+	while (--i >= 0) {
 		unregister_netdev(dev_nr[i]);
+		free_netdev(dev_nr[i]);
+	}
 	kfree(dev_nr);
 	return -1;
 }
@@ -1474,8 +1484,10 @@
 
 	for (i = 0; i < nr_ndevs; i++) {
 		struct net_device *dev = dev_nr[i];
-		if (dev) 
+		if (dev) {
 			unregister_netdev(dev);
+			free_netdev(dev);
+		}
 	}
 
 	kfree(dev_nr);
diff -Nru a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c
--- a/net/netrom/nr_dev.c	Thu Jan  8 23:00:24 2004
+++ b/net/netrom/nr_dev.c	Thu Jan  8 23:00:24 2004
@@ -204,7 +204,6 @@
 	dev->hard_start_xmit	= nr_xmit;
 	dev->open		= nr_open;
 	dev->stop		= nr_close;
-	dev->destructor		= free_netdev;
 
 	dev->hard_header	= nr_header;
 	dev->hard_header_len	= NR_NETWORK_LEN + NR_TRANSPORT_LEN;
diff -Nru a/net/packet/af_packet.c b/net/packet/af_packet.c
--- a/net/packet/af_packet.c	Thu Jan  8 23:00:24 2004
+++ b/net/packet/af_packet.c	Thu Jan  8 23:00:24 2004
@@ -64,6 +64,7 @@
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/poll.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -246,6 +247,10 @@
 	if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
 		goto oom;
 
+	/* drop any routing info */
+	dst_release(skb->dst);
+	skb->dst = NULL;
+
 	spkt = (struct sockaddr_pkt*)skb->cb;
 
 	skb_push(skb, skb->data-skb->mac.raw);
@@ -486,6 +491,9 @@
 
 	skb_set_owner_r(skb, sk);
 	skb->dev = NULL;
+	dst_release(skb->dst);
+	skb->dst = NULL;
+
 	spin_lock(&sk->sk_receive_queue.lock);
 	po->stats.tp_packets++;
 	__skb_queue_tail(&sk->sk_receive_queue, skb);
@@ -1760,61 +1768,86 @@
 };
 
 #ifdef CONFIG_PROC_FS
-static int packet_read_proc(char *buffer, char **start, off_t offset,
-			     int length, int *eof, void *data)
+static inline struct sock *packet_seq_idx(loff_t off)
 {
-	off_t pos=0;
-	off_t begin=0;
-	int len=0;
 	struct sock *s;
 	struct hlist_node *node;
-	
-	len+= sprintf(buffer,"sk       RefCnt Type Proto  Iface R Rmem   User   Inode\n");
 
+	sk_for_each(s, node, &packet_sklist) {
+		if (!off--)
+			return s;
+	}
+	return NULL;
+}
+
+static void *packet_seq_start(struct seq_file *seq, loff_t *pos)
+{
 	read_lock(&packet_sklist_lock);
+	return *pos ? packet_seq_idx(*pos - 1) : SEQ_START_TOKEN;
+}
 
-	sk_for_each(s, node, &packet_sklist) {
-		struct packet_opt *po = pkt_sk(s);
+static void *packet_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	++*pos;
+	return  (v == SEQ_START_TOKEN) 
+		? sk_head(&packet_sklist) 
+		: sk_next((struct sock*)v) ;
+}
 
-		len+=sprintf(buffer+len,"%p %-6d %-4d %04x   %-5d %1d %-6u %-6u %-6lu",
-			     s,
-			     atomic_read(&s->sk_refcnt),
-			     s->sk_type,
-			     ntohs(po->num),
-			     po->ifindex,
-			     po->running,
-			     atomic_read(&s->sk_rmem_alloc),
-			     sock_i_uid(s),
-			     sock_i_ino(s)
-			     );
+static void packet_seq_stop(struct seq_file *seq, void *v)
+{
+	read_unlock(&packet_sklist_lock);		
+}
 
-		buffer[len++]='\n';
-		
-		pos=begin+len;
-		if(pos<offset) {
-			len=0;
-			begin=pos;
-		}
-		if(pos>offset+length)
-			goto done;
+static int packet_seq_show(struct seq_file *seq, void *v) 
+{
+	if (v == SEQ_START_TOKEN)
+		seq_puts(seq, "sk       RefCnt Type Proto  Iface R Rmem   User   Inode\n");
+	else {
+		struct sock *s = v;
+		const struct packet_opt *po = pkt_sk(s);
+
+		seq_printf(seq,
+			   "%p %-6d %-4d %04x   %-5d %1d %-6u %-6u %-6lu\n",
+			   s,
+			   atomic_read(&s->sk_refcnt),
+			   s->sk_type,
+			   ntohs(po->num),
+			   po->ifindex,
+			   po->running,
+			   atomic_read(&s->sk_rmem_alloc),
+			   sock_i_uid(s),
+			   sock_i_ino(s) );
 	}
-	*eof = 1;
 
-done:
-	read_unlock(&packet_sklist_lock);
-	*start=buffer+(offset-begin);
-	len-=(offset-begin);
-	if(len>length)
-		len=length;
-	if(len<0)
-		len=0;
-	return len;
+	return 0;
+}
+
+static struct seq_operations packet_seq_ops = {
+	.start	= packet_seq_start,
+	.next	= packet_seq_next,
+	.stop	= packet_seq_stop,
+	.show	= packet_seq_show,
+};
+
+static int packet_seq_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &packet_seq_ops);
 }
+
+static struct file_operations packet_seq_fops = {
+	.owner		= THIS_MODULE,
+	.open		= packet_seq_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
+};
+
 #endif
 
 static void __exit packet_exit(void)
 {
-	remove_proc_entry("net/packet", 0);
+	proc_net_remove("packet");
 	unregister_netdevice_notifier(&packet_netdev_notifier);
 	sock_unregister(PF_PACKET);
 	return;
@@ -1824,9 +1857,8 @@
 {
 	sock_register(&packet_family_ops);
 	register_netdevice_notifier(&packet_netdev_notifier);
-#ifdef CONFIG_PROC_FS
-	create_proc_read_entry("net/packet", 0, 0, packet_read_proc, NULL);
-#endif
+	proc_net_fops_create("packet", 0, &packet_seq_fops);
+
 	return 0;
 }
 
diff -Nru a/net/rose/af_rose.c b/net/rose/af_rose.c
--- a/net/rose/af_rose.c	Thu Jan  8 23:00:24 2004
+++ b/net/rose/af_rose.c	Thu Jan  8 23:00:24 2004
@@ -359,7 +359,7 @@
 		sk->sk_timer.data     = (unsigned long)sk;
 		add_timer(&sk->sk_timer);
 	} else
-		sk_free(sk);
+		sock_put(sk);
 }
 
 /*
@@ -634,7 +634,6 @@
 	}
 
 	sock->sk = NULL;
-	sk->sk_socket = NULL;	/* Not used, but we should do this. **/
 
 	return 0;
 }
@@ -813,6 +812,8 @@
 				schedule();
 				continue;
 			}
+			current->state = TASK_RUNNING;
+			remove_wait_queue(sk->sk_sleep, &wait);
 			return -ERESTARTSYS;
 		}
 		current->state = TASK_RUNNING;
@@ -864,8 +865,11 @@
 
 		current->state = TASK_INTERRUPTIBLE;
 		release_sock(sk);
-		if (flags & O_NONBLOCK)
+		if (flags & O_NONBLOCK) {
+			current->state = TASK_RUNNING;
+			remove_wait_queue(sk->sk_sleep, &wait);
 			return -EWOULDBLOCK;
+		}
 		if (!signal_pending(tsk)) {
 			schedule();
 			lock_sock(sk);
@@ -1482,7 +1486,7 @@
 
 	rose_callsign = null_ax25_address;
 
-	if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device)) {
+	if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device *)) {
 		printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter to large\n");
 		return -1;
 	}
@@ -1503,23 +1507,14 @@
 				   name, rose_setup);
 		if (!dev) {
 			printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate memory\n");
-			while (--i >= 0)
-				kfree(dev_rose[i]);
-			return -ENOMEM;
+			goto fail;
 		}
-		dev_rose[i] = dev;
-	}
-
-	for (i = 0; i < rose_ndevs; i++) {
-		if (register_netdev(dev_rose[i])) {
+		if (register_netdev(dev)) {
 			printk(KERN_ERR "ROSE: netdevice regeistration failed\n");
-			while (--i >= 0) {
-				unregister_netdev(dev_rose[i]);
-				kfree(dev_rose[i]);
-				return -EIO;
-			}
+			free_netdev(dev);
+			goto fail;
 		}
-			
+		dev_rose[i] = dev;
 	}
 
 	sock_register(&rose_family_ops);
@@ -1542,6 +1537,13 @@
 	proc_net_fops_create("rose_routes", S_IRUGO, &rose_routes_fops);
 
 	return 0;
+fail:
+	while (--i >= 0) {
+		unregister_netdev(dev_rose[i]);
+		free_netdev(dev_rose[i]);
+	}
+	kfree(dev_rose);
+	return -ENOMEM;
 }
 module_init(rose_proto_init);
 
diff -Nru a/net/sched/cls_api.c b/net/sched/cls_api.c
--- a/net/sched/cls_api.c	Thu Jan  8 23:00:23 2004
+++ b/net/sched/cls_api.c	Thu Jan  8 23:00:23 2004
@@ -247,10 +247,7 @@
 			*back = tp->next;
 			spin_unlock_bh(&dev->queue_lock);
 			write_unlock(&qdisc_tree_lock);
-
-			tp->ops->destroy(tp);
-			module_put(tp->ops->owner);
-			kfree(tp);
+			tcf_destroy(tp);
 			err = 0;
 			goto errout;
 		}
diff -Nru a/net/sched/sch_atm.c b/net/sched/sch_atm.c
--- a/net/sched/sch_atm.c	Thu Jan  8 23:00:24 2004
+++ b/net/sched/sch_atm.c	Thu Jan  8 23:00:24 2004
@@ -162,7 +162,7 @@
 	while ((filter = flow->filter_list)) {
 		DPRINTK("destroy_filters: destroying filter %p\n",filter);
 		flow->filter_list = filter->next;
-		filter->ops->destroy(filter);
+		tcf_destroy(filter);
 	}
 }
 
diff -Nru a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
--- a/net/sched/sch_cbq.c	Thu Jan  8 23:00:23 2004
+++ b/net/sched/sch_cbq.c	Thu Jan  8 23:00:23 2004
@@ -1705,7 +1705,7 @@
 
 	while ((tp = cl->filter_list) != NULL) {
 		cl->filter_list = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 }
 
diff -Nru a/net/sched/sch_csz.c b/net/sched/sch_csz.c
--- a/net/sched/sch_csz.c	Thu Jan  8 23:00:24 2004
+++ b/net/sched/sch_csz.c	Thu Jan  8 23:00:24 2004
@@ -752,7 +752,7 @@
 
 	while ((tp = q->filter_list) != NULL) {
 		q->filter_list = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 }
 
diff -Nru a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
--- a/net/sched/sch_dsmark.c	Thu Jan  8 23:00:23 2004
+++ b/net/sched/sch_dsmark.c	Thu Jan  8 23:00:23 2004
@@ -378,7 +378,7 @@
 	while (p->filter_list) {
 		tp = p->filter_list;
 		p->filter_list = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 	qdisc_destroy(p->q);
 	p->q = &noop_qdisc;
diff -Nru a/net/sched/sch_htb.c b/net/sched/sch_htb.c
--- a/net/sched/sch_htb.c	Thu Jan  8 23:00:24 2004
+++ b/net/sched/sch_htb.c	Thu Jan  8 23:00:24 2004
@@ -74,7 +74,7 @@
 #define HTB_HYSTERESIS 1/* whether to use mode hysteresis for speedup */
 #define HTB_QLOCK(S) spin_lock_bh(&(S)->dev->queue_lock)
 #define HTB_QUNLOCK(S) spin_unlock_bh(&(S)->dev->queue_lock)
-#define HTB_VER 0x3000e	/* major must be matched with number suplied by TC as version */
+#define HTB_VER 0x3000f	/* major must be matched with number suplied by TC as version */
 
 #if HTB_VER >> 16 != TC_HTB_PROTOVER
 #error "Mismatched sch_htb.c and pkt_sch.h"
@@ -308,7 +308,7 @@
 	   rules in it */
 	if (skb->priority == sch->handle)
 		return HTB_DIRECT;  /* X:0 (direct flow) selected */
-	if ((cl = htb_find(skb->priority,sch)) != NULL) 
+	if ((cl = htb_find(skb->priority,sch)) != NULL && cl->level == 0) 
 		return cl;
 
 	tcf = q->filter_list;
@@ -1338,7 +1338,7 @@
 
 	while ((tp = *fl) != NULL) {
 		*fl = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 }
 
diff -Nru a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c
--- a/net/sched/sch_ingress.c	Thu Jan  8 23:00:24 2004
+++ b/net/sched/sch_ingress.c	Thu Jan  8 23:00:24 2004
@@ -292,7 +292,7 @@
 	while (p->filter_list) {
 		tp = p->filter_list;
 		p->filter_list = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 	memset(p, 0, sizeof(*p));
 	p->filter_list = NULL;
diff -Nru a/net/sched/sch_prio.c b/net/sched/sch_prio.c
--- a/net/sched/sch_prio.c	Thu Jan  8 23:00:23 2004
+++ b/net/sched/sch_prio.c	Thu Jan  8 23:00:23 2004
@@ -162,7 +162,7 @@
 
 	while ((tp = q->filter_list) != NULL) {
 		q->filter_list = tp->next;
-		tp->ops->destroy(tp);
+		tcf_destroy(tp);
 	}
 
 	for (prio=0; prio<q->bands; prio++) {
diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
--- a/net/sched/sch_tbf.c	Thu Jan  8 23:00:23 2004
+++ b/net/sched/sch_tbf.c	Thu Jan  8 23:00:23 2004
@@ -108,6 +108,10 @@
 	Note that the peak rate TBF is much more tough: with MTU 1500
 	P_crit = 150Kbytes/sec. So, if you need greater peak
 	rates, use alpha with HZ=1000 :-)
+
+	With classful TBF, limit is just kept for backwards compatibility.
+	It is passed to the default bfifo qdisc - if the inner qdisc is
+	changed the limit is not effective anymore.
 */
 
 struct tbf_sched_data
@@ -136,7 +140,7 @@
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
 	int ret;
 
-	if (skb->len > q->max_size || sch->stats.backlog + skb->len > q->limit) {
+	if (skb->len > q->max_size) {
 		sch->stats.drops++;
 #ifdef CONFIG_NET_CLS_POLICE
 		if (sch->reshape_fail == NULL || sch->reshape_fail(skb, sch))
@@ -152,7 +156,6 @@
 	}	
 	
 	sch->q.qlen++;
-	sch->stats.backlog += skb->len;
 	sch->stats.bytes += skb->len;
 	sch->stats.packets++;
 	return 0;
@@ -163,10 +166,8 @@
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
 	int ret;
 	
-	if ((ret = q->qdisc->ops->requeue(skb, q->qdisc)) == 0) {
+	if ((ret = q->qdisc->ops->requeue(skb, q->qdisc)) == 0)
 		sch->q.qlen++; 
-		sch->stats.backlog += skb->len;
-	}
 	
 	return ret;
 }
@@ -178,7 +179,6 @@
 	
 	if ((len = q->qdisc->ops->drop(q->qdisc)) != 0) {
 		sch->q.qlen--;
-		sch->stats.backlog -= len;
 		sch->stats.drops++;
 	}
 	return len;
@@ -224,7 +224,6 @@
 			q->t_c = now;
 			q->tokens = toks;
 			q->ptokens = ptoks;
-			sch->stats.backlog -= len;
 			sch->q.qlen--;
 			sch->flags &= ~TCQ_F_THROTTLED;
 			return skb;
@@ -253,7 +252,6 @@
 		if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) {
 			/* When requeue fails skb is dropped */ 
 			sch->q.qlen--;
-			sch->stats.backlog -= len;
 			sch->stats.drops++;
 		}	
 		
@@ -269,7 +267,6 @@
 
 	qdisc_reset(q->qdisc);
 	sch->q.qlen = 0;
-	sch->stats.backlog = 0;
 	PSCHED_GET_TIME(q->t_c);
 	q->tokens = q->buffer;
 	q->ptokens = q->mtu;
@@ -456,7 +453,6 @@
 	*old = xchg(&q->qdisc, new);
 	qdisc_reset(*old);
 	sch->q.qlen = 0;
-	sch->stats.backlog = 0;
 	sch_tree_unlock(sch);
 	
 	return 0;
diff -Nru a/net/sctp/associola.c b/net/sctp/associola.c
--- a/net/sctp/associola.c	Thu Jan  8 23:00:23 2004
+++ b/net/sctp/associola.c	Thu Jan  8 23:00:23 2004
@@ -58,6 +58,7 @@
 #include <linux/in.h>
 #include <net/ipv6.h>
 #include <net/sctp/sctp.h>
+#include <net/sctp/sm.h>
 
 /* Forward declarations for internal functions. */
 static void sctp_assoc_bh_rcv(struct sctp_association *asoc);
diff -Nru a/net/sctp/outqueue.c b/net/sctp/outqueue.c
--- a/net/sctp/outqueue.c	Thu Jan  8 23:00:23 2004
+++ b/net/sctp/outqueue.c	Thu Jan  8 23:00:23 2004
@@ -53,6 +53,7 @@
 #include <net/sock.h>	  /* For skb_set_owner_w */
 
 #include <net/sctp/sctp.h>
+#include <net/sctp/sm.h>
 
 /* Declare internal functions here.  */
 static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn);
diff -Nru a/net/sctp/socket.c b/net/sctp/socket.c
--- a/net/sctp/socket.c	Thu Jan  8 23:00:24 2004
+++ b/net/sctp/socket.c	Thu Jan  8 23:00:24 2004
@@ -77,6 +77,7 @@
 #include <linux/socket.h> /* for sa_family_t */
 #include <net/sock.h>
 #include <net/sctp/sctp.h>
+#include <net/sctp/sm.h>
 
 /* WARNING:  Please do not remove the SCTP_STATIC attribute to
  * any of the functions below as they are used to export functions
diff -Nru a/net/sctp/transport.c b/net/sctp/transport.c
--- a/net/sctp/transport.c	Thu Jan  8 23:00:23 2004
+++ b/net/sctp/transport.c	Thu Jan  8 23:00:23 2004
@@ -50,6 +50,7 @@
 
 #include <linux/types.h>
 #include <net/sctp/sctp.h>
+#include <net/sctp/sm.h>
 
 /* 1st Level Abstractions.  */
 
diff -Nru a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
--- a/net/xfrm/xfrm_policy.c	Thu Jan  8 23:00:24 2004
+++ b/net/xfrm/xfrm_policy.c	Thu Jan  8 23:00:24 2004
@@ -19,6 +19,8 @@
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
+#include <linux/notifier.h>
+#include <linux/netdevice.h>
 #include <net/xfrm.h>
 #include <net/ip.h>
 
@@ -690,6 +692,8 @@
 	};
 }
 
+static int stale_bundle(struct dst_entry *dst);
+
 /* Main function: finds/creates a bundle for given flow.
  *
  * At the moment we eat a raw IP route. Mostly to speed up lookups
@@ -814,10 +818,11 @@
 		}
 
 		write_lock_bh(&policy->lock);
-		if (unlikely(policy->dead)) {
+		if (unlikely(policy->dead || stale_bundle(dst))) {
 			/* Wow! While we worked on resolving, this
 			 * policy has gone. Retry. It is not paranoia,
 			 * we just cannot enlist new bundle to dead object.
+			 * We can't enlist stable bundles either.
 			 */
 			write_unlock_bh(&policy->lock);
 
@@ -985,18 +990,27 @@
 
 static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
 {
+	if (!stale_bundle(dst))
+		return dst;
+
+	dst_release(dst);
+	return NULL;
+}
+
+static int stale_bundle(struct dst_entry *dst)
+{
 	struct dst_entry *child = dst;
 
 	while (child) {
 		if (child->obsolete > 0 ||
+		    (child->dev && !netif_running(child->dev)) ||
 		    (child->xfrm && child->xfrm->km.state != XFRM_STATE_VALID)) {
-			dst_release(dst);
-			return NULL;
+			return 1;
 		}
 		child = child->child;
 	}
 
-	return dst;
+	return 0;
 }
 
 static void xfrm_dst_destroy(struct dst_entry *dst)
@@ -1022,7 +1036,7 @@
 	return dst;
 }
 
-static void __xfrm_garbage_collect(void)
+static void xfrm_prune_bundles(int (*func)(struct dst_entry *))
 {
 	int i;
 	struct xfrm_policy *pol;
@@ -1034,7 +1048,7 @@
 			write_lock(&pol->lock);
 			dstp = &pol->bundles;
 			while ((dst=*dstp) != NULL) {
-				if (atomic_read(&dst->__refcnt) == 0) {
+				if (func(dst)) {
 					*dstp = dst->next;
 					dst->next = gc_list;
 					gc_list = dst;
@@ -1054,46 +1068,19 @@
 	}
 }
 
-static int bundle_depends_on(struct dst_entry *dst, struct xfrm_state *x)
+static int unused_bundle(struct dst_entry *dst)
 {
-	do {
-		if (dst->xfrm == x)
-			return 1;
-	} while ((dst = dst->child) != NULL);
-	return 0;
+	return !atomic_read(&dst->__refcnt);
 }
 
-int xfrm_flush_bundles(struct xfrm_state *x)
+static void __xfrm_garbage_collect(void)
 {
-	int i;
-	struct xfrm_policy *pol;
-	struct dst_entry *dst, **dstp, *gc_list = NULL;
-
-	read_lock_bh(&xfrm_policy_lock);
-	for (i=0; i<2*XFRM_POLICY_MAX; i++) {
-		for (pol = xfrm_policy_list[i]; pol; pol = pol->next) {
-			write_lock(&pol->lock);
-			dstp = &pol->bundles;
-			while ((dst=*dstp) != NULL) {
-				if (bundle_depends_on(dst, x)) {
-					*dstp = dst->next;
-					dst->next = gc_list;
-					gc_list = dst;
-				} else {
-					dstp = &dst->next;
-				}
-			}
-			write_unlock(&pol->lock);
-		}
-	}
-	read_unlock_bh(&xfrm_policy_lock);
-
-	while (gc_list) {
-		dst = gc_list;
-		gc_list = dst->next;
-		dst_free(dst);
-	}
+	xfrm_prune_bundles(unused_bundle);
+}
 
+int xfrm_flush_bundles(void)
+{
+	xfrm_prune_bundles(stale_bundle);
 	return 0;
 }
 
@@ -1216,6 +1203,21 @@
 	read_unlock(&afinfo->lock);
 }
 
+static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void *ptr)
+{
+	switch (event) {
+	case NETDEV_DOWN:
+		xfrm_flush_bundles();
+	}
+	return NOTIFY_DONE;
+}
+
+struct notifier_block xfrm_dev_notifier = {
+	xfrm_dev_event,
+	NULL,
+	0
+};
+
 void __init xfrm_policy_init(void)
 {
 	xfrm_dst_cache = kmem_cache_create("xfrm_dst_cache",
@@ -1226,6 +1228,7 @@
 		panic("XFRM: failed to allocate xfrm_dst_cache\n");
 
 	INIT_WORK(&xfrm_policy_gc_work, xfrm_policy_gc_task, NULL);
+	register_netdevice_notifier(&xfrm_dev_notifier);
 }
 
 void __init xfrm_init(void)
diff -Nru a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
--- a/net/xfrm/xfrm_state.c	Thu Jan  8 23:00:24 2004
+++ b/net/xfrm/xfrm_state.c	Thu Jan  8 23:00:24 2004
@@ -219,7 +219,7 @@
 		 * there are DSTs attached to this xfrm_state.
 		 */
 		if (atomic_read(&x->refcnt) > 2)
-			xfrm_flush_bundles(x);
+			xfrm_flush_bundles();
 
 		/* All xfrm_state objects are created by one of two possible
 		 * paths:
diff -Nru a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
--- a/scripts/kconfig/conf.c	Thu Jan  8 23:00:24 2004
+++ b/scripts/kconfig/conf.c	Thu Jan  8 23:00:24 2004
@@ -175,7 +175,7 @@
 			break;
 		case '?':
 			/* print help */
-			if (line[1] == 0) {
+			if (line[1] == '\n') {
 				help = nohelp_text;
 				if (menu->sym->help)
 					help = menu->sym->help;
@@ -575,6 +575,9 @@
 		conf_cnt = 0;
 		check_conf(&rootmenu);
 	} while (conf_cnt);
-	conf_write(NULL);
+	if (conf_write(NULL)) {
+		fprintf(stderr, "\n*** Error during writing of the kernel configuration.\n\n");
+		return 1;
+	}
 	return 0;
 }
diff -Nru a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
--- a/scripts/kconfig/gconf.c	Thu Jan  8 23:00:24 2004
+++ b/scripts/kconfig/gconf.c	Thu Jan  8 23:00:24 2004
@@ -1,7 +1,7 @@
 /* Hey EMACS -*- linux-c -*- */
 /*
  *
- * Copyright (C) 2002-2003 Romain Lievin <roms@lpg.ticalc.org>
+ * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info>
  * Released under the terms of the GNU GPL v2.0.
  *
  */
@@ -1046,7 +1046,8 @@
 	if (path == NULL)
 		return FALSE;
 
-	gtk_tree_model_get_iter(model2, &iter, path);
+	if (!gtk_tree_model_get_iter(model2, &iter, path))
+		return FALSE;
 	gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
 
 	col = column2index(column);
@@ -1172,7 +1173,7 @@
 
 	gtk_widget_realize(tree2_w);
 	gtk_tree_view_set_cursor(view, path, NULL, FALSE);
-	gtk_widget_grab_focus(GTK_TREE_VIEW(tree2_w));
+	gtk_widget_grab_focus(tree2_w);
 
 	return FALSE;
 }
@@ -1401,7 +1402,6 @@
 	struct symbol *sym;
 	struct property *prop;
 	struct menu *menu1, *menu2;
-	static GtkTreePath *path = NULL;
 
 	if (src == &rootmenu)
 		indent = 1;
@@ -1526,8 +1526,8 @@
 		if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT)) ||
 		    (view_mode == FULL_VIEW)
 		    || (view_mode == SPLIT_VIEW))*/
-		if ((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT) 
-		|| (view_mode == FULL_VIEW) || (view_mode == SPLIT_VIEW)) {
+		if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT))
+		    || (view_mode == FULL_VIEW) || (view_mode == SPLIT_VIEW)) {
 			indent++;
 			display_tree(child);
 			indent--;
@@ -1582,7 +1582,7 @@
 int main(int ac, char *av[])
 {
 	const char *name;
-	gchar *cur_dir, *exe_path;
+	char *env;
 	gchar *glade_file;
 
 #ifndef LKC_DIRECT_LINK
@@ -1598,12 +1598,13 @@
 	//add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");
 
 	/* Determine GUI path */
-	cur_dir = g_get_current_dir();
-	exe_path = g_strdup(av[0]);
-	exe_path[0] = '/';
-	glade_file = g_strconcat(cur_dir, exe_path, ".glade", NULL);
-	g_free(cur_dir);
-	g_free(exe_path);
+	env = getenv(SRCTREE);
+	if (env)
+		glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL);
+	else if (av[0][0] == '/')
+		glade_file = g_strconcat(av[0], ".glade", NULL);
+	else
+		glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL);
 
 	/* Load the interface and connect signals */
 	init_main_window(glade_file);
diff -Nru a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
--- a/scripts/kconfig/mconf.c	Thu Jan  8 23:00:23 2004
+++ b/scripts/kconfig/mconf.c	Thu Jan  8 23:00:23 2004
@@ -785,15 +785,23 @@
 	} while (stat < 0);
 
 	if (stat == 0) {
-		conf_write(NULL);
+		if (conf_write(NULL)) {
+			fprintf(stderr, "\n\n"
+				"Error during writing of the kernel configuration.\n"
+				"Your kernel configuration changes were NOT saved."
+				"\n\n");
+			return 1;
+		}
 		printf("\n\n"
 			"*** End of Linux kernel configuration.\n"
 			"*** Execute 'make' to build the kernel or try 'make help'."
 			"\n\n");
-	} else
-		printf("\n\n"
+	} else {
+		fprintf(stderr, "\n\n"
 			"Your kernel configuration changes were NOT saved."
 			"\n\n");
+		return 1;
+	}
 
 	return 0;
 }
diff -Nru a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
--- a/scripts/kconfig/qconf.cc	Thu Jan  8 23:00:23 2004
+++ b/scripts/kconfig/qconf.cc	Thu Jan  8 23:00:23 2004
@@ -409,7 +409,7 @@
 			item = new ConfigItem(this, 0, true);
 		last = item;
 	}
-	if ((mode == singleMode || mode == symbolMode) &&
+	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
 	    rootEntry->sym && rootEntry->prompt) {
 		item = last ? last->nextSibling() : firstChild();
 		if (!item)
diff -Nru a/scripts/mkspec b/scripts/mkspec
--- a/scripts/mkspec	Thu Jan  8 23:00:23 2004
+++ b/scripts/mkspec	Thu Jan  8 23:00:23 2004
@@ -9,7 +9,7 @@
 #	Patched for non-x86 by Opencon (L) 2002 <opencon@rio.skydome.net>
 #
 # That's the voodoo to see if it's a x86.
-ISX86=`arch | grep -ie i.86`
+ISX86=`echo ${ARCH:=\`arch\`} | grep -ie i.86`
 if [ ! -z $ISX86 ]; then
 	PC=1
 else
diff -Nru a/scripts/modpost.c b/scripts/modpost.c
--- a/scripts/modpost.c	Thu Jan  8 23:00:23 2004
+++ b/scripts/modpost.c	Thu Jan  8 23:00:23 2004
@@ -324,6 +324,19 @@
 	}
 }
 
+int
+is_vmlinux(const char *modname)
+{
+	const char *myname;
+
+	if ((myname = strrchr(modname, '/')))
+		myname++;
+	else
+		myname = modname;
+
+	return strcmp(myname, "vmlinux") == 0;
+}
+
 void
 read_symbols(char *modname)
 {
@@ -335,8 +348,7 @@
 
 	/* When there's no vmlinux, don't print warnings about
 	 * unresolved symbols (since there'll be too many ;) */
-	if (strcmp(modname, "vmlinux") == 0)
-		have_vmlinux = 1;
+	have_vmlinux = is_vmlinux(modname);
 
 	parse_elf(&info, modname);
 
@@ -460,10 +472,7 @@
 	int first = 1;
 
 	for (m = modules; m; m = m->next) {
-		if (strcmp(m->name, "vmlinux") == 0)
-			m->seen = 1;
-		else 
-			m->seen = 0;
+		m->seen = is_vmlinux(m->name);
 	}
 
 	buf_printf(b, "\n");
@@ -543,7 +552,7 @@
 	}
 
 	for (mod = modules; mod; mod = mod->next) {
-		if (strcmp(mod->name, "vmlinux") == 0)
+		if (is_vmlinux(mod->name))
 			continue;
 
 		buf.pos = 0;
diff -Nru a/security/selinux/hooks.c b/security/selinux/hooks.c
--- a/security/selinux/hooks.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/hooks.c	Thu Jan  8 23:00:24 2004
@@ -1515,7 +1515,8 @@
 	struct bprm_security_struct *bsec;
 	u32 sid;
 	struct av_decision avd;
-	int rc;
+	struct itimerval itimer;
+	int rc, i;
 
 	secondary_ops->bprm_compute_creds(bprm);
 
@@ -1565,6 +1566,26 @@
 		/* Close files for which the new task SID is not authorized. */
 		flush_unauthorized_files(current->files);
 
+		/* Check whether the new SID can inherit signal state
+		   from the old SID.  If not, clear itimers to avoid
+		   subsequent signal generation and flush and unblock
+		   signals. This must occur _after_ the task SID has
+                  been updated so that any kill done after the flush
+                  will be checked against the new SID. */
+		rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
+				  PROCESS__SIGINH, NULL, NULL);
+		if (rc) {
+			memset(&itimer, 0, sizeof itimer);
+			for (i = 0; i < 3; i++)
+				do_setitimer(i, &itimer, NULL);
+			flush_signals(current);
+			spin_lock_irq(&current->sighand->siglock);
+			flush_signal_handlers(current, 1);
+			sigemptyset(&current->blocked);
+			recalc_sigpending();
+			spin_unlock_irq(&current->sighand->siglock);
+		}
+
 		/* Wake up the parent if it is waiting so that it can
 		   recheck wait permission to the new task SID. */
 		wake_up_interruptible(&current->parent->wait_chldexit);
@@ -1738,10 +1759,6 @@
 		return 0;
 	}
 
-	if (nd && nd->dentry)
-		return dentry_has_perm(current, nd->mnt, nd->dentry,
-				       file_mask_to_av(inode->i_mode, mask));
-
 	return inode_has_perm(current, inode,
 			       file_mask_to_av(inode->i_mode, mask), NULL, NULL);
 }
@@ -1992,8 +2009,7 @@
 
 	        case KDSKBENT:
 	        case KDSKBSENT:
-		  	if (!capable(CAP_SYS_TTY_CONFIG))
-				error = -EPERM;
+			error = task_has_capability(current,CAP_SYS_TTY_CONFIG);
 			break;
 
 		/* default case assumes that the command will go
diff -Nru a/security/selinux/include/av_perm_to_string.h b/security/selinux/include/av_perm_to_string.h
--- a/security/selinux/include/av_perm_to_string.h	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/include/av_perm_to_string.h	Thu Jan  8 23:00:24 2004
@@ -66,6 +66,7 @@
    { SECCLASS_PROCESS, PROCESS__SETEXEC, "setexec" },
    { SECCLASS_PROCESS, PROCESS__SETFSCREATE, "setfscreate" },
    { SECCLASS_PROCESS, PROCESS__NOATSECURE, "noatsecure" },
+   { SECCLASS_PROCESS, PROCESS__SIGINH, "siginh" },
    { SECCLASS_MSGQ, MSGQ__ENQUEUE, "enqueue" },
    { SECCLASS_MSG, MSG__SEND, "send" },
    { SECCLASS_MSG, MSG__RECEIVE, "receive" },
diff -Nru a/security/selinux/include/av_permissions.h b/security/selinux/include/av_permissions.h
--- a/security/selinux/include/av_permissions.h	Thu Jan  8 23:00:23 2004
+++ b/security/selinux/include/av_permissions.h	Thu Jan  8 23:00:23 2004
@@ -450,6 +450,7 @@
 #define PROCESS__SETEXEC                          0x00020000UL
 #define PROCESS__SETFSCREATE                      0x00040000UL
 #define PROCESS__NOATSECURE                       0x00080000UL
+#define PROCESS__SIGINH                           0x00100000UL
 
 #define IPC__SETATTR                              0x00000008UL
 #define IPC__READ                                 0x00000010UL
diff -Nru a/security/selinux/ss/Makefile b/security/selinux/ss/Makefile
--- a/security/selinux/ss/Makefile	Thu Jan  8 23:00:23 2004
+++ b/security/selinux/ss/Makefile	Thu Jan  8 23:00:23 2004
@@ -2,8 +2,7 @@
 # Makefile for building the SELinux security server as part of the kernel tree.
 #
 
-EXTRA_CFLAGS += -Isecurity/selinux/include -include security/selinux/ss/global.h
-
+EXTRA_CFLAGS += -Isecurity/selinux/include
 obj-y := ss.o
 
 ss-objs := ebitmap.o hashtab.o symtab.o sidtab.o avtab.o policydb.o services.o
diff -Nru a/security/selinux/ss/avtab.c b/security/selinux/ss/avtab.c
--- a/security/selinux/ss/avtab.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/avtab.c	Thu Jan  8 23:00:24 2004
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/errno.h>
 #include "avtab.h"
 #include "policydb.h"
 
diff -Nru a/security/selinux/ss/ebitmap.c b/security/selinux/ss/ebitmap.c
--- a/security/selinux/ss/ebitmap.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/ebitmap.c	Thu Jan  8 23:00:24 2004
@@ -3,6 +3,9 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
 #include "ebitmap.h"
 #include "policydb.h"
 
diff -Nru a/security/selinux/ss/global.h b/security/selinux/ss/global.h
--- a/security/selinux/ss/global.h	Thu Jan  8 23:00:24 2004
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,18 +0,0 @@
-#ifndef _SS_GLOBAL_H_
-#define _SS_GLOBAL_H_
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/ctype.h>
-#include <linux/in.h>
-#include <linux/spinlock.h>
-#include <linux/sched.h>
-#include <linux/vmalloc.h>
-
-#include "flask.h"
-#include "avc.h"
-#include "avc_ss.h"
-#include "security.h"
-
-#endif /* _SS_GLOBAL_H_ */
diff -Nru a/security/selinux/ss/hashtab.c b/security/selinux/ss/hashtab.c
--- a/security/selinux/ss/hashtab.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/hashtab.c	Thu Jan  8 23:00:24 2004
@@ -3,6 +3,9 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/errno.h>
 #include "hashtab.h"
 
 struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
diff -Nru a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c
--- a/security/selinux/ss/mls.c	Thu Jan  8 23:00:23 2004
+++ b/security/selinux/ss/mls.c	Thu Jan  8 23:00:23 2004
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
 #include "mls.h"
 #include "policydb.h"
 #include "services.h"
diff -Nru a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
--- a/security/selinux/ss/policydb.c	Thu Jan  8 23:00:23 2004
+++ b/security/selinux/ss/policydb.c	Thu Jan  8 23:00:23 2004
@@ -3,6 +3,11 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include "security.h"
 #include "policydb.h"
 #include "mls.h"
 
diff -Nru a/security/selinux/ss/services.c b/security/selinux/ss/services.c
--- a/security/selinux/ss/services.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/services.c	Thu Jan  8 23:00:24 2004
@@ -10,6 +10,17 @@
  *	it under the terms of the GNU General Public License version 2,
  *      as published by the Free Software Foundation.
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include <linux/in.h>
+#include <asm/semaphore.h>
+#include "flask.h"
+#include "avc.h"
+#include "avc_ss.h"
+#include "security.h"
 #include "context.h"
 #include "policydb.h"
 #include "sidtab.h"
diff -Nru a/security/selinux/ss/sidtab.c b/security/selinux/ss/sidtab.c
--- a/security/selinux/ss/sidtab.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/sidtab.c	Thu Jan  8 23:00:24 2004
@@ -3,6 +3,12 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include "flask.h"
+#include "security.h"
 #include "sidtab.h"
 
 #define SIDTAB_HASH(sid) \
diff -Nru a/security/selinux/ss/symtab.c b/security/selinux/ss/symtab.c
--- a/security/selinux/ss/symtab.c	Thu Jan  8 23:00:24 2004
+++ b/security/selinux/ss/symtab.c	Thu Jan  8 23:00:24 2004
@@ -3,6 +3,10 @@
  *
  * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
 #include "symtab.h"
 
 static unsigned int symhash(struct hashtab *h, void *key)
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c	Thu Jan  8 23:00:23 2004
+++ b/sound/core/pcm_native.c	Thu Jan  8 23:00:23 2004
@@ -2779,7 +2779,7 @@
 	return mask;
 }
 
-static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2791,6 +2791,8 @@
 	page = virt_to_page(runtime->status);
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -2817,7 +2819,7 @@
 	return 0;
 }
 
-static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2829,6 +2831,8 @@
 	page = virt_to_page(runtime->control);
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
@@ -2867,7 +2871,7 @@
 	atomic_dec(&substream->runtime->mmap_count);
 }
 
-static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
+static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int *type)
 {
 	snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
 	snd_pcm_runtime_t *runtime;
@@ -2895,6 +2899,8 @@
 	}
 	if (!PageReserved(page))
 		get_page(page);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return page;
 }
 
diff -Nru a/sound/core/sound.c b/sound/core/sound.c
--- a/sound/core/sound.c	Thu Jan  8 23:00:24 2004
+++ b/sound/core/sound.c	Thu Jan  8 23:00:24 2004
@@ -31,6 +31,7 @@
 #include <sound/initval.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #define SNDRV_OS_MINORS 256
 
@@ -52,6 +53,7 @@
 MODULE_PARM(cards_limit, "i");
 MODULE_PARM_DESC(cards_limit, "Count of soundcards installed in the system.");
 MODULE_PARM_SYNTAX(cards_limit, "default:8,skill:advanced");
+MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
 #ifdef CONFIG_DEVFS_FS
 MODULE_PARM(device_mode, "i");
 MODULE_PARM_DESC(device_mode, "Device file permission mask for devfs.");
diff -Nru a/sound/oss/Kconfig b/sound/oss/Kconfig
--- a/sound/oss/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/Kconfig	Thu Jan  8 23:00:24 2004
@@ -25,7 +25,7 @@
 	depends on SOUND_PRIME!=n && SOUND && PCI
 	help
 	  Say Y or M if you have a PCI sound card using the CMI8338
-	  or the CMI8378 chipset.  Data on these chips are available at
+	  or the CMI8738 chipset.  Data on these chips are available at
 	  <http://www.cmedia.com.tw/>.
 
 	  A userspace utility to control some internal registers of these
@@ -195,7 +195,7 @@
 	  Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
 	  models are either ES1370 or ES1371 based. This driver differs
 	  slightly from OSS/Free, so PLEASE READ
-	  <file:Documentation/sound/es1371>.
+	  <file:Documentation/sound/oss/es1371>.
 
 config SOUND_ESSSOLO1
 	tristate "ESS Technology Solo1"
diff -Nru a/sound/oss/au1000.c b/sound/oss/au1000.c
--- a/sound/oss/au1000.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/au1000.c	Thu Jan  8 23:00:24 2004
@@ -2177,7 +2177,7 @@
 	return -1;
 }
 
-static void __devinit au1000_remove(void)
+static void au1000_remove(void)
 {
 	struct au1000_state *s = &au1000_state;
 
diff -Nru a/sound/oss/cmpci.c b/sound/oss/cmpci.c
--- a/sound/oss/cmpci.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/cmpci.c	Thu Jan  8 23:00:24 2004
@@ -2876,7 +2876,6 @@
 void initialize_chip(struct pci_dev *pcidev)
 {
 	struct cm_state *s;
-	mm_segment_t fs;
 	int i, val;
 #if defined(CONFIG_SOUND_CMPCI_MIDI) || defined(CONFIG_SOUND_CMPCI_FM)
 	unsigned char reg_mask = 0;
@@ -3038,8 +3037,6 @@
 #endif
 		pci_set_master(pcidev);	/* enable bus mastering */
 		/* initialize the chips */
-		fs = get_fs();
-		set_fs(KERNEL_DS);
 		/* set mixer output */
 		frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f);
 		/* set mixer input */
diff -Nru a/sound/oss/cs4281/cs4281m.c b/sound/oss/cs4281/cs4281m.c
--- a/sound/oss/cs4281/cs4281m.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/cs4281/cs4281m.c	Thu Jan  8 23:00:24 2004
@@ -4435,7 +4435,7 @@
 
 // --------------------------------------------------------------------- 
 
-static void __devinit cs4281_remove(struct pci_dev *pci_dev)
+static void __devexit cs4281_remove(struct pci_dev *pci_dev)
 {
 	struct cs4281_state *s = pci_get_drvdata(pci_dev);
 	// stop DMA controller 
@@ -4469,7 +4469,7 @@
 	.name	  = "cs4281",
 	.id_table = cs4281_pci_tbl,
 	.probe	  = cs4281_probe,
-	.remove	  = cs4281_remove,
+	.remove	  = __devexit_p(cs4281_remove),
 	.suspend  = CS4281_SUSPEND_TBL,
 	.resume	  = CS4281_RESUME_TBL,
 };
diff -Nru a/sound/oss/cs46xx.c b/sound/oss/cs46xx.c
--- a/sound/oss/cs46xx.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/cs46xx.c	Thu Jan  8 23:00:23 2004
@@ -5603,7 +5603,7 @@
 
 // --------------------------------------------------------------------- 
 
-static void __devinit cs46xx_remove(struct pci_dev *pci_dev)
+static void __devexit cs46xx_remove(struct pci_dev *pci_dev)
 {
 	struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
 	int i;
@@ -5730,7 +5730,7 @@
 	.name	  = "cs46xx",
 	.id_table = cs46xx_pci_tbl,
 	.probe	  = cs46xx_probe,
-	.remove	  = cs46xx_remove,
+	.remove	  = __devexit_p(cs46xx_remove),
 	.suspend  = CS46XX_SUSPEND_TBL,
 	.resume	  = CS46XX_RESUME_TBL,
 };
diff -Nru a/sound/oss/dmasound/Kconfig b/sound/oss/dmasound/Kconfig
--- a/sound/oss/dmasound/Kconfig	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/dmasound/Kconfig	Thu Jan  8 23:00:24 2004
@@ -10,7 +10,7 @@
 	  This driver is also available as a module ( = code which can be
 	  inserted in and removed from the running kernel whenever you
 	  want). If you want to compile it as a module, say M here and read
-	  <file:Documentation/modules.txt>.
+	  <file:Documentation/kbuild/modules.txt>.
 
 config DMASOUND_PMAC
 	tristate "PowerMac DMA sound support"
@@ -24,7 +24,7 @@
 	  This driver is also available as a module ( = code which can be
 	  inserted in and removed from the running kernel whenever you
 	  want). If you want to compile it as a module, say M here and read
-	  <file:Documentation/modules.txt>.
+	  <file:Documentation/kbuild/modules.txt>.
 
 config DMASOUND_PAULA
 	tristate "Amiga DMA sound support"
@@ -38,7 +38,7 @@
 	  This driver is also available as a module ( = code which can be
 	  inserted in and removed from the running kernel whenever you
 	  want). If you want to compile it as a module, say M here and read
-	  <file:Documentation/modules.txt>.
+	  <file:Documentation/kbuild/modules.txt>.
 
 config DMASOUND_Q40
 	tristate "Q40 sound support"
@@ -52,7 +52,7 @@
 	  This driver is also available as a module ( = code which can be
 	  inserted in and removed from the running kernel whenever you
 	  want). If you want to compile it as a module, say M here and read
-	  <file:Documentation/modules.txt>.
+	  <file:Documentation/kbuild/modules.txt>.
 
 config DMASOUND
 	tristate
diff -Nru a/sound/oss/emu10k1/audio.c b/sound/oss/emu10k1/audio.c
--- a/sound/oss/emu10k1/audio.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/emu10k1/audio.c	Thu Jan  8 23:00:23 2004
@@ -989,7 +989,7 @@
 	return 0;
 }
 
-static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int write_access)
+static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
 {
 	struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
 	struct woinst *woinst = wave_dev->woinst;
@@ -1032,6 +1032,8 @@
 	get_page (dmapage);
 
 	DPD(3, "page: %#lx\n", (unsigned long) dmapage);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return dmapage;
 }
 
diff -Nru a/sound/oss/es1370.c b/sound/oss/es1370.c
--- a/sound/oss/es1370.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/es1370.c	Thu Jan  8 23:00:24 2004
@@ -2700,7 +2700,7 @@
 	return ret;
 }
 
-static void __devinit es1370_remove(struct pci_dev *dev)
+static void __devexit es1370_remove(struct pci_dev *dev)
 {
 	struct es1370_state *s = pci_get_drvdata(dev);
 
@@ -2736,7 +2736,7 @@
 	.name		= "es1370",
 	.id_table	= id_table,
 	.probe		= es1370_probe,
-	.remove		= es1370_remove,
+	.remove		= __devexit_p(es1370_remove),
 };
 
 static int __init init_es1370(void)
diff -Nru a/sound/oss/es1371.c b/sound/oss/es1371.c
--- a/sound/oss/es1371.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/es1371.c	Thu Jan  8 23:00:24 2004
@@ -3001,7 +3001,7 @@
 	return res;
 }
 
-static void __devinit es1371_remove(struct pci_dev *dev)
+static void __devexit es1371_remove(struct pci_dev *dev)
 {
 	struct es1371_state *s = pci_get_drvdata(dev);
 
@@ -3043,7 +3043,7 @@
 	.name		= "es1371",
 	.id_table	= id_table,
 	.probe		= es1371_probe,
-	.remove		= es1371_remove,
+	.remove		= __devexit_p(es1371_remove),
 };
 
 static int __init init_es1371(void)
diff -Nru a/sound/oss/esssolo1.c b/sound/oss/esssolo1.c
--- a/sound/oss/esssolo1.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/esssolo1.c	Thu Jan  8 23:00:23 2004
@@ -2407,7 +2407,7 @@
 	return ret;
 }
 
-static void __devinit solo1_remove(struct pci_dev *dev)
+static void __devexit solo1_remove(struct pci_dev *dev)
 {
 	struct solo1_state *s = pci_get_drvdata(dev);
 	
@@ -2447,7 +2447,7 @@
 	.name		= "ESS Solo1",
 	.id_table	= id_table,
 	.probe		= solo1_probe,
-	.remove		= solo1_remove,
+	.remove		= __devexit_p(solo1_remove),
 	.suspend	= solo1_suspend,
 	.resume		= solo1_resume,
 };
diff -Nru a/sound/oss/ite8172.c b/sound/oss/ite8172.c
--- a/sound/oss/ite8172.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/ite8172.c	Thu Jan  8 23:00:23 2004
@@ -2165,7 +2165,7 @@
 	return -1;
 }
 
-static void __devinit it8172_remove(struct pci_dev *dev)
+static void __devexit it8172_remove(struct pci_dev *dev)
 {
 	struct it8172_state *s = pci_get_drvdata(dev);
 
@@ -2200,7 +2200,7 @@
 	.name = IT8172_MODULE_NAME,
 	.id_table = id_table,
 	.probe = it8172_probe,
-	.remove = it8172_remove
+	.remove = __devexit_p(it8172_remove)
 };
 
 static int __init init_it8172(void)
diff -Nru a/sound/oss/nec_vrc5477.c b/sound/oss/nec_vrc5477.c
--- a/sound/oss/nec_vrc5477.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/nec_vrc5477.c	Thu Jan  8 23:00:24 2004
@@ -1964,7 +1964,7 @@
 	return -1;
 }
 
-static void __devinit vrc5477_ac97_remove(struct pci_dev *dev)
+static void __devexit vrc5477_ac97_remove(struct pci_dev *dev)
 {
 	struct vrc5477_ac97_state *s = pci_get_drvdata(dev);
 
@@ -2000,7 +2000,7 @@
 	.name		= VRC5477_AC97_MODULE_NAME,
 	.id_table	= id_table,
 	.probe		= vrc5477_ac97_probe,
-	.remove		= vrc5477_ac97_remove,
+	.remove		= __devexit_p(vrc5477_ac97_remove),
 };
 
 static int __init init_vrc5477_ac97(void)
diff -Nru a/sound/oss/rme96xx.c b/sound/oss/rme96xx.c
--- a/sound/oss/rme96xx.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/rme96xx.c	Thu Jan  8 23:00:23 2004
@@ -1033,7 +1033,7 @@
 }
 
 
-static void __devinit rme96xx_remove(struct pci_dev *dev)
+static void __devexit rme96xx_remove(struct pci_dev *dev)
 {
 	int i;
 	rme96xx_info *s = pci_get_drvdata(dev);
@@ -1087,7 +1087,7 @@
 	.name	  =  "rme96xx",
 	.id_table = id_table,
 	.probe	  = rme96xx_probe,
-	.remove	  = rme96xx_remove,
+	.remove	  = __devexit_p(rme96xx_remove),
 };
 
 static int __init init_rme96xx(void)
diff -Nru a/sound/oss/sonicvibes.c b/sound/oss/sonicvibes.c
--- a/sound/oss/sonicvibes.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/sonicvibes.c	Thu Jan  8 23:00:24 2004
@@ -2678,7 +2678,7 @@
 	return ret;
 }
 
-static void __devinit sv_remove(struct pci_dev *dev)
+static void __devexit sv_remove(struct pci_dev *dev)
 {
 	struct sv_state *s = pci_get_drvdata(dev);
 
@@ -2720,7 +2720,7 @@
        .name		= "sonicvibes",
        .id_table	= id_table,
        .probe		= sv_probe,
-       .remove		= sv_remove,
+       .remove		= __devexit_p(sv_remove),
 };
  
 static int __init init_sonicvibes(void)
diff -Nru a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c
--- a/sound/oss/via82cxxx_audio.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/via82cxxx_audio.c	Thu Jan  8 23:00:23 2004
@@ -15,7 +15,7 @@
  */
 
 
-#define VIA_VERSION	"1.9.1-ac3-2.5"
+#define VIA_VERSION	"1.9.1-ac4-2.5"
 
 
 #include <linux/config.h>
@@ -1237,7 +1237,6 @@
 		}
 	/* unknown */
 	default:
-		printk (KERN_WARNING PFX "unknown number of channels\n");
 		val = -EINVAL;
 		break;
 	}
@@ -2116,7 +2115,7 @@
 
 
 static struct page * via_mm_nopage (struct vm_area_struct * vma,
-				    unsigned long address, int write_access)
+				    unsigned long address, int *type)
 {
 	struct via_info *card = vma->vm_private_data;
 	struct via_channel *chan = &card->ch_out;
@@ -2124,12 +2123,11 @@
 	unsigned long pgoff;
 	int rd, wr;
 
-	DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh, wr %d\n",
+	DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
 		 vma->vm_start,
 		 address - vma->vm_start,
 		 (address - vma->vm_start) >> PAGE_SHIFT,
-		 address,
-		 write_access);
+		 address);
 
         if (address > vma->vm_end) {
 		DPRINTK ("EXIT, returning NOPAGE_SIGBUS\n");
@@ -2167,6 +2165,8 @@
 	DPRINTK ("EXIT, returning page %p for cpuaddr %lXh\n",
 		 dmapage, (unsigned long) chan->pgtbl[pgoff].cpuaddr);
 	get_page (dmapage);
+	if (type)
+		*type = VM_FAULT_MINOR;
 	return dmapage;
 }
 
@@ -3367,7 +3367,7 @@
 
 	if (file->f_mode & FMODE_WRITE) {
 		rc = via_dsp_drain_playback (card, &card->ch_out, nonblock);
-		if (rc && rc != ERESTARTSYS)	/* Nobody needs to know about ^C */
+		if (rc && rc != -ERESTARTSYS)	/* Nobody needs to know about ^C */
 			printk (KERN_DEBUG "via_audio: ignoring drain playback error %d\n", rc);
 
 		via_chan_free (card, &card->ch_out);
diff -Nru a/sound/oss/vidc.c b/sound/oss/vidc.c
--- a/sound/oss/vidc.c	Thu Jan  8 23:00:23 2004
+++ b/sound/oss/vidc.c	Thu Jan  8 23:00:23 2004
@@ -41,6 +41,7 @@
 #endif
 
 #define VIDC_SOUND_CLOCK	(250000)
+#define VIDC_SOUND_CLOCK_EXT	(176400)
 
 /*
  * When using SERIAL SOUND mode (external DAC), the number of physical
@@ -81,18 +82,10 @@
 static unsigned int	vidc_audio_volume_l;	/* left PCM vol, 0 - 65536 */
 static unsigned int	vidc_audio_volume_r;	/* right PCM vol, 0 - 65536 */
 
-static void	(*old_mksound)(unsigned int hz, unsigned int ticks);
-extern void	(*kd_mksound)(unsigned int hz, unsigned int ticks);
 extern void	vidc_update_filler(int bits, int channels);
 extern int	softoss_dev;
 
 static void
-vidc_mksound(unsigned int hz, unsigned int ticks)
-{
-//	printk("BEEP - %d %d!\n", hz, ticks);
-}
-
-static void
 vidc_mixer_set(int mdev, unsigned int level)
 {
 	unsigned int lev_l = level & 0x007f;
@@ -193,28 +186,50 @@
 	return vidc_audio_format;
 }
 
+#define my_abs(i) ((i)<0 ? -(i) : (i))
+
 static int vidc_audio_set_speed(int dev, int rate)
 {
 	if (rate) {
-		unsigned int hwctrl, hwrate;
+		unsigned int hwctrl, hwrate, hwrate_ext, rate_int, rate_ext;
+		unsigned int diff_int, diff_ext;
 		unsigned int newsize, new2size;
 
-		/*
-		 * If we have selected 44.1kHz, use the DAC clock.
-		 */
-		if (0 && rate == 44100) {
-			hwctrl = 0x00000002;
-			hwrate = 3;
-		} else {
-			hwctrl = 0x00000003;
+		hwctrl = 0x00000003;
 
-			hwrate = (((VIDC_SOUND_CLOCK * 2) / rate) + 1) >> 1;
-			if (hwrate < 3)
-				hwrate = 3;
-			if (hwrate > 255)
-				hwrate = 255;
+		/* Using internal clock */
+		hwrate = (((VIDC_SOUND_CLOCK * 2) / rate) + 1) >> 1;
+		if (hwrate < 3)
+			hwrate = 3;
+		if (hwrate > 255)
+			hwrate = 255;
 
-			rate = VIDC_SOUND_CLOCK / hwrate;
+		/* Using exernal clock */
+		hwrate_ext = (((VIDC_SOUND_CLOCK_EXT * 2) / rate) + 1) >> 1;
+		if (hwrate_ext < 3)
+			hwrate_ext = 3;
+		if (hwrate_ext > 255)
+			hwrate_ext = 255;
+
+		rate_int = VIDC_SOUND_CLOCK / hwrate;
+		rate_ext = VIDC_SOUND_CLOCK_EXT / hwrate_ext;
+
+		/* Chose between external and internal clock */
+		diff_int = my_abs(rate_ext-rate);
+		diff_ext = my_abs(rate_int-rate);
+		if (diff_ext < diff_int) {
+			/*printk("VIDC: external %d %d %d\n", rate, rate_ext, hwrate_ext);*/
+			hwrate=hwrate_ext;
+			hwctrl=0x00000002;
+			/* Allow roughly 0.4% tolerance */
+			if (diff_ext > (rate/256))
+				rate=rate_ext;
+		} else {
+			/*printk("VIDC: internal %d %d %d\n", rate, rate_int, hwrate);*/
+			hwctrl=0x00000003;
+			/* Allow rougly 0.4% tolerance */
+			if (diff_int > (rate/256))
+				rate=rate_int;
 		}
 
 		vidc_writel(0xb0000000 | (hwrate - 2));
@@ -226,13 +241,14 @@
 		if (newsize > 4096)
 			newsize = 4096;
 		for (new2size = 128; new2size < newsize; new2size <<= 1);
-			if (new2size - newsize > newsize - (new2size >> 1))
-				new2size >>= 1;
+		if (new2size - newsize > newsize - (new2size >> 1))
+			new2size >>= 1;
 		if (new2size > 4096) {
 			printk(KERN_ERR "VIDC: error: dma buffer (%d) %d > 4K\n",
 				newsize, new2size);
 			new2size = 4096;
 		}
+		/*printk("VIDC: dma size %d\n", new2size);*/
 		dma_bufsize = new2size;
 		vidc_audio_rate = rate;
 	}
@@ -471,8 +487,6 @@
 		printk(KERN_ERR "%s: IRQ %d is in use\n", name, hw_config->irq);
 		goto irq_failed;
 	}
-	old_mksound = kd_mksound;
-	kd_mksound = vidc_mksound;
 	vidc_adev = adev;
 	vidc_mixer_set(SOUND_MIXER_VOLUME, (85 | 85 << 8));
 
@@ -509,9 +523,6 @@
 	int i, adev = vidc_adev;
 
 	vidc_adev = -1;
-
-	if (old_mksound)
-		kd_mksound = old_mksound;
 
 	free_irq(hw_config->irq, &dma_start);
 	sound_free_dma(hw_config->dma);
diff -Nru a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c
--- a/sound/oss/vwsnd.c	Thu Jan  8 23:00:24 2004
+++ b/sound/oss/vwsnd.c	Thu Jan  8 23:00:24 2004
@@ -1,6 +1,6 @@
 /*
  * Sound driver for Silicon Graphics 320 and 540 Visual Workstations'
- * onboard audio.  See notes in ../../Documentation/sound/vwsnd .
+ * onboard audio.  See notes in ../../Documentation/sound/oss/vwsnd .
  *
  * Copyright 1999 Silicon Graphics, Inc.  All rights reserved.
  *
diff -Nru a/sound/sound_core.c b/sound/sound_core.c
--- a/sound/sound_core.c	Thu Jan  8 23:00:24 2004
+++ b/sound/sound_core.c	Thu Jan  8 23:00:24 2004
@@ -45,6 +45,7 @@
 #include <linux/major.h>
 #include <linux/kmod.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #define SOUND_STEP 16
 
@@ -547,6 +548,7 @@
 MODULE_DESCRIPTION("Core sound module");
 MODULE_AUTHOR("Alan Cox");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_CHARDEV_MAJOR(SOUND_MAJOR);
 
 static void __exit cleanup_soundcore(void)
 {
diff -Nru a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
--- a/sound/usb/usbaudio.h	Thu Jan  8 23:00:24 2004
+++ b/sound/usb/usbaudio.h	Thu Jan  8 23:00:24 2004
@@ -30,12 +30,6 @@
 #define USB_SUBCLASS_MIDI_STREAMING	0x03
 #define USB_SUBCLASS_VENDOR_SPEC	0xff
 
-#define USB_DT_CS_DEVICE                0x21
-#define USB_DT_CS_CONFIG                0x22
-#define USB_DT_CS_STRING                0x23
-#define USB_DT_CS_INTERFACE             0x24
-#define USB_DT_CS_ENDPOINT              0x25
-
 #define CS_AUDIO_UNDEFINED		0x20
 #define CS_AUDIO_DEVICE			0x21
 #define CS_AUDIO_CONFIGURATION		0x22
diff -Nru a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c
--- a/usr/gen_init_cpio.c	Thu Jan  8 23:00:24 2004
+++ b/usr/gen_init_cpio.c	Thu Jan  8 23:00:24 2004
@@ -197,6 +197,7 @@
 
 	for (i = 0; i < buf.st_size; ++i)
 		fputc(filebuf[i], stdout);
+	offset += buf.st_size;
 	close(file);
 	free(filebuf);
 	push_pad();
